mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
tty: amiserial: fix broken TIOCMIWAIT
A change replacing interruptible_sleep_on() inadvertently broke the
TIOCMIWAIT implementation which now immediately returns -EIO (unless
there is a racing modem status update).
Replace the old hangup (and signal) detection with a check for the
TTY_IO_ERROR flag which is set on hangup.
Fixes: 591cee0a35 ("tty/amiserial: avoid interruptible_sleep_on")
Reported-by: [email protected]
Link: https://lore.kernel.org/[email protected]
Cc: [email protected] # 3.14
Cc: Arnd Bergmann <[email protected]>
Signed-off-by: Johan Hovold <[email protected]>
Reviewed-by: Jiri Slaby <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
1 parent
eb35b73e13
commit
615f35fd5a
1 file changed
+4
-5
@@ -1138,11 +1138,6 @@ static int rs_ioctl(struct tty_struct *tty,
|
||||
local_irq_save(flags);
|
||||
cnow = info->icount; /* atomic copy */
|
||||
local_irq_restore(flags);
|
||||
if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
|
||||
cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
|
||||
ret = -EIO; /* no change => error */
|
||||
break;
|
||||
}
|
||||
if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
|
||||
((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
|
||||
((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
|
||||
@@ -1150,6 +1145,10 @@ static int rs_ioctl(struct tty_struct *tty,
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
if (tty_io_error(tty)) {
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
/* see if a signal did it */
|
||||
if (signal_pending(current)) {
|
||||
|
||||
Reference in new issue
Block a user