[PATCH 13/13] usb: storage: stop talking to a device that is gone
Sascha Hauer
s.hauer at pengutronix.de
Mon Aug 31 06:20:20 PDT 2026
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 <s.hauer at pengutronix.de>
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
More information about the barebox
mailing list