All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] Fix DID_OK handling in __scsi_error_from_host_byte()
@ 2018-04-04 17:53 Bart Van Assche
  2018-04-04 18:35 ` Douglas Gilbert
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Bart Van Assche @ 2018-04-04 17:53 UTC (permalink / raw)
  To: Martin K . Petersen, James E . J . Bottomley
  Cc: linux-scsi, Bart Van Assche, Hannes Reinecke, Douglas Gilbert,
	Damien Le Moal, Christoph Hellwig, stable

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 __scsi_error_from_host_byte()")
Reported-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Douglas Gilbert <dgilbert@interlog.com>
Cc: Damien Le Moal <damien.lemoal@wdc.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: stable@vger.kernel.org
---

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
  success.

 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;
 	case DID_TRANSPORT_FAILFAST:
 		return BLK_STS_TRANSPORT;
 	case DID_TARGET_FAILURE:
-- 
2.16.2

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

end of thread, other threads:[~2018-04-05  8:50 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-04 17:53 [PATCH v2] Fix DID_OK handling in __scsi_error_from_host_byte() Bart Van Assche
2018-04-04 18:35 ` Douglas Gilbert
2018-04-04 19:54 ` Lee Duncan
2018-04-05  2:28 ` Damien Le Moal
2018-04-05  6:43 ` Hannes Reinecke
2018-04-05  6:43   ` Hannes Reinecke
2018-04-05  8:50   ` Christoph Hellwig
2018-04-05  8:48 ` Christoph Hellwig

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.