diff options
Diffstat (limited to 'drivers/tty/n_tty.c')
-rw-r--r-- | drivers/tty/n_tty.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index c9a9ddd1d0bc..7a744b69c3d1 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -1758,8 +1758,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1758 | canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; | 1758 | canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON; |
1759 | if (canon_change) { | 1759 | if (canon_change) { |
1760 | bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE); | 1760 | bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE); |
1761 | ldata->line_start = 0; | 1761 | ldata->line_start = ldata->canon_head = ldata->read_tail; |
1762 | ldata->canon_head = ldata->read_tail; | ||
1763 | ldata->erasing = 0; | 1762 | ldata->erasing = 0; |
1764 | ldata->lnext = 0; | 1763 | ldata->lnext = 0; |
1765 | } | 1764 | } |
@@ -2184,28 +2183,34 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | |||
2184 | 2183 | ||
2185 | if (!input_available_p(tty, 0)) { | 2184 | if (!input_available_p(tty, 0)) { |
2186 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { | 2185 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { |
2187 | retval = -EIO; | 2186 | up_read(&tty->termios_rwsem); |
2188 | break; | 2187 | tty_flush_to_ldisc(tty); |
2189 | } | 2188 | down_read(&tty->termios_rwsem); |
2190 | if (tty_hung_up_p(file)) | 2189 | if (!input_available_p(tty, 0)) { |
2191 | break; | 2190 | retval = -EIO; |
2192 | if (!timeout) | 2191 | break; |
2193 | break; | 2192 | } |
2194 | if (file->f_flags & O_NONBLOCK) { | 2193 | } else { |
2195 | retval = -EAGAIN; | 2194 | if (tty_hung_up_p(file)) |
2196 | break; | 2195 | break; |
2197 | } | 2196 | if (!timeout) |
2198 | if (signal_pending(current)) { | 2197 | break; |
2199 | retval = -ERESTARTSYS; | 2198 | if (file->f_flags & O_NONBLOCK) { |
2200 | break; | 2199 | retval = -EAGAIN; |
2201 | } | 2200 | break; |
2202 | n_tty_set_room(tty); | 2201 | } |
2203 | up_read(&tty->termios_rwsem); | 2202 | if (signal_pending(current)) { |
2203 | retval = -ERESTARTSYS; | ||
2204 | break; | ||
2205 | } | ||
2206 | n_tty_set_room(tty); | ||
2207 | up_read(&tty->termios_rwsem); | ||
2204 | 2208 | ||
2205 | timeout = schedule_timeout(timeout); | 2209 | timeout = schedule_timeout(timeout); |
2206 | 2210 | ||
2207 | down_read(&tty->termios_rwsem); | 2211 | down_read(&tty->termios_rwsem); |
2208 | continue; | 2212 | continue; |
2213 | } | ||
2209 | } | 2214 | } |
2210 | __set_current_state(TASK_RUNNING); | 2215 | __set_current_state(TASK_RUNNING); |
2211 | 2216 | ||