From f60b3ab985a555cd623b77f6da95cb094da08d2a Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 10 Jun 2021 15:46:56 +0200 Subject: [PATCH 2/2] scsi: do not assume CHECK_CONDITION is set for valid sense code While the standard implies that a sense code should be returned in response to CHECK CONDITION status, it _might_ be returned on other status codes, too. At least, that's what the original code assumed. So it's arguably wrong to assume we only will have a valid sense code when CHECK CONDITION is set. Fixes: 464a00c9e0ad ("scsi: core: Kill DRIVER_SENSE") Signed-off-by: Hannes Reinecke --- drivers/scsi/sd.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 20739072f21a..821bbcfe68c9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1722,8 +1722,7 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr) if (res < 0) return res; - if (scsi_status_is_check_condition(res) && - scsi_sense_valid(sshdr)) { + if (scsi_sense_valid(sshdr)) { sd_print_sense_hdr(sdkp, sshdr); /* we need to evaluate the error return */ @@ -1829,10 +1828,10 @@ static int sd_pr_command(struct block_device *bdev, u8 sa, result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, &data, sizeof(data), &sshdr, SD_TIMEOUT, sdkp->max_retries, NULL); - if (scsi_status_is_check_condition(result) && - scsi_sense_valid(&sshdr)) { + if (result) { sdev_printk(KERN_INFO, sdev, "PR command failed: %d\n", result); - scsi_print_sense_hdr(sdev, NULL, &sshdr); + if (scsi_sense_valid(&sshdr)) + scsi_print_sense_hdr(sdev, NULL, &sshdr); } return result; @@ -2073,7 +2072,7 @@ static int sd_done(struct scsi_cmnd *SCpnt) } sdkp->medium_access_timed_out = 0; - if (!scsi_status_is_check_condition(result) && + if (result && (!sense_valid || sense_deferred)) goto out; @@ -2178,10 +2177,9 @@ sd_spinup_disk(struct scsi_disk *sdkp) retries++; } while (retries < 3 && (!scsi_status_is_good(the_result) || - (scsi_status_is_check_condition(the_result) && - sense_valid && sshdr.sense_key == UNIT_ATTENTION))); + (sense_valid && sshdr.sense_key == UNIT_ATTENTION))); - if (!scsi_status_is_check_condition(the_result)) { + if (the_result < 0 || !sense_valid) { /* no sense, TUR either succeeded or failed * with a status error */ if(!spintime && !scsi_status_is_good(the_result)) { -- 2.26.2