tty, n_tty: Remove fasync() ldisc notification
authorPeter Hurley <peter@hurleysoftware.com>
Sun, 10 Jan 2016 05:45:09 +0000 (21:45 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Jan 2016 19:58:02 +0000 (11:58 -0800)
Only the N_TTY line discipline implements the signal-driven i/o
notification enabled/disabled by fcntl(F_SETFL, O_ASYNC). The ldisc
fasync() notification is sent to the ldisc when the enable state has
changed (the tty core is notified via the fasync() VFS file operation).

The N_TTY line discipline used the enable state to change the wakeup
condition (minimum_to_wake = 1) for notifying the signal handler i/o is
available. However, just the presence of data is sufficient and necessary
to signal i/o is available, so changing minimum_to_wake is unnecessary
(and creates a race condition with read() and poll() which may be
concurrently updating minimum_to_wake).

Furthermore, since the kill_fasync() VFS helper performs no action if
the fasync list is empty, calling unconditionally is preferred; if
signal driven i/o just has been disabled, no signal will be sent by
kill_fasync() anyway so notification of the change via the ldisc
fasync() method is superfluous.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/n_tty.c
drivers/tty/tty_io.c
include/linux/tty_ldisc.h

index d04f398d5de3af5c77c536ac31c552945b765308..a93e4c7e82ae059107b0dadc0e3408725f69e5a8 100644 (file)
@@ -2448,10 +2448,6 @@ static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
        }
 }
 
-static void n_tty_fasync(struct tty_struct *tty, int on)
-{
-}
-
 static struct tty_ldisc_ops n_tty_ops = {
        .magic           = TTY_LDISC_MAGIC,
        .name            = "n_tty",
@@ -2465,7 +2461,6 @@ static struct tty_ldisc_ops n_tty_ops = {
        .poll            = n_tty_poll,
        .receive_buf     = n_tty_receive_buf,
        .write_wakeup    = n_tty_write_wakeup,
-       .fasync          = n_tty_fasync,
        .receive_buf2    = n_tty_receive_buf2,
 };
 
index c5b4274584dc72d8610ee8192bc4d882b5eee05d..7533ab1abe72085c046717e72788462f08595a78 100644 (file)
@@ -2219,7 +2219,6 @@ static unsigned int tty_poll(struct file *filp, poll_table *wait)
 static int __tty_fasync(int fd, struct file *filp, int on)
 {
        struct tty_struct *tty = file_tty(filp);
-       struct tty_ldisc *ldisc;
        unsigned long flags;
        int retval = 0;
 
@@ -2230,13 +2229,6 @@ static int __tty_fasync(int fd, struct file *filp, int on)
        if (retval <= 0)
                goto out;
 
-       ldisc = tty_ldisc_ref(tty);
-       if (ldisc) {
-               if (ldisc->ops->fasync)
-                       ldisc->ops->fasync(tty, on);
-               tty_ldisc_deref(ldisc);
-       }
-
        if (on) {
                enum pid_type type;
                struct pid *pid;
index 6101ab8dc148856da76e3a61f9155aa74f9f40ab..3971cf0eb467c0e1985011cc76db2e9f9484a274 100644 (file)
  *     seek to perform this action quickly but should wait until
  *     any pending driver I/O is completed.
  *
- * void (*fasync)(struct tty_struct *, int on)
- *
- *     Notify line discipline when signal-driven I/O is enabled or
- *     disabled.
- *
  * void (*dcd_change)(struct tty_struct *tty, unsigned int status)
  *
  *     Tells the discipline that the DCD pin has changed its status.
@@ -202,7 +197,6 @@ struct tty_ldisc_ops {
                               char *fp, int count);
        void    (*write_wakeup)(struct tty_struct *);
        void    (*dcd_change)(struct tty_struct *, unsigned int);
-       void    (*fasync)(struct tty_struct *tty, int on);
        int     (*receive_buf2)(struct tty_struct *, const unsigned char *cp,
                                char *fp, int count);