linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv2] updates to UAS
@ 2020-09-16  9:40 Oliver Neukum
  2020-09-16  9:40 ` [PATCH 1/2] UAS: fix disconnect by unplugging a hub Oliver Neukum
  2020-09-16  9:40 ` [PATCH 2/2] UAS: use macro for reporting results Oliver Neukum
  0 siblings, 2 replies; 3+ messages in thread
From: Oliver Neukum @ 2020-09-16  9:40 UTC (permalink / raw)
  To: gregKH, linux-usb; +Cc: Oliver Neukum

The first patch fixes a corner case where a whole tree of devices
is removed and I got a report of a live lock

The second patch just modernizes to new helpers. No functional change
intended

v2: reversed order of patches so the first patch can cleanly go into
the stable series

Signed-off-by: Oliver Neukum <oneukum@suse.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] UAS: fix disconnect by unplugging a hub
  2020-09-16  9:40 [PATCHv2] updates to UAS Oliver Neukum
@ 2020-09-16  9:40 ` Oliver Neukum
  2020-09-16  9:40 ` [PATCH 2/2] UAS: use macro for reporting results Oliver Neukum
  1 sibling, 0 replies; 3+ messages in thread
From: Oliver Neukum @ 2020-09-16  9:40 UTC (permalink / raw)
  To: gregKH, linux-usb; +Cc: Oliver Neukum

The SCSI layer can go into an ugly loop if you ignore that a device
is gone. You need to report an error in the command rather than
in the return value of the queue method.
We need to specifically check for ENODEV. The issue goes
back to the introduction of the driver.

v2: reorder patches

Fixes: 115bb1ffa54c3 ("USB: Add UAS driver")
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/usb/storage/uas.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index d592071119ba..13696f03f800 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -662,8 +662,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 	if (devinfo->resetting) {
 		cmnd->result = DID_ERROR << 16;
 		cmnd->scsi_done(cmnd);
-		spin_unlock_irqrestore(&devinfo->lock, flags);
-		return 0;
+		goto zombie;
 	}
 
 	/* Find a free uas-tag */
@@ -699,6 +698,16 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 		cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB);
 
 	err = uas_submit_urbs(cmnd, devinfo);
+	/*
+	 * in case of fatal errors the SCSI layer is peculiar
+	 * a command that has finished is a success for the purpose
+	 * of queueing, no matter how fatal the error
+	 */
+	if (err == -ENODEV) {
+		cmnd->result = DID_ERROR << 16;
+		cmnd->scsi_done(cmnd);
+		goto zombie;
+	}
 	if (err) {
 		/* If we did nothing, give up now */
 		if (cmdinfo->state & SUBMIT_STATUS_URB) {
@@ -709,6 +718,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 	}
 
 	devinfo->cmnd[idx] = cmnd;
+zombie:
 	spin_unlock_irqrestore(&devinfo->lock, flags);
 	return 0;
 }
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] UAS: use macro for reporting results
  2020-09-16  9:40 [PATCHv2] updates to UAS Oliver Neukum
  2020-09-16  9:40 ` [PATCH 1/2] UAS: fix disconnect by unplugging a hub Oliver Neukum
@ 2020-09-16  9:40 ` Oliver Neukum
  1 sibling, 0 replies; 3+ messages in thread
From: Oliver Neukum @ 2020-09-16  9:40 UTC (permalink / raw)
  To: gregKH, linux-usb; +Cc: Oliver Neukum

The SCSI layer has introduced a new macro for recording the result
of a command. Use it.

v2: reorder patches

Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/usb/storage/uas.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 13696f03f800..19e730f9ad19 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -279,17 +279,17 @@ static bool uas_evaluate_response_iu(struct response_iu *riu, struct scsi_cmnd *
 
 	switch (response_code) {
 	case RC_INCORRECT_LUN:
-		cmnd->result = DID_BAD_TARGET << 16;
+		set_host_byte(cmnd, DID_BAD_TARGET);
 		break;
 	case RC_TMF_SUCCEEDED:
-		cmnd->result = DID_OK << 16;
+		set_host_byte(cmnd, DID_OK);
 		break;
 	case RC_TMF_NOT_SUPPORTED:
-		cmnd->result = DID_TARGET_FAILURE << 16;
+		set_host_byte(cmnd, DID_TARGET_FAILURE);
 		break;
 	default:
 		uas_log_cmd_state(cmnd, "response iu", response_code);
-		cmnd->result = DID_ERROR << 16;
+		set_host_byte(cmnd, DID_ERROR);
 		break;
 	}
 
@@ -660,7 +660,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 	spin_lock_irqsave(&devinfo->lock, flags);
 
 	if (devinfo->resetting) {
-		cmnd->result = DID_ERROR << 16;
+		set_host_byte(cmnd, DID_ERROR);
 		cmnd->scsi_done(cmnd);
 		goto zombie;
 	}
@@ -704,7 +704,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 	 * of queueing, no matter how fatal the error
 	 */
 	if (err == -ENODEV) {
-		cmnd->result = DID_ERROR << 16;
+		set_host_byte(cmnd, DID_ERROR);
 		cmnd->scsi_done(cmnd);
 		goto zombie;
 	}
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-09-16  9:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-16  9:40 [PATCHv2] updates to UAS Oliver Neukum
2020-09-16  9:40 ` [PATCH 1/2] UAS: fix disconnect by unplugging a hub Oliver Neukum
2020-09-16  9:40 ` [PATCH 2/2] UAS: use macro for reporting results Oliver Neukum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).