diff options
| author | Alan Cox <alan@linux.intel.com> | 2009-12-12 05:32:36 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-12 17:46:21 -0500 |
| commit | 6698e34720660e18b45e2e3b115ee4584d0c3b5e (patch) | |
| tree | 1e6e136d58a1f66928603f0e48cd8f163fef5196 | |
| parent | 09cea96caa59fabab3030c53bd698b9b568d959a (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>
| -rw-r--r-- | drivers/char/tty_io.c | 2 |
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); |
