]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: megaraid_sas: Do not initiate OCR if controller is not in ready state
authorAnand Lodnoor <anand.lodnoor@broadcom.com>
Tue, 14 Jan 2020 11:21:19 +0000 (16:51 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2020 21:33:28 +0000 (16:33 -0500)
commit 6d7537270e3283b92f9b327da9d58a4de40fe8d0 upstream.

Driver initiates OCR if a DCMD command times out. But there is a deadlock
if the driver attempts to invoke another OCR before the mutex lock
(reset_mutex) is released from the previous session of OCR.

This patch takes care of the above scenario using new flag
MEGASAS_FUSION_OCR_NOT_POSSIBLE to indicate if OCR is possible.

Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/1579000882-20246-9-git-send-email-anand.lodnoor@broadcom.com
Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: Anand Lodnoor <anand.lodnoor@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/megaraid/megaraid_sas_fusion.c
drivers/scsi/megaraid/megaraid_sas_fusion.h

index 99469f9057eeacf2e1bb95a436e4d68852d749d7..21f971447dd8c0abe3b2969e49df4d31c6f7ff40 100644 (file)
@@ -4177,7 +4177,8 @@ dcmd_timeout_ocr_possible(struct megasas_instance *instance) {
        if (instance->adapter_type == MFI_SERIES)
                return KILL_ADAPTER;
        else if (instance->unload ||
-                       test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags))
+                       test_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE,
+                                &instance->reset_flags))
                return IGNORE_TIMEOUT;
        else
                return INITIATE_OCR;
index f45c54f02bfa5c6fef7a29aeeb45c4913f2d8d98..b094a4e55c32f76581c418193027ee1332c2c702 100644 (file)
@@ -4558,6 +4558,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
        if (instance->requestorId && !instance->skip_heartbeat_timer_del)
                del_timer_sync(&instance->sriov_heartbeat_timer);
        set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags);
+       set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags);
        atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING);
        instance->instancet->disable_intr(instance);
        megasas_sync_irqs((unsigned long)instance);
@@ -4747,7 +4748,7 @@ fail_kill_adapter:
                atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL);
        }
 out:
-       clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags);
+       clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags);
        mutex_unlock(&instance->reset_mutex);
        return retval;
 }
index 8e5ebee6517f0994faf7a7a7cfb55e1a98e00307..df7bbd0354e9a026d384ccd40c3fcd91c56404c2 100644 (file)
@@ -102,6 +102,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {
 
 #define MEGASAS_FP_CMD_LEN     16
 #define MEGASAS_FUSION_IN_RESET 0
+#define MEGASAS_FUSION_OCR_NOT_POSSIBLE 1
 #define THRESHOLD_REPLY_COUNT 50
 #define RAID_1_PEER_CMDS 2
 #define JBOD_MAPS_COUNT        2