diff options
Diffstat (limited to 'net/bluetooth/af_bluetooth.c')
-rw-r--r-- | net/bluetooth/af_bluetooth.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index a6732b576a52..2abfe2f30453 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -199,14 +199,15 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock) | |||
199 | 199 | ||
200 | BT_DBG("parent %p", parent); | 200 | BT_DBG("parent %p", parent); |
201 | 201 | ||
202 | local_bh_disable(); | ||
202 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { | 203 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { |
203 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); | 204 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); |
204 | 205 | ||
205 | lock_sock(sk); | 206 | bh_lock_sock(sk); |
206 | 207 | ||
207 | /* FIXME: Is this check still needed */ | 208 | /* FIXME: Is this check still needed */ |
208 | if (sk->sk_state == BT_CLOSED) { | 209 | if (sk->sk_state == BT_CLOSED) { |
209 | release_sock(sk); | 210 | bh_unlock_sock(sk); |
210 | bt_accept_unlink(sk); | 211 | bt_accept_unlink(sk); |
211 | continue; | 212 | continue; |
212 | } | 213 | } |
@@ -216,12 +217,16 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock) | |||
216 | bt_accept_unlink(sk); | 217 | bt_accept_unlink(sk); |
217 | if (newsock) | 218 | if (newsock) |
218 | sock_graft(sk, newsock); | 219 | sock_graft(sk, newsock); |
219 | release_sock(sk); | 220 | |
221 | bh_unlock_sock(sk); | ||
222 | local_bh_enable(); | ||
220 | return sk; | 223 | return sk; |
221 | } | 224 | } |
222 | 225 | ||
223 | release_sock(sk); | 226 | bh_unlock_sock(sk); |
224 | } | 227 | } |
228 | local_bh_enable(); | ||
229 | |||
225 | return NULL; | 230 | return NULL; |
226 | } | 231 | } |
227 | EXPORT_SYMBOL(bt_accept_dequeue); | 232 | EXPORT_SYMBOL(bt_accept_dequeue); |