Skip to content

Commit

Permalink
tty: fix BKL related leak and crash
Browse files Browse the repository at this point in the history
Enabling the BKL to be lockdep tracked uncovered the following
upstream kernel bug in the tty code, which caused a BKL
reference leak:

  ================================================
  [ BUG: lock held when returning to user space! ]
  ------------------------------------------------
  dmesg/3121 is leaving the kernel with locks still held!
  1 lock held by dmesg/3121:
   #0:  (kernel_mutex){--..}, at: [<c02f34d9>] opost+0x24/0x194

this might explain some of the atomicity warnings and crashes
that -tip tree testing has been experiencing since the BKL
was converted back to a spinlock.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Ingo Molnar authored and Linus Torvalds committed May 15, 2008
1 parent 8568dae commit 487ad7e
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/char/n_tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,16 +282,20 @@ static int opost(unsigned char c, struct tty_struct *tty)
if (O_ONLRET(tty))
tty->column = 0;
if (O_ONLCR(tty)) {
if (space < 2)
if (space < 2) {
unlock_kernel();
return -1;
}
tty_put_char(tty, '\r');
tty->column = 0;
}
tty->canon_column = tty->column;
break;
case '\r':
if (O_ONOCR(tty) && tty->column == 0)
if (O_ONOCR(tty) && tty->column == 0) {
unlock_kernel();
return 0;
}
if (O_OCRNL(tty)) {
c = '\n';
if (O_ONLRET(tty))
Expand All @@ -303,10 +307,13 @@ static int opost(unsigned char c, struct tty_struct *tty)
case '\t':
spaces = 8 - (tty->column & 7);
if (O_TABDLY(tty) == XTABS) {
if (space < spaces)
if (space < spaces) {
unlock_kernel();
return -1;
}
tty->column += spaces;
tty->ops->write(tty, " ", spaces);
unlock_kernel();
return 0;
}
tty->column += spaces;
Expand Down

0 comments on commit 487ad7e

Please sign in to comment.