From: Hannes Reinecke <hare@xxxxxxx> On flaky connections the INQUIRY command might run into a timeout, but as we already have performed a REPORT LUNS command we know that a LUN should be present. So ignore errors for the INQUIRY commands, and retry until we exhaust the number of retries. Signed-off-by: Hannes Reinecke <hare@xxxxxxx> Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> --- drivers/scsi/scsi_scan.c | 12 +++++++++--- include/scsi/scsi_devinfo.h | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 91ac901a6682..b9b851ce1b72 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -649,8 +649,6 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result, int pass, count, result; struct scsi_sense_hdr sshdr; - *bflags = 0; - /* Perform up to 3 passes. The first pass uses a conservative * transfer length of 36 unless sdev->inquiry_len specifies a * different value. */ @@ -697,6 +695,11 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result, (sshdr.ascq == 0)) continue; } + if (*bflags & BLIST_RETRY_SCAN) { + SCSI_LOG_SCAN_BUS(3, sdev_printk(KERN_INFO, sdev, + "scsi scan: retry inquiry after REPORT LUNs\n")); + continue; + } } else if (result == 0) { /* * if nothing was transferred, we try @@ -709,6 +712,8 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result, break; } + *bflags = 0; + if (result == 0) { scsi_sanitize_inquiry_string(&inq_result[8], 8); scsi_sanitize_inquiry_string(&inq_result[16], 16); @@ -1531,9 +1536,10 @@ static int scsi_report_lun_scan(struct scsi_target *starget, blist_flags_t bflag " allowed by the host adapter\n", lun); } else { int res; + blist_flags_t bflags = BLIST_RETRY_SCAN; res = scsi_probe_and_add_lun(starget, - lun, NULL, NULL, rescan, NULL); + lun, &bflags, NULL, rescan, NULL); if (res == SCSI_SCAN_NO_RESPONSE) { /* * Got some results, but now none, abort. diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h index 5d14adae21c7..e74a228d73d1 100644 --- a/include/scsi/scsi_devinfo.h +++ b/include/scsi/scsi_devinfo.h @@ -68,8 +68,10 @@ #define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32)) /* Always retry ABORTED_COMMAND with ASC 0xc1 */ #define BLIST_RETRY_ASC_C1 ((__force blist_flags_t)(1ULL << 33)) +/* Retry errors during scanning */ +#define BLIST_RETRY_SCAN ((__force blist_flags_t)(1ULL << 34)) -#define __BLIST_LAST_USED BLIST_RETRY_ASC_C1 +#define __BLIST_LAST_USED BLIST_RETRY_SCAN #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \ (__force blist_flags_t) \ -- 2.36.1