diff mbox

[v4] Make SCSI Status CONDITION MET equivalent to GOOD

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

Commit Message

Douglas Gilbert March 7, 2018, 3:19 a.m. UTC
The SCSI PRE-FETCH (10 or 16) command is present both on hard disks
and some SSDs. It is useful when the address of the next block(s) to
be read is known but it is not following the LBA of the current READ
(so read-ahead won't help). It returns two "good" SCSI Status values.
If the requested blocks have fitted (or will most likely fit (when
the IMMED bit is set)) into the disk's cache, it returns CONDITION
MET. If it didn't (or will not) fit then it returns GOOD status.

The goal of this patch is to stop the SCSI subsystem treating the
CONDITION MET SCSI status as an error. The current state makes the
PRE-FETCH command effectively unusable via pass-throughs.

A cleanup of the scsi_io_completion() function in scsi_lib.c has
been moved out of this patch to its own patchset titled:
"scsi_io_completion cleanup".


ChangeLog to v4 (removing work done in v3 and v2, leaving):
  - expand scsi_status_is_good() to check for CONDITION MET
  - add another corner case in scsi_io_completion() adjacent
    to the one for the RECOVERED ERROR sense key case. That
    is another "non-error"

Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
---
 drivers/scsi/scsi_lib.c | 11 +++++++++++
 include/scsi/scsi.h     |  2 ++
 2 files changed, 13 insertions(+)

Comments

Bart Van Assche March 12, 2018, 3:16 p.m. UTC | #1
On Tue, 2018-03-06 at 22:19 -0500, Douglas Gilbert wrote:
> The SCSI PRE-FETCH (10 or 16) command is present both on hard disks

> and some SSDs. It is useful when the address of the next block(s) to

> be read is known but it is not following the LBA of the current READ

> (so read-ahead won't help). It returns two "good" SCSI Status values.

> If the requested blocks have fitted (or will most likely fit (when

> the IMMED bit is set)) into the disk's cache, it returns CONDITION

> MET. If it didn't (or will not) fit then it returns GOOD status.

> 

> The goal of this patch is to stop the SCSI subsystem treating the

> CONDITION MET SCSI status as an error. The current state makes the

> PRE-FETCH command effectively unusable via pass-throughs.

> 

> A cleanup of the scsi_io_completion() function in scsi_lib.c has

> been moved out of this patch to its own patchset titled:

> "scsi_io_completion cleanup".


Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
Martin K. Petersen March 13, 2018, 1:58 a.m. UTC | #2
Doug,

> The SCSI PRE-FETCH (10 or 16) command is present both on hard disks
> and some SSDs. It is useful when the address of the next block(s) to
> be read is known but it is not following the LBA of the current READ
> (so read-ahead won't help). It returns two "good" SCSI Status values.
> If the requested blocks have fitted (or will most likely fit (when
> the IMMED bit is set)) into the disk's cache, it returns CONDITION
> MET. If it didn't (or will not) fit then it returns GOOD status.
>
> The goal of this patch is to stop the SCSI subsystem treating the
> CONDITION MET SCSI status as an error. The current state makes the
> PRE-FETCH command effectively unusable via pass-throughs.

Next time, commentary and changelog needs to go after the "---"
separator:

> A cleanup of the scsi_io_completion() function in scsi_lib.c has
> been moved out of this patch to its own patchset titled:
> "scsi_io_completion cleanup".
>
>
> ChangeLog to v4 (removing work done in v3 and v2, leaving):
>   - expand scsi_status_is_good() to check for CONDITION MET
>   - add another corner case in scsi_io_completion() adjacent
>     to the one for the RECOVERED ERROR sense key case. That
>     is another "non-error"
>
> Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
> ---

<< Here

>  drivers/scsi/scsi_lib.c | 11 +++++++++++
>  include/scsi/scsi.h     |  2 ++
>  2 files changed, 13 insertions(+)

Applied to 4.17/scsi-queue. Thank you!
diff mbox

Patch

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index aea5a1ae318b..142400476d84 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -855,6 +855,17 @@  void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 		/* for passthrough error may be set */
 		error = BLK_STS_OK;
 	}
+	/*
+	 * Another corner case: the SCSI status byte is non-zero but 'good'.
+	 * Example: PRE-FETCH command returns SAM_STAT_CONDITION_MET when
+	 * it is able to fit nominated LBs in its cache (and SAM_STAT_GOOD
+	 * if it can't fit). Treat SAM_STAT_CONDITION_MET and the related
+	 * intermediate statuses (both obsolete in SAM-4) as good.
+	 */
+	if (status_byte(result) && scsi_status_is_good(result)) {
+		result = 0;
+		error = BLK_STS_OK;
+	}
 
 	/*
 	 * special case: failed zero length commands always need to
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index cb85eddb47ea..eb7853c1a23b 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -47,6 +47,8 @@  static inline int scsi_status_is_good(int status)
 	 */
 	status &= 0xfe;
 	return ((status == SAM_STAT_GOOD) ||
+		(status == SAM_STAT_CONDITION_MET) ||
+		/* Next two "intermediate" statuses are obsolete in SAM-4 */
 		(status == SAM_STAT_INTERMEDIATE) ||
 		(status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
 		/* FIXME: this is obsolete in SAM-3 */