usb_stor_transport() retries a failed command ten times, and every attempt runs usb_stor_Bulk_reset(), which issues three more control transfers to the device. For a device that has been unplugged all of these run into their timeouts, so a single read takes minutes and fills the console with endpoint reset messages.
Now that the USB core notices that a device has been unplugged, check for it: skip the reset, which cannot work without a device, and give up instead of retrying. A read of an unplugged stick fails after the first timeout and every further one fails immediately. Signed-off-by: Sascha Hauer <[email protected]> Assisted-by: Claude:claude-opus-5 --- drivers/usb/storage/transport.c | 4 ++++ drivers/usb/storage/usb.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index be3b18dc66..bda8f93c7a 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -220,6 +220,10 @@ int usb_stor_Bulk_reset(struct us_data *us) dev_dbg(dev, "%s called\n", __func__); + /* Nothing to reset if the device isn't there anymore */ + if (usb_device_disconnected(us->pusb_dev)) + return -ENODEV; + /* issue the command */ result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev, 0), diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 7c19207a8d..55facf8a60 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -86,6 +86,13 @@ static int usb_stor_transport(struct us_blk_dev *usb_blkdev, if (ret == USB_STOR_TRANSPORT_GOOD) return 0; + /* Retrying is pointless once the device has been unplugged */ + if (usb_device_disconnected(us->pusb_dev)) { + dev_dbg(dev, "%s: device is gone\n", + usb_stor_opcode_name(cmd[0])); + return -ENODEV; + } + if (request_sense_delay_ms == USB_STOR_NO_REQUEST_SENSE) continue; -- 2.47.3
