Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: devinfo: add BLIST_RETRY_ITF for EMC Symmetrix

EMC Symmetrix returns 'internal target error' for a variety of
conditions, most of which will be transient. So we should always retry
it, even with failfast set. Otherwise we'd get spurious path flaps with
multipath.

Signed-off-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Martin Wilck and committed by
Martin K. Petersen
29cfc2ab 358fda5f

+9 -2
+2 -1
drivers/scsi/scsi_devinfo.c
··· 161 161 {"DGC", "RAID", NULL, BLIST_SPARSELUN}, /* EMC CLARiiON, storage on LUN 0 */ 162 162 {"DGC", "DISK", NULL, BLIST_SPARSELUN}, /* EMC CLARiiON, no storage on LUN 0 */ 163 163 {"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, 164 - {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_REPORTLUN2}, 164 + {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | 165 + BLIST_REPORTLUN2 | BLIST_RETRY_ITF}, 165 166 {"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN}, 166 167 {"easyRAID", "16P", NULL, BLIST_NOREPORTLUN}, 167 168 {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN},
+4
drivers/scsi/scsi_error.c
··· 38 38 #include <scsi/scsi_host.h> 39 39 #include <scsi/scsi_ioctl.h> 40 40 #include <scsi/scsi_dh.h> 41 + #include <scsi/scsi_devinfo.h> 41 42 #include <scsi/sg.h> 42 43 43 44 #include "scsi_priv.h" ··· 525 524 case ABORTED_COMMAND: 526 525 if (sshdr.asc == 0x10) /* DIF */ 527 526 return SUCCESS; 527 + 528 + if (sshdr.asc == 0x44 && sdev->sdev_bflags & BLIST_RETRY_ITF) 529 + return ADD_TO_MLQUEUE; 528 530 529 531 return NEEDS_RETRY; 530 532 case NOT_READY:
+3 -1
include/scsi/scsi_devinfo.h
··· 63 63 #define BLIST_MAX_1024 ((__force blist_flags_t)(1ULL << 30)) 64 64 /* Use UNMAP limit for WRITE SAME */ 65 65 #define BLIST_UNMAP_LIMIT_WS ((__force blist_flags_t)(1ULL << 31)) 66 + /* Always retry ABORTED_COMMAND with Internal Target Failure */ 67 + #define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32)) 66 68 67 - #define __BLIST_LAST_USED BLIST_UNMAP_LIMIT_WS 69 + #define __BLIST_LAST_USED BLIST_RETRY_ITF 68 70 69 71 #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \ 70 72 (__force blist_flags_t) \