tty: n_tty: extract n_tty_wait_for_input()

n_tty_read() is a very long function doing too much of different stuff.
Extract the "wait for input" to a separate function:
n_tty_wait_for_input(). It returns an error (< 0), no input (0), or has
potential input (1).

Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20250317070046.24386-11-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jiri Slaby (SUSE) 2025-03-17 08:00:25 +01:00 committed by Greg Kroah-Hartman
parent aa1ebc9cff
commit 40315ce580

View File

@ -2145,6 +2145,33 @@ static ssize_t n_tty_continue_cookie(struct tty_struct *tty, u8 *kbuf,
return kb - kbuf;
}
static int n_tty_wait_for_input(struct tty_struct *tty, struct file *file,
struct wait_queue_entry *wait, long *timeout)
{
if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
return -EIO;
if (tty_hung_up_p(file))
return 0;
/*
* Abort readers for ttys which never actually get hung up.
* See __tty_hangup().
*/
if (test_bit(TTY_HUPPING, &tty->flags))
return 0;
if (!*timeout)
return 0;
if (tty_io_nonblock(tty, file))
return -EAGAIN;
if (signal_pending(current))
return -ERESTARTSYS;
up_read(&tty->termios_rwsem);
*timeout = wait_woken(wait, TASK_INTERRUPTIBLE, *timeout);
down_read(&tty->termios_rwsem);
return 1;
}
/**
* n_tty_read - read function for tty
* @tty: tty device
@ -2234,34 +2261,12 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, u8 *kbuf,
tty_buffer_flush_work(tty->port);
down_read(&tty->termios_rwsem);
if (!input_available_p(tty, 0)) {
if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
retval = -EIO;
int ret = n_tty_wait_for_input(tty, file, &wait,
&timeout);
if (ret <= 0) {
retval = ret;
break;
}
if (tty_hung_up_p(file))
break;
/*
* Abort readers for ttys which never actually
* get hung up. See __tty_hangup().
*/
if (test_bit(TTY_HUPPING, &tty->flags))
break;
if (!timeout)
break;
if (tty_io_nonblock(tty, file)) {
retval = -EAGAIN;
break;
}
if (signal_pending(current)) {
retval = -ERESTARTSYS;
break;
}
up_read(&tty->termios_rwsem);
timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
timeout);
down_read(&tty->termios_rwsem);
continue;
}
}