aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/n_r3964.c
diff options
context:
space:
mode:
authorDmitry Safonov <dima@arista.com>2018-11-01 00:24:48 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-12-05 12:16:33 +0100
commitc96cf923a98d1b094df9f0cf97a83e118817e31b (patch)
tree600f4d868ef87ff58a642bb7e6d4825894d9c657 /drivers/tty/n_r3964.c
parenttty: Hold tty_ldisc_lock() during tty_reopen() (diff)
downloadlinux-dev-c96cf923a98d1b094df9f0cf97a83e118817e31b.tar.xz
linux-dev-c96cf923a98d1b094df9f0cf97a83e118817e31b.zip
tty: Don't block on IO when ldisc change is pending
There might be situations where tty_ldisc_lock() has blocked, but there is already IO on tty and it prevents line discipline changes. It might theoretically turn into dead-lock. Basically, provide more priority to pending tty_ldisc_lock() than to servicing reads/writes over tty. User-visible issue was reported by Mikulas where on pa-risc with Debian 5 reboot took either 80 seconds, 3 minutes or 3:25 after proper locking in tty_reopen(). Cc: Jiri Slaby <jslaby@suse.com> Reported-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/n_r3964.c')
-rw-r--r--drivers/tty/n_r3964.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/tty/n_r3964.c b/drivers/tty/n_r3964.c
index 749a608c40b0..f75696f0ee2d 100644
--- a/drivers/tty/n_r3964.c
+++ b/drivers/tty/n_r3964.c
@@ -1085,7 +1085,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
pMsg = remove_msg(pInfo, pClient);
if (pMsg == NULL) {
/* no messages available. */
- if (file->f_flags & O_NONBLOCK) {
+ if (tty_io_nonblock(tty, file)) {
ret = -EAGAIN;
goto unlock;
}