lkml.org 
[lkml]   [2015]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.2 139/152] s390/3215: fix tty output containing tabs
    3.2.67-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Martin Schwidefsky <schwidefsky@de.ibm.com>

    commit e512d56c799517f33b301d81e9a5e0ebf30c2d1e upstream.

    git commit 37f81fa1f63ad38e16125526bb2769ae0ea8d332
    "n_tty: do O_ONLCR translation as a single write"
    surfaced a bug in the 3215 device driver. In combination this
    broke tab expansion for tty ouput.

    The cause is an asymmetry in the behaviour of tty3215_ops->write
    vs tty3215_ops->put_char. The put_char function scans for '\t'
    but the write function does not.

    As the driver has logic for the '\t' expansion remove XTABS
    from c_oflag of the initial termios as well.

    Reported-by: Stephen Powell <zlinuxman@wowway.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/s390/char/con3215.c | 20 +++++++++++++++++---
    1 file changed, 17 insertions(+), 3 deletions(-)

    --- a/drivers/s390/char/con3215.c
    +++ b/drivers/s390/char/con3215.c
    @@ -993,12 +993,26 @@ static int tty3215_write(struct tty_stru
    const unsigned char *buf, int count)
    {
    struct raw3215_info *raw;
    + int i, written;

    if (!tty)
    return 0;
    raw = (struct raw3215_info *) tty->driver_data;
    - raw3215_write(raw, buf, count);
    - return count;
    + written = count;
    + while (count > 0) {
    + for (i = 0; i < count; i++)
    + if (buf[i] == '\t' || buf[i] == '\n')
    + break;
    + raw3215_write(raw, buf, i);
    + count -= i;
    + buf += i;
    + if (count > 0) {
    + raw3215_putchar(raw, *buf);
    + count--;
    + buf++;
    + }
    + }
    + return written;
    }

    /*
    @@ -1146,7 +1160,7 @@ static int __init tty3215_init(void)
    driver->subtype = SYSTEM_TYPE_TTY;
    driver->init_termios = tty_std_termios;
    driver->init_termios.c_iflag = IGNBRK | IGNPAR;
    - driver->init_termios.c_oflag = ONLCR | XTABS;
    + driver->init_termios.c_oflag = ONLCR;
    driver->init_termios.c_lflag = ISIG;
    driver->flags = TTY_DRIVER_REAL_RAW;
    tty_set_operations(driver, &tty3215_ops);


    \
     
     \ /
      Last update: 2015-02-17 04:01    [W:4.139 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site