|
@@ -189,7 +189,6 @@ static int llc_ui_release(struct socket *sock)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
struct llc_sock *llc;
|
|
|
- struct llc_sap *sap;
|
|
|
|
|
|
if (unlikely(sk == NULL))
|
|
|
goto out;
|
|
@@ -200,15 +199,19 @@ static int llc_ui_release(struct socket *sock)
|
|
|
llc->laddr.lsap, llc->daddr.lsap);
|
|
|
if (!llc_send_disc(sk))
|
|
|
llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
|
|
|
- sap = llc->sap;
|
|
|
- /* Hold this for release_sock(), so that llc_backlog_rcv() could still
|
|
|
- * use it.
|
|
|
- */
|
|
|
- llc_sap_hold(sap);
|
|
|
- if (!sock_flag(sk, SOCK_ZAPPED))
|
|
|
+ if (!sock_flag(sk, SOCK_ZAPPED)) {
|
|
|
+ struct llc_sap *sap = llc->sap;
|
|
|
+
|
|
|
+ /* Hold this for release_sock(), so that llc_backlog_rcv()
|
|
|
+ * could still use it.
|
|
|
+ */
|
|
|
+ llc_sap_hold(sap);
|
|
|
llc_sap_remove_socket(llc->sap, sk);
|
|
|
- release_sock(sk);
|
|
|
- llc_sap_put(sap);
|
|
|
+ release_sock(sk);
|
|
|
+ llc_sap_put(sap);
|
|
|
+ } else {
|
|
|
+ release_sock(sk);
|
|
|
+ }
|
|
|
if (llc->dev)
|
|
|
dev_put(llc->dev);
|
|
|
sock_put(sk);
|