[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