aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-09-05 12:46:07 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-05 12:46:07 -0700
commit37f81fa1f63ad38e16125526bb2769ae0ea8d332 (patch)
tree116ee462263777d2cd12b578b60ffe04a8a5b38c
parenta2a8474c3fff88d8dd52d05cb450563fb26fd26c (diff)
downloadkernel_samsung_smdk4412-37f81fa1f63ad38e16125526bb2769ae0ea8d332.tar.gz
kernel_samsung_smdk4412-37f81fa1f63ad38e16125526bb2769ae0ea8d332.tar.bz2
kernel_samsung_smdk4412-37f81fa1f63ad38e16125526bb2769ae0ea8d332.zip
n_tty: do O_ONLCR translation as a single write
When translating CR to CRNL in the n_tty line discipline, we did it as two tty_put_char() calls. Which works, but is stupid, and has caused problems before too with bad interactions with the write_room() logic. The generic USB serial driver had that problem, for example. Now the pty layer had similar issues after being moved to the generic tty buffering code (in commit d945cb9cce20ac7143c2de8d88b187f62db99bdc: "pty: Rework the pty layer to use the normal buffering logic"). So stop doing the silly separate two writes, and do it as a single write instead. That's what the n_tty layer already does for the space expansion of tabs (XTABS), and it means that we'll now always have just a single write for the CRNL to match the single 'tty_write_room()' test, which hopefully means that the next time somebody screws up buffering, it won't cause weeks of debugging. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/char/n_tty.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index 973be2f4419..4e28b35024e 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -300,8 +300,7 @@ static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
if (space < 2)
return -1;
tty->canon_column = tty->column = 0;
- tty_put_char(tty, '\r');
- tty_put_char(tty, c);
+ tty->ops->write(tty, "\r\n", 2);
return 2;
}
tty->canon_column = tty->column;