diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /drivers/tty/n_tty.c | |
parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'drivers/tty/n_tty.c')
-rw-r--r-- | drivers/tty/n_tty.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index ed776149261e..e49c2bce551d 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -2054,13 +2054,13 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2054 | size_t eol; | 2054 | size_t eol; |
2055 | size_t tail; | 2055 | size_t tail; |
2056 | int ret, found = 0; | 2056 | int ret, found = 0; |
2057 | bool eof_push = 0; | ||
2058 | 2057 | ||
2059 | /* N.B. avoid overrun if nr == 0 */ | 2058 | /* N.B. avoid overrun if nr == 0 */ |
2060 | n = min(*nr, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | 2059 | if (!*nr) |
2061 | if (!n) | ||
2062 | return 0; | 2060 | return 0; |
2063 | 2061 | ||
2062 | n = min(*nr + 1, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | ||
2063 | |||
2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); | 2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); |
2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); | 2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); |
2066 | 2066 | ||
@@ -2081,12 +2081,11 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2081 | n = eol - tail; | 2081 | n = eol - tail; |
2082 | if (n > N_TTY_BUF_SIZE) | 2082 | if (n > N_TTY_BUF_SIZE) |
2083 | n += N_TTY_BUF_SIZE; | 2083 | n += N_TTY_BUF_SIZE; |
2084 | n += found; | 2084 | c = n + found; |
2085 | c = n; | ||
2086 | 2085 | ||
2087 | if (found && !ldata->push && read_buf(ldata, eol) == __DISABLED_CHAR) { | 2086 | if (!found || read_buf(ldata, eol) != __DISABLED_CHAR) { |
2088 | n--; | 2087 | c = min(*nr, c); |
2089 | eof_push = !n && ldata->read_tail != ldata->line_start; | 2088 | n = c; |
2090 | } | 2089 | } |
2091 | 2090 | ||
2092 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", | 2091 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", |
@@ -2116,7 +2115,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
2116 | ldata->push = 0; | 2115 | ldata->push = 0; |
2117 | tty_audit_push(tty); | 2116 | tty_audit_push(tty); |
2118 | } | 2117 | } |
2119 | return eof_push ? -EAGAIN : 0; | 2118 | return 0; |
2120 | } | 2119 | } |
2121 | 2120 | ||
2122 | extern ssize_t redirected_tty_write(struct file *, const char __user *, | 2121 | extern ssize_t redirected_tty_write(struct file *, const char __user *, |
@@ -2273,10 +2272,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | |||
2273 | 2272 | ||
2274 | if (ldata->icanon && !L_EXTPROC(tty)) { | 2273 | if (ldata->icanon && !L_EXTPROC(tty)) { |
2275 | retval = canon_copy_from_read_buf(tty, &b, &nr); | 2274 | retval = canon_copy_from_read_buf(tty, &b, &nr); |
2276 | if (retval == -EAGAIN) { | 2275 | if (retval) |
2277 | retval = 0; | ||
2278 | continue; | ||
2279 | } else if (retval) | ||
2280 | break; | 2276 | break; |
2281 | } else { | 2277 | } else { |
2282 | int uncopied; | 2278 | int uncopied; |