• Paul Fulghum's avatar
    tty_set_ldisc() receive_room fix · ae030e43
    Paul Fulghum authored
    Fix tty_set_ldisc in tty_io.c so that tty->receive_room is only cleared if
    actually changing line disciplines.
    
    Without this fix a problem occurs when requesting the line discipline to
    change to the same line discipline.  In this case tty->receive_room is
    cleared but ldisc->open() is not called to set tty->receive_room back to a
    sane value.  The result is that tty->receive_room is stuck at 0 preventing
    the tty flip buffer from passing receive data to the line discipline.
    
    For example: a switch from N_TTY to N_TTY followed by a select() call for
    read input results in data never being received because tty->receive_room
    is stuck at zero.
    
    A switch from N_TTY to N_TTY followed by a read() call works because the
    read() call itself sets tty->receive_room correctly (but select does not).
    
    Previously (< 2.6.18) this was not a problem because the tty flip buffer
    pushed data to the line discipline without regard for tty->receive room.
    Signed-off-by: default avatarPaul Fulghum <paulkf@microgate.com>
    Acked-by: default avatarAlan Cox <alan@lxorguk.ukuu.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ae030e43
tty_io.c 99.6 KB