scsi: mpt3sas: Prevent error handler escalation when device removed
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Tue, 16 Aug 2022 08:08:01 +0000 (13:38 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 1 Sep 2022 04:08:35 +0000 (00:08 -0400)
If SCSI error handling is taking place for timed out I/Os on a drive and
the corresponding drive is removed, then stop escalating to higher level of
reset by returning the TUR with "I_T NEXUS LOSS OCCURRED" sense key.

Link: https://lore.kernel.org/r/20220816080801.13929-1-sreekanth.reddy@broadcom.com
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_scsih.c

index 3507e2a..514ae8f 100644 (file)
@@ -5156,6 +5156,19 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
 
        /* invalid device handle */
        handle = sas_target_priv_data->handle;
+
+       /*
+        * Avoid error handling escallation when device is disconnected
+        */
+       if (handle == MPT3SAS_INVALID_DEVICE_HANDLE || sas_device_priv_data->block) {
+               if (scmd->device->host->shost_state == SHOST_RECOVERY &&
+                   scmd->cmnd[0] == TEST_UNIT_READY) {
+                       scsi_build_sense(scmd, 0, UNIT_ATTENTION, 0x29, 0x07);
+                       scsi_done(scmd);
+                       return 0;
+               }
+       }
+
        if (handle == MPT3SAS_INVALID_DEVICE_HANDLE) {
                scmd->result = DID_NO_CONNECT << 16;
                scsi_done(scmd);