Commit ee5aa7b8 authored by Joe Peterson's avatar Joe Peterson Committed by Live-CD User

n_tty: honor opost flag for echoes

Fixes the following bug:

      http://bugs.linuxbase.org/show_bug.cgi?id=2692

Causes processing of echoed characters (output from the echo buffer) to
honor the O_OPOST flag, which is consistent with the old behavior.

Note that this and the next patch ("n_tty: move echoctl check and
clean up logic") were verified together by the bug reporters, and
the test now passes.
Signed-off-by: default avatarJoe Peterson <joe@skyrush.com>
Cc: Linux Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fe1ae7fd
...@@ -272,7 +272,8 @@ static inline int is_continuation(unsigned char c, struct tty_struct *tty) ...@@ -272,7 +272,8 @@ static inline int is_continuation(unsigned char c, struct tty_struct *tty)
* *
* This is a helper function that handles one output character * This is a helper function that handles one output character
* (including special characters like TAB, CR, LF, etc.), * (including special characters like TAB, CR, LF, etc.),
* putting the results in the tty driver's write buffer. * doing OPOST processing and putting the results in the
* tty driver's write buffer.
* *
* Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
* and NLDLY. They simply aren't relevant in the world today. * and NLDLY. They simply aren't relevant in the world today.
...@@ -350,8 +351,9 @@ static int do_output_char(unsigned char c, struct tty_struct *tty, int space) ...@@ -350,8 +351,9 @@ static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
* @c: character (or partial unicode symbol) * @c: character (or partial unicode symbol)
* @tty: terminal device * @tty: terminal device
* *
* Perform OPOST processing. Returns -1 when the output device is * Output one character with OPOST processing.
* full and the character must be retried. * Returns -1 when the output device is full and the character
* must be retried.
* *
* Locking: output_lock to protect column state and space left * Locking: output_lock to protect column state and space left
* (also, this is called from n_tty_write under the * (also, this is called from n_tty_write under the
...@@ -377,8 +379,11 @@ static int process_output(unsigned char c, struct tty_struct *tty) ...@@ -377,8 +379,11 @@ static int process_output(unsigned char c, struct tty_struct *tty)
/** /**
* process_output_block - block post processor * process_output_block - block post processor
* @tty: terminal device * @tty: terminal device
* @inbuf: user buffer * @buf: character buffer
* @nr: number of bytes * @nr: number of bytes to output
*
* Output a block of characters with OPOST processing.
* Returns the number of characters output.
* *
* This path is used to speed up block console writes, among other * This path is used to speed up block console writes, among other
* things when processing blocks of output data. It handles only * things when processing blocks of output data. It handles only
...@@ -605,12 +610,18 @@ static void process_echoes(struct tty_struct *tty) ...@@ -605,12 +610,18 @@ static void process_echoes(struct tty_struct *tty)
if (no_space_left) if (no_space_left)
break; break;
} else { } else {
int retval; if (O_OPOST(tty) &&
!(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
retval = do_output_char(c, tty, space); int retval = do_output_char(c, tty, space);
if (retval < 0) if (retval < 0)
break; break;
space -= retval; space -= retval;
} else {
if (!space)
break;
tty_put_char(tty, c);
space -= 1;
}
cp += 1; cp += 1;
nr -= 1; nr -= 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment