forked from luck/tmp_suning_uos_patched
l2tp: simplify pppol2tp_ioctl()
* Drop test on 'sk': sock->sk cannot be NULL, or pppox_ioctl() could not have called us. * Drop test on 'SOCK_DEAD' state: if this flag was set, the socket would be in the process of being released and no ioctl could be running anymore. * Drop test on 'PPPOX_*' state: we depend on ->sk_user_data to get the session structure. If it is non-NULL, then the socket is connected. Testing for PPPOX_* is redundant. * Retrieve session using ->sk_user_data directly, instead of going through pppol2tp_sock_to_session(). This avoids grabbing a useless reference on the socket. Signed-off-by: Guillaume Nault <g.nault@alphalink.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
01e28b921b
commit
bdd0292f96
|
@ -1179,28 +1179,12 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel,
|
|||
static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct l2tp_session *session;
|
||||
struct l2tp_tunnel *tunnel;
|
||||
int err;
|
||||
|
||||
if (!sk)
|
||||
return 0;
|
||||
|
||||
err = -EBADF;
|
||||
if (sock_flag(sk, SOCK_DEAD) != 0)
|
||||
goto end;
|
||||
|
||||
err = -ENOTCONN;
|
||||
if ((sk->sk_user_data == NULL) ||
|
||||
(!(sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND))))
|
||||
goto end;
|
||||
|
||||
/* Get session context from the socket */
|
||||
err = -EBADF;
|
||||
session = pppol2tp_sock_to_session(sk);
|
||||
if (session == NULL)
|
||||
goto end;
|
||||
session = sock->sk->sk_user_data;
|
||||
if (!session)
|
||||
return -ENOTCONN;
|
||||
|
||||
/* Special case: if session's session_id is zero, treat ioctl as a
|
||||
* tunnel ioctl
|
||||
|
@ -1208,16 +1192,11 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd,
|
|||
if ((session->session_id == 0) &&
|
||||
(session->peer_session_id == 0)) {
|
||||
tunnel = session->tunnel;
|
||||
err = pppol2tp_tunnel_ioctl(tunnel, cmd, arg);
|
||||
goto end_put_sess;
|
||||
|
||||
return pppol2tp_tunnel_ioctl(tunnel, cmd, arg);
|
||||
}
|
||||
|
||||
err = pppol2tp_session_ioctl(session, cmd, arg);
|
||||
|
||||
end_put_sess:
|
||||
sock_put(sk);
|
||||
end:
|
||||
return err;
|
||||
return pppol2tp_session_ioctl(session, cmd, arg);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
Loading…
Reference in New Issue
Block a user