Commit e39a97353e53 modified __scsi_error_from_host_byte() such
that that function translates DID_OK into BLK_STS_OK. However,
the description of that commit is wrong: it mentions that commit
2a842acab109 introduced a bug in __scsi_error_from_host_byte()
although that commit did not change the behavior of that function.
Additionally, commit e39a97353e53 introduced a severe bug: it causes
commands that fail with hostbyte=DID_OK and driverbyte=DRIVER_SENSE
to be completed with BLK_STS_OK. Fix __scsi_error_from_host_byte()
by only translating good status values into BLK_STS_OK.

Fixes: e39a97353e53 ("scsi: core: return BLK_STS_OK for DID_OK in 
Reported-by: Damien Le Moal <>
Signed-off-by: Bart Van Assche <>
Cc: Hannes Reinecke <>
Cc: Douglas Gilbert <>
Cc: Damien Le Moal <>
Cc: Christoph Hellwig <>

Changes compared to v1:
- Modified __scsi_error_from_host_byte() such that it again returns
  BLK_STS_OK for CONDITION MET and other result codes that represent

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

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 74a39db57d49..1496b34af409 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -736,7 +736,13 @@ static blk_status_t __scsi_error_from_host_byte(struct 
scsi_cmnd *cmd,
        switch (host_byte(result)) {
        case DID_OK:
-               return BLK_STS_OK;
+               /*
+                * Also check the other bytes than the status byte in result
+                * to handle the case when a SCSI LLD sets result to
+                * DRIVER_SENSE << 24 without setting SAM_STAT_CHECK_CONDITION.
+                */
+               return scsi_status_is_good(result) && (result & ~0xff) == 0 ?
+                       BLK_STS_OK : BLK_STS_IOERR;
                return BLK_STS_TRANSPORT;
        case DID_TARGET_FAILURE:

Reply via email to