tty, n_tty: Remove fasync() ldisc notification
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>
This commit is contained in:
parent
33d7136336
commit
bee6741ca0
|
@ -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 = {
|
static struct tty_ldisc_ops n_tty_ops = {
|
||||||
.magic = TTY_LDISC_MAGIC,
|
.magic = TTY_LDISC_MAGIC,
|
||||||
.name = "n_tty",
|
.name = "n_tty",
|
||||||
|
@ -2465,7 +2461,6 @@ static struct tty_ldisc_ops n_tty_ops = {
|
||||||
.poll = n_tty_poll,
|
.poll = n_tty_poll,
|
||||||
.receive_buf = n_tty_receive_buf,
|
.receive_buf = n_tty_receive_buf,
|
||||||
.write_wakeup = n_tty_write_wakeup,
|
.write_wakeup = n_tty_write_wakeup,
|
||||||
.fasync = n_tty_fasync,
|
|
||||||
.receive_buf2 = n_tty_receive_buf2,
|
.receive_buf2 = n_tty_receive_buf2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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)
|
static int __tty_fasync(int fd, struct file *filp, int on)
|
||||||
{
|
{
|
||||||
struct tty_struct *tty = file_tty(filp);
|
struct tty_struct *tty = file_tty(filp);
|
||||||
struct tty_ldisc *ldisc;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
|
@ -2230,13 +2229,6 @@ static int __tty_fasync(int fd, struct file *filp, int on)
|
||||||
if (retval <= 0)
|
if (retval <= 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ldisc = tty_ldisc_ref(tty);
|
|
||||||
if (ldisc) {
|
|
||||||
if (ldisc->ops->fasync)
|
|
||||||
ldisc->ops->fasync(tty, on);
|
|
||||||
tty_ldisc_deref(ldisc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (on) {
|
if (on) {
|
||||||
enum pid_type type;
|
enum pid_type type;
|
||||||
struct pid *pid;
|
struct pid *pid;
|
||||||
|
|
|
@ -98,11 +98,6 @@
|
||||||
* seek to perform this action quickly but should wait until
|
* seek to perform this action quickly but should wait until
|
||||||
* any pending driver I/O is completed.
|
* 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)
|
* void (*dcd_change)(struct tty_struct *tty, unsigned int status)
|
||||||
*
|
*
|
||||||
* Tells the discipline that the DCD pin has changed its status.
|
* Tells the discipline that the DCD pin has changed its status.
|
||||||
|
@ -202,7 +197,6 @@ struct tty_ldisc_ops {
|
||||||
char *fp, int count);
|
char *fp, int count);
|
||||||
void (*write_wakeup)(struct tty_struct *);
|
void (*write_wakeup)(struct tty_struct *);
|
||||||
void (*dcd_change)(struct tty_struct *, unsigned int);
|
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,
|
int (*receive_buf2)(struct tty_struct *, const unsigned char *cp,
|
||||||
char *fp, int count);
|
char *fp, int count);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue