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

scsi: devinfo: BLIST_RETRY_ASC_C1 for Fujitsu ETERNUS

On Fujitsu ETERNUS systems, sense code ABORTED COMMAND with ASC/Q C1/01
is used to indicate temporary condition where the storage-internal path
to a target is switched from one controller to another. SCSI commands
that return with this error code must be retried unconditionally
(i.e. without the "maybe_retry" logic in scsi_decide_disposition);
otherwise dm-multipath might initiate a failover from a healthy path
e.g. for REQ_FAILFAST_DEV commands.

Introduce a new blist flag for this case.

[mkp: applied by hand]

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
c3606520 29cfc2ab

+7 -1
+1
drivers/scsi/scsi_devinfo.c
··· 168 168 {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN}, 169 169 {"easyRAID", "F8", NULL, BLIST_NOREPORTLUN}, 170 170 {"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, 171 + {"FUJITSU", "ETERNUS_DXM", "*", BLIST_RETRY_ASC_C1}, 171 172 {"Generic", "USB SD Reader", "1.00", BLIST_FORCELUN | BLIST_INQUIRY_36}, 172 173 {"Generic", "USB Storage-SMC", NULL, BLIST_FORCELUN | BLIST_INQUIRY_36}, /* FW: 0180 and 0207 */ 173 174 {"HITACHI", "DF400", "*", BLIST_REPORTLUN2},
+3
drivers/scsi/scsi_error.c
··· 528 528 529 529 if (sshdr.asc == 0x44 && sdev->sdev_bflags & BLIST_RETRY_ITF) 530 530 return ADD_TO_MLQUEUE; 531 + if (sshdr.asc == 0xc1 && sshdr.ascq == 0x01 && 532 + sdev->sdev_bflags & BLIST_RETRY_ASC_C1) 533 + return ADD_TO_MLQUEUE; 531 534 532 535 return NEEDS_RETRY; 533 536 case NOT_READY:
+3 -1
include/scsi/scsi_devinfo.h
··· 65 65 #define BLIST_UNMAP_LIMIT_WS ((__force blist_flags_t)(1ULL << 31)) 66 66 /* Always retry ABORTED_COMMAND with Internal Target Failure */ 67 67 #define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32)) 68 + /* Always retry ABORTED_COMMAND with ASC 0xc1 */ 69 + #define BLIST_RETRY_ASC_C1 ((__force blist_flags_t)(1ULL << 33)) 68 70 69 - #define __BLIST_LAST_USED BLIST_RETRY_ITF 71 + #define __BLIST_LAST_USED BLIST_RETRY_ASC_C1 70 72 71 73 #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \ 72 74 (__force blist_flags_t) \