|
@@ -199,14 +199,15 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
|
|
|
|
|
|
BT_DBG("parent %p", parent);
|
|
|
|
|
|
+ local_bh_disable();
|
|
|
list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
|
|
|
sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
|
|
|
|
|
|
- lock_sock(sk);
|
|
|
+ bh_lock_sock(sk);
|
|
|
|
|
|
/* FIXME: Is this check still needed */
|
|
|
if (sk->sk_state == BT_CLOSED) {
|
|
|
- release_sock(sk);
|
|
|
+ bh_unlock_sock(sk);
|
|
|
bt_accept_unlink(sk);
|
|
|
continue;
|
|
|
}
|
|
@@ -216,12 +217,16 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
|
|
|
bt_accept_unlink(sk);
|
|
|
if (newsock)
|
|
|
sock_graft(sk, newsock);
|
|
|
- release_sock(sk);
|
|
|
+
|
|
|
+ bh_unlock_sock(sk);
|
|
|
+ local_bh_enable();
|
|
|
return sk;
|
|
|
}
|
|
|
|
|
|
- release_sock(sk);
|
|
|
+ bh_unlock_sock(sk);
|
|
|
}
|
|
|
+ local_bh_enable();
|
|
|
+
|
|
|
return NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL(bt_accept_dequeue);
|