This patch started as an attempt to fix the erroneous handling of
CONDITION MET, a relatively rare special case. A solution meant adding
another special case to the already complicated scsi_io_completion()
function. To better understand that function the author found it
useful to refactor the function into one relatively short function
that the fast path passes through and two helper functions. These
helper functions do the bulk of the error and special case handling.

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.

Future work: if the sd driver was to use the PRE-FETCH command,
decide whether it and/or the block layer needs to know about the
two different "good" statuses. If so a mechanism would be needed
to do that.

ChangeLog for v2:
  - after checkpatch.pl warning about BUG statements and confirmed
    by a reviewer, convert 3 BUG calls in scsi_io_completion()
    into WARN calls

ChangeLog for v1:
  - split scsi_io_completion() into one short function that the
    fast path uses, and two helper functions
  - add conditional hints on the fast path
  - rename some variables to make the code a little clearer
  - add scsi_io_completion_nz_result() helper for the initial
    handling of the non-zero cmd->result case
  - add scsi_io_completion_action() helper for the 'action'
    processing of errors and special cases
  - expand inline function scsi_status_is_good() to check for
    CONDITION MET
  - add a corner case in scsi_io_completion_nz_result() for
    CONDITION MET (and similar "good" SCSI statuses)
  - structure code so extra checks are only on the error
    path (i.e. when cmd->result is non-zero)

This patch is against mkp's 4.17/scsi-queue branch. It also
 applies to lk 4.15.x where it was tested on a SAS SSD.


Douglas Gilbert (2):
  scsi_io_completion cleanup and fix CONDITION MET handling
  scsi_io_completion-change2warn

 drivers/scsi/scsi_lib.c | 304 +++++++++++++++++++++++++++++-------------------
 include/scsi/scsi.h     |   2 +
 2 files changed, 188 insertions(+), 118 deletions(-)

-- 
2.14.1

Reply via email to