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 | ||
