[PATCH v2 30/35] scsi: Have scsi-ml retry scsi_report_lun_scan errors

Mike Christie
2022-09-29T02:56:38Z

This has scsi_report_lun_scan have scsi-ml retry errors instead of driving
them itself.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
drivers/scsi/scsi_scan.c | 54 +++++++++++++++++++---------------------
1 file changed, 25 insertions(+), 29 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 4c2e8d1baf43..b783360c38cc 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -1420,13 +1420,21 @@ static int scsi_report_lun_scan(struct scsi_target *starget, blist_flags_t bflag
unsigned int length;
u64 lun;
unsigned int num_luns;
- unsigned int retries;
int result;
struct scsi_lun *lunp, *lun_data;
- struct scsi_sense_hdr sshdr;
struct scsi_device *sdev;
struct Scsi_Host *shost = dev_to_shost(&starget->dev);
int ret = 0;
+ struct scsi_failure failures[] = {
+ {
+ .sense = UNIT_ATTENTION,
+ .asc = SCMD_FAILURE_ASC_ANY,
+ .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .allowed = 3,
+ .result = SAM_STAT_CHECK_CONDITION,
+ },
+ {},
+ };

/*
* Only support SCSI-3 and up devices if BLIST_NOREPORTLUN is not set.
@@ -1495,34 +1503,22 @@ static int scsi_report_lun_scan(struct scsi_target *starget, blist_flags_t bflag
* should come through as a check condition, and will not generate
* a retry.
*/
- for (retries = 0; retries < 3; retries++) {
- SCSI_LOG_SCAN_BUS(3, sdev_printk (KERN_INFO, sdev,
- "scsi scan: Sending REPORT LUNS to (try %d)\n",
- retries));
-
- result = scsi_exec_req(((struct scsi_exec_args) {
- .sdev = sdev,
- .cmd = scsi_cmd,
- .data_dir = DMA_FROM_DEVICE,
- .buf = lun_data,
- .buf_len = length,
- .sshdr = &sshdr,
- .timeout = SCSI_REPORT_LUNS_TIMEOUT,
- .retries = 3 }));
-
- SCSI_LOG_SCAN_BUS(3, sdev_printk (KERN_INFO, sdev,
- "scsi scan: REPORT LUNS"
- " %s (try %d) result 0x%x\n",
- result ? "failed" : "successful",
- retries, result));
- if (result == 0)
- break;
- else if (scsi_sense_valid(&sshdr)) {
- if (sshdr.sense_key != UNIT_ATTENTION)
- break;
- }
- }
+ SCSI_LOG_SCAN_BUS(3, sdev_printk (KERN_INFO, sdev,
+ "scsi scan: Sending REPORT LUNS\n"));
+
+ result = scsi_exec_req(((struct scsi_exec_args) {
+ .sdev = sdev,
+ .cmd = scsi_cmd,
+ .data_dir = DMA_FROM_DEVICE,
+ .buf = lun_data,
+ .buf_len = length,
+ .timeout = SCSI_REPORT_LUNS_TIMEOUT,
+ .retries = 3,
+ .failures = failures }));

+ SCSI_LOG_SCAN_BUS(3, sdev_printk (KERN_INFO, sdev,
+ "scsi scan: REPORT LUNS %s result 0x%x\n",
+ result ? "failed" : "successful", result));
if (result) {
/*
* The device probably does not support a REPORT LUN command
--
2.25.1