diff options
author | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-11-20 20:25:54 -0500 |
---|---|---|
committer | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-12-03 12:59:10 -0500 |
commit | dc2a0e20fbc85a71c63aa4330b496fda33f6bf80 (patch) | |
tree | d4319c396be9da260ea363105b76d2548696bd8f /net/bluetooth/rfcomm/sock.c | |
parent | 2b2fec4d08a0aabe20d2e749cb7978f04217af65 (diff) |
Bluetooth: Add missing lock nesting notation
This patch fixes the following report, it happens when accepting rfcomm
connections:
[ 228.165378] =============================================
[ 228.165378] [ INFO: possible recursive locking detected ]
[ 228.165378] 3.7.0-rc1-00536-gc1d5dc4 #120 Tainted: G W
[ 228.165378] ---------------------------------------------
[ 228.165378] bluetoothd/1341 is trying to acquire lock:
[ 228.165378] (sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM){+.+...}, at:
[<ffffffffa0000aa0>] bt_accept_dequeue+0xa0/0x180 [bluetooth]
[ 228.165378]
[ 228.165378] but task is already holding lock:
[ 228.165378] (sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM){+.+...}, at:
[<ffffffffa0205118>] rfcomm_sock_accept+0x58/0x2d0 [rfcomm]
[ 228.165378]
[ 228.165378] other info that might help us debug this:
[ 228.165378] Possible unsafe locking scenario:
[ 228.165378]
[ 228.165378] CPU0
[ 228.165378] ----
[ 228.165378] lock(sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM);
[ 228.165378] lock(sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM);
[ 228.165378]
[ 228.165378] *** DEADLOCK ***
[ 228.165378]
[ 228.165378] May be due to missing lock nesting notation
Cc: stable@vger.kernel.org
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth/rfcomm/sock.c')
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 4ddef57d03a7..ce3f6658f4b2 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -467,7 +467,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
467 | long timeo; | 467 | long timeo; |
468 | int err = 0; | 468 | int err = 0; |
469 | 469 | ||
470 | lock_sock(sk); | 470 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
471 | 471 | ||
472 | if (sk->sk_type != SOCK_STREAM) { | 472 | if (sk->sk_type != SOCK_STREAM) { |
473 | err = -EINVAL; | 473 | err = -EINVAL; |
@@ -504,7 +504,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
504 | 504 | ||
505 | release_sock(sk); | 505 | release_sock(sk); |
506 | timeo = schedule_timeout(timeo); | 506 | timeo = schedule_timeout(timeo); |
507 | lock_sock(sk); | 507 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
508 | } | 508 | } |
509 | __set_current_state(TASK_RUNNING); | 509 | __set_current_state(TASK_RUNNING); |
510 | remove_wait_queue(sk_sleep(sk), &wait); | 510 | remove_wait_queue(sk_sleep(sk), &wait); |