Skip to content

Commit

Permalink
tty: N_TTY SIGIO only works for read
Browse files Browse the repository at this point in the history
The N_TTY ldisc layer does not send SIGIO POLL_OUTs correctly when output is
possible due to flawed handling of the TTY_DO_WRITE_WAKEUP bit. It will
either send no SIGIOs at all or on every tty wakeup.

The fix is to set the bit when the tty driver write would block and test
and clear it on write wakeup.

[Merged with existing N_TTY patches and a small buglet fixed -- Alan]

Signed-off-by: Thomas Pfaff <tpfaff@pcs.com>
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Thomas Pfaff authored and Linus Torvalds committed Jan 2, 2009
1 parent eff6937 commit ff8cb0f
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions drivers/char/n_tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -1352,10 +1352,8 @@ static void n_tty_write_wakeup(struct tty_struct *tty)
/* Write out any echoed characters that are still pending */
process_echoes(tty);

if (tty->fasync) {
set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
}
}

/**
Expand Down Expand Up @@ -2014,6 +2012,8 @@ static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
break_out:
__set_current_state(TASK_RUNNING);
remove_wait_queue(&tty->write_wait, &wait);
if (b - buf != nr && tty->fasync)
set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
return (b - buf) ? b - buf : retval;
}

Expand Down

0 comments on commit ff8cb0f

Please sign in to comment.