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:
Johan Hovold authored and Greg Kroah-Hartman committed 2026-09-23 12:01:19 +02:00
1 parent eb35b73e13
commit 615f35fd5a
1 file changed
+4 -5
+4 -5
View File
@@ -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)) {