scsi: megaraid_sas: Do not initiate OCR if controller is not in ready state
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>
This commit is contained in:
Родитель
201a810cc1
Коммит
6d7537270e
|
@ -4403,7 +4403,8 @@ dcmd_timeout_ocr_possible(struct megasas_instance *instance) {
|
||||||
if (instance->adapter_type == MFI_SERIES)
|
if (instance->adapter_type == MFI_SERIES)
|
||||||
return KILL_ADAPTER;
|
return KILL_ADAPTER;
|
||||||
else if (instance->unload ||
|
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;
|
return IGNORE_TIMEOUT;
|
||||||
else
|
else
|
||||||
return INITIATE_OCR;
|
return INITIATE_OCR;
|
||||||
|
|
|
@ -4851,6 +4851,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
|
||||||
if (instance->requestorId && !instance->skip_heartbeat_timer_del)
|
if (instance->requestorId && !instance->skip_heartbeat_timer_del)
|
||||||
del_timer_sync(&instance->sriov_heartbeat_timer);
|
del_timer_sync(&instance->sriov_heartbeat_timer);
|
||||||
set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags);
|
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);
|
atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING);
|
||||||
instance->instancet->disable_intr(instance);
|
instance->instancet->disable_intr(instance);
|
||||||
megasas_sync_irqs((unsigned long)instance);
|
megasas_sync_irqs((unsigned long)instance);
|
||||||
|
@ -5059,7 +5060,7 @@ kill_hba:
|
||||||
instance->skip_heartbeat_timer_del = 1;
|
instance->skip_heartbeat_timer_del = 1;
|
||||||
retval = FAILED;
|
retval = FAILED;
|
||||||
out:
|
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);
|
mutex_unlock(&instance->reset_mutex);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {
|
||||||
|
|
||||||
#define MEGASAS_FP_CMD_LEN 16
|
#define MEGASAS_FP_CMD_LEN 16
|
||||||
#define MEGASAS_FUSION_IN_RESET 0
|
#define MEGASAS_FUSION_IN_RESET 0
|
||||||
|
#define MEGASAS_FUSION_OCR_NOT_POSSIBLE 1
|
||||||
#define RAID_1_PEER_CMDS 2
|
#define RAID_1_PEER_CMDS 2
|
||||||
#define JBOD_MAPS_COUNT 2
|
#define JBOD_MAPS_COUNT 2
|
||||||
#define MEGASAS_REDUCE_QD_COUNT 64
|
#define MEGASAS_REDUCE_QD_COUNT 64
|
||||||
|
|
Загрузка…
Ссылка в новой задаче