diff options
Diffstat (limited to 'drivers/scsi/scsi_error.c')
-rw-r--r-- | drivers/scsi/scsi_error.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index eaf5a8add1ba..006a95916f72 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -298,6 +298,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost, | |||
298 | */ | 298 | */ |
299 | static int scsi_check_sense(struct scsi_cmnd *scmd) | 299 | static int scsi_check_sense(struct scsi_cmnd *scmd) |
300 | { | 300 | { |
301 | struct scsi_device *sdev = scmd->device; | ||
301 | struct scsi_sense_hdr sshdr; | 302 | struct scsi_sense_hdr sshdr; |
302 | 303 | ||
303 | if (! scsi_command_normalize_sense(scmd, &sshdr)) | 304 | if (! scsi_command_normalize_sense(scmd, &sshdr)) |
@@ -306,6 +307,16 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
306 | if (scsi_sense_is_deferred(&sshdr)) | 307 | if (scsi_sense_is_deferred(&sshdr)) |
307 | return NEEDS_RETRY; | 308 | return NEEDS_RETRY; |
308 | 309 | ||
310 | if (sdev->scsi_dh_data && sdev->scsi_dh_data->scsi_dh && | ||
311 | sdev->scsi_dh_data->scsi_dh->check_sense) { | ||
312 | int rc; | ||
313 | |||
314 | rc = sdev->scsi_dh_data->scsi_dh->check_sense(sdev, &sshdr); | ||
315 | if (rc != SCSI_RETURN_NOT_HANDLED) | ||
316 | return rc; | ||
317 | /* handler does not care. Drop down to default handling */ | ||
318 | } | ||
319 | |||
309 | /* | 320 | /* |
310 | * Previous logic looked for FILEMARK, EOM or ILI which are | 321 | * Previous logic looked for FILEMARK, EOM or ILI which are |
311 | * mainly associated with tapes and returned SUCCESS. | 322 | * mainly associated with tapes and returned SUCCESS. |