Commit 03b1fb24 authored by Dave Jones's avatar Dave Jones Committed by Linus Torvalds

[PATCH] fix sigio on tty drivers outgoing

This went into 2.4.18
parent 4c147101
...@@ -23,6 +23,11 @@ ...@@ -23,6 +23,11 @@
* 2000/01/20 Fixed SMP locking on put_tty_queue using bits of * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of
* the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu> * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
* who actually finally proved there really was a race. * who actually finally proved there really was a race.
*
* 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
* waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
* Also fixed a bug in BLOCKING mode where write_chan returns
* EAGAIN
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -707,6 +712,22 @@ static int n_tty_receive_room(struct tty_struct *tty) ...@@ -707,6 +712,22 @@ static int n_tty_receive_room(struct tty_struct *tty)
return 0; return 0;
} }
/*
* Required for the ptys, serial driver etc. since processes
* that attach themselves to the master and rely on ASYNC
* IO must be woken up
*/
static void n_tty_write_wakeup(struct tty_struct *tty)
{
if (tty->fasync)
{
set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
}
return;
}
static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
char *fp, int count) char *fp, int count)
{ {
...@@ -1156,6 +1177,8 @@ static ssize_t write_chan(struct tty_struct * tty, struct file * file, ...@@ -1156,6 +1177,8 @@ static ssize_t write_chan(struct tty_struct * tty, struct file * file,
while (nr > 0) { while (nr > 0) {
ssize_t num = opost_block(tty, b, nr); ssize_t num = opost_block(tty, b, nr);
if (num < 0) { if (num < 0) {
if (num == -EAGAIN)
break;
retval = num; retval = num;
goto break_out; goto break_out;
} }
...@@ -1235,6 +1258,6 @@ struct tty_ldisc tty_ldisc_N_TTY = { ...@@ -1235,6 +1258,6 @@ struct tty_ldisc tty_ldisc_N_TTY = {
normal_poll, /* poll */ normal_poll, /* poll */
n_tty_receive_buf, /* receive_buf */ n_tty_receive_buf, /* receive_buf */
n_tty_receive_room, /* receive_room */ n_tty_receive_room, /* receive_room */
0 /* write_wakeup */ n_tty_write_wakeup /* write_wakeup */
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment