aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlan Cox <alan@linux.intel.com>2009-12-12 05:32:36 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-12 17:46:21 -0500
commit6698e34720660e18b45e2e3b115ee4584d0c3b5e (patch)
tree1e6e136d58a1f66928603f0e48cd8f163fef5196 /drivers
parent09cea96caa59fabab3030c53bd698b9b568d959a (diff)
tty: Fix BKL taken under a spinlock bug introduced in the BKL split
The fasync path takes the BKL (it probably doesn't need to in fact) while holding the file_list spinlock. You can't do that with the kernel lock: it causes lock inversions and deadlocks. Leave the BKL over that bit for the moment. Identified by AKPM. Signed-off-by: Alan Cox <alan@linux.intel.com> Acked-and-Tested-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/char/tty_io.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 684f0e0b175e..f15df40bc318 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -516,7 +516,6 @@ static void do_tty_hangup(struct work_struct *work)
516 /* inuse_filps is protected by the single kernel lock */ 516 /* inuse_filps is protected by the single kernel lock */
517 lock_kernel(); 517 lock_kernel();
518 check_tty_count(tty, "do_tty_hangup"); 518 check_tty_count(tty, "do_tty_hangup");
519 unlock_kernel();
520 519
521 file_list_lock(); 520 file_list_lock();
522 /* This breaks for file handles being sent over AF_UNIX sockets ? */ 521 /* This breaks for file handles being sent over AF_UNIX sockets ? */
@@ -531,7 +530,6 @@ static void do_tty_hangup(struct work_struct *work)
531 } 530 }
532 file_list_unlock(); 531 file_list_unlock();
533 532
534 lock_kernel();
535 tty_ldisc_hangup(tty); 533 tty_ldisc_hangup(tty);
536 534
537 read_lock(&tasklist_lock); 535 read_lock(&tasklist_lock);