]> git.hungrycats.org Git - linux/commitdiff
[PATCH] fix sigio on tty drivers outgoing
authorDave Jones <davej@codemonkey.org.uk>
Thu, 13 Feb 2003 02:38:28 +0000 (18:38 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Thu, 13 Feb 2003 02:38:28 +0000 (18:38 -0800)
This went into 2.4.18

drivers/char/n_tty.c

index ccf36427d4b054e8ae8cbd21d79f0da4e84266c7..c80d79a80bd0aede61efc33f7991d90898e1d664 100644 (file)
  * 2000/01/20   Fixed SMP locking on put_tty_queue using bits of 
  *             the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
  *             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>
@@ -707,6 +712,22 @@ static int n_tty_receive_room(struct tty_struct *tty)
        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,
                              char *fp, int count)
 {
@@ -1156,6 +1177,8 @@ static ssize_t write_chan(struct tty_struct * tty, struct file * file,
                        while (nr > 0) {
                                ssize_t num = opost_block(tty, b, nr);
                                if (num < 0) {
+                                       if (num == -EAGAIN)
+                                               break;
                                        retval = num;
                                        goto break_out;
                                }
@@ -1235,6 +1258,6 @@ struct tty_ldisc tty_ldisc_N_TTY = {
        normal_poll,            /* poll */
        n_tty_receive_buf,      /* receive_buf */
        n_tty_receive_room,     /* receive_room */
-       0                       /* write_wakeup */
+       n_tty_write_wakeup      /* write_wakeup */
 };