• Alan Stern's avatar
    USB: remove race condition in usbfs/libusb when using reap-after-disconnect · 5cce4382
    Alan Stern authored
    Hans de Goede has reported a difficulty in the Linux port of libusb.
    When a device is removed, the poll() system call in usbfs starts
    returning POLLERR as soon as udev->state is set to
    USB_STATE_NOTATTACHED, but the outstanding URBs are not available for
    reaping until some time later (after usbdev_remove() has been called).
    This is awkward for libusb or other usbfs clients, although not an
    insuperable problem.
    
    At any rate, it's easy to change usbfs so that it returns POLLHUP as
    soon as the state becomes USB_STATE_NOTATTACHED but it doesn't return
    POLLERR until after the outstanding URBs have completed.  That's what
    this patch does; it uses the fact that ps->list is always on the
    dev->filelist list until usbdev_remove() takes it off, which happens
    after all the outstanding URBs have been cancelled.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Reported-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    5cce4382
devio.c 65.5 KB