aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2018-03-06 22:19:49 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2018-03-12 21:55:24 -0400
commit1875ede02ed5e176a18dccbca84abc28d5b3e141 (patch)
treec7a0a73e81d05167239453a135f6b85859552297 /drivers/scsi/scsi_lib.c
parent217c55cd0cea8f03a5ef2faf68681bb10ae22573 (diff)
scsi: core: Make SCSI Status CONDITION MET equivalent to GOOD
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. Signed-off-by: Douglas Gilbert <dgilbert@interlog.com> Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 10430d500792..393f9db8f41b 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -867,6 +867,17 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
867 /* for passthrough error may be set */ 867 /* for passthrough error may be set */
868 error = BLK_STS_OK; 868 error = BLK_STS_OK;
869 } 869 }
870 /*
871 * Another corner case: the SCSI status byte is non-zero but 'good'.
872 * Example: PRE-FETCH command returns SAM_STAT_CONDITION_MET when
873 * it is able to fit nominated LBs in its cache (and SAM_STAT_GOOD
874 * if it can't fit). Treat SAM_STAT_CONDITION_MET and the related
875 * intermediate statuses (both obsolete in SAM-4) as good.
876 */
877 if (status_byte(result) && scsi_status_is_good(result)) {
878 result = 0;
879 error = BLK_STS_OK;
880 }
870 881
871 /* 882 /*
872 * special case: failed zero length commands always need to 883 * special case: failed zero length commands always need to