• Simon Arlott's avatar
    USB: ftdi_sio: fix race condition in TIOCMIWAIT, and abort of TIOCMIWAIT when the device is removed · 876ae50d
    Simon Arlott authored
    There are two issues here, one is that the device is generating
    spurious very fast modem status line changes somewhere:
    
    CTS becomes high then low 18µs later:
    [121226.924373] ftdi_process_packet: prev rng=0 dsr=10 dcd=0 cts=6
    [121226.924378] ftdi_process_packet: status=10 prev=00 diff=10
    [121226.924382] ftdi_process_packet: now rng=0 dsr=10 dcd=0 cts=7
    (wake_up_interruptible is called)
    [121226.924391] ftdi_process_packet: prev rng=0 dsr=10 dcd=0 cts=7
    [121226.924394] ftdi_process_packet: status=00 prev=10 diff=10
    [121226.924397] ftdi_process_packet: now rng=0 dsr=10 dcd=0 cts=8
    (wake_up_interruptible is called)
    
    This wakes up the task in TIOCMIWAIT:
    [121226.924405] ftdi_ioctl: 19451 rng=0->0 dsr=10->10 dcd=0->0 cts=6->8
    (wait from 20:51:46 returns and observes both changes)
    
    Which then calls TIOCMIWAIT again:
    20:51:46.400239 ioctl(3, TIOCMIWAIT, 0x20) = 0
    22:11:09.441818 ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS]) = 0
    22:11:09.442812 ioctl(3, TIOCMIWAIT, 0x20) = -1 EIO (Input/output error)
    (the second wake_up_interruptible takes effect and an I/O error occurs)
    
    The other issue is that TIOCMIWAIT will wait forever (unless the task is
    interrupted) if the device is removed.
    
    This change removes the -EIO return that occurs if the counts don't
    appear to have changed. Multiple counts may have been processed as
    one or the waiting task may have started waiting after recording the
    current count.
    
    It adds a bool to indicate that the device has been removed so that
    TIOCMIWAIT doesn't wait forever, and wakes up any tasks so that they can
    return -EIO.
    Signed-off-by: default avatarSimon Arlott <simon@fire.lp0.eu>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    876ae50d
ftdi_sio.c 86.2 KB