From 5c660b610b258c62739e58ceb18d238d19932b36 Mon Sep 17 00:00:00 2001 From: Stanislav Kozina Date: Thu, 9 Aug 2012 14:48:58 +0100 Subject: [PATCH] --- yaml --- r: 325631 b: refs/heads/master c: 00aaae033e323af33740e7012a8ba4b0fa6dce20 h: refs/heads/master i: 325629: 76c99ffe8e0700863614013e9187df7eb90e34d7 325627: 05845ce99826805fa4b07549f121735379e2a0c5 325623: af4a4dee27a6b8ce1be4bb2b3ea73a388b80921d 325615: 417b77f0485c3c197fce70afdb22e43fd5a8fd65 325599: ed92331c3fb46d5be1d00ab5a52c1daa31957146 325567: cf75ad9345ea3ed5cff4f9d03b56320974d79fb3 325503: 7aa9e09e540bb44c18932f5b65c046977a3ec79b 325375: eaca102308de1c3c6db6a2d9f4e40bb8b7542555 325119: 4aef51d4ae2409b6d3dac340003bbf48582c0b5b 324607: 3e275cd4f18a97bb227afd80f3923e91e3e4b40f 323583: 375e9e592b0105b5df2a309561edfe803bd6ef7b v: v3 --- [refs] | 2 +- trunk/drivers/tty/n_tty.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 0ce1fa8d1d11..52495e71f97a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 857196e2758f01ec40f93429013963ca5f22cbae +refs/heads/master: 00aaae033e323af33740e7012a8ba4b0fa6dce20 diff --git a/trunk/drivers/tty/n_tty.c b/trunk/drivers/tty/n_tty.c index 101790cea4ae..20de673a7730 100644 --- a/trunk/drivers/tty/n_tty.c +++ b/trunk/drivers/tty/n_tty.c @@ -1838,13 +1838,13 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, if (tty->icanon && !L_EXTPROC(tty)) { /* N.B. avoid overrun if nr == 0 */ + spin_lock_irqsave(&tty->read_lock, flags); while (nr && tty->read_cnt) { int eol; eol = test_and_clear_bit(tty->read_tail, tty->read_flags); c = tty->read_buf[tty->read_tail]; - spin_lock_irqsave(&tty->read_lock, flags); tty->read_tail = ((tty->read_tail+1) & (N_TTY_BUF_SIZE-1)); tty->read_cnt--; @@ -1862,15 +1862,19 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, if (tty_put_user(tty, c, b++)) { retval = -EFAULT; b--; + spin_lock_irqsave(&tty->read_lock, flags); break; } nr--; } if (eol) { tty_audit_push(tty); + spin_lock_irqsave(&tty->read_lock, flags); break; } + spin_lock_irqsave(&tty->read_lock, flags); } + spin_unlock_irqrestore(&tty->read_lock, flags); if (retval) break; } else {