diff mbox

scsi: fix __scsi_error_from_host_byte() breakage

Message ID 20180404181453.30737-1-dgilbert@interlog.com (mailing list archive)
State Superseded
Headers show

Commit Message

Douglas Gilbert April 4, 2018, 6:14 p.m. UTC
Patch e39a97353e53 titled "scsi: core: return BLK_STS_OK for DID_OK in 
__scsi_error_from_host_byte()" attempted to make that function return
BLK_STS_OK when it was given host_byte(result)==DID_OK. While that seems
sensible, it failed to take into account that there may be errors present
in the driver_byte and the status byte. Add those checks and expand
description of function accordingly.

Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
---
The function would be better called blk_status_from_scsi_result(). Is
the leading "__" needed?

 drivers/scsi/scsi_lib.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Bart Van Assche April 4, 2018, 6:23 p.m. UTC | #1
On Wed, 2018-04-04 at 14:14 -0400, Douglas Gilbert wrote:
> Patch e39a97353e53 titled "scsi: core: return BLK_STS_OK for DID_OK in 

> __scsi_error_from_host_byte()" attempted to make that function return

> BLK_STS_OK when it was given host_byte(result)==DID_OK. While that seems

> sensible, it failed to take into account that there may be errors present

> in the driver_byte and the status byte. Add those checks and expand

> description of function accordingly.


Hello Doug,

Please clarify why you posted a new patch instead of reviewing "[PATCH v2]
Fix DID_OK handling in __scsi_error_from_host_byte()". Did you perhaps miss
that patch?

Thanks,

Bart.
diff mbox

Patch

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index aaf485e36450..6a8bf312d82f 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -727,13 +727,18 @@  static bool scsi_end_request(struct request *req, blk_status_t error,
  * @cmd:	SCSI command (unused)
  * @result:	scsi error code
  *
- * Translate SCSI error code into block errors.
+ * Translate SCSI error code into block errors. In the case of result==DID_OK
+ * also check driver and status bytes for errors.
  */
 static blk_status_t __scsi_error_from_host_byte(struct scsi_cmnd *cmd,
 		int result)
 {
 	switch (host_byte(result)) {
 	case DID_OK:
+		if (driver_byte(result) != DRIVER_OK)
+			return BLK_STS_IOERR;
+		else if (status_byte(result) && !scsi_status_is_good(result))
+			return BLK_STS_IOERR;  /* e.g. reservation conflict */
 		return BLK_STS_OK;
 	case DID_TRANSPORT_FAILFAST:
 		return BLK_STS_TRANSPORT;