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


Reply via email to