• Cory T. Tusar's avatar
    tty: fix logic change introduced by wait_event_interruptible_timeout() · db99247a
    Cory T. Tusar authored
    Commit 5a52bd4a introduced a subtle logic
    change in tty_wait_until_sent().  The original version would only error out
    of the 'do { ...  } while (timeout)' loop if signal_pending() evaluated to
    true; a timeout or break due to an empty buffer would fall out of the loop
    and into the tty->driver->wait_until_sent handling.  The current
    implementation will error out on either a pending signal or an empty
    buffer, falling through to the tty->driver->wait_until_sent handling only
    on a timeout.
    
    The ->wait_until_sent() will not be reached if the buffer empties before
    timeout jiffies have elapsed.  This behavior differs from that prior to commit
    5a52bd4a.
    
    I turned this up while using a little serial download utility to bootstrap an
    ARM-based eval board.  The util worked fine on 2.6.22.x, but consistently
    failed on 2.6.23.x.  Once I'd determined that, I narrowed things down with git
    bisect, and found the above difference in logic in tty_wait_until_sent() by
    inspection.
    
    This change reverts the logic flow in tty_wait_until_sent() to match that
    prior to the aforementioned commit.
    Signed-off-by: default avatarCory T. Tusar <ctusar@videon-central.com>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Acked-by: default avatarJiri Slaby <jirislaby@gmail.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    db99247a
tty_ioctl.c 24.8 KB