[SCSI] mpt2sas: Prevent sending command to FW while Host Reset
This patch renames the flag for indicating host reset from ioc_reset_in_progress to shost_recovery. It also removes the spin locks surrounding the setting of this flag, which are unnecessary. Sanity checks on the shost_recovery flag were added thru out the code so as to prevent sending firmware commands during host reset. Also, the setting of the shost state to SHOST_RECOVERY was removed to prevent deadlocks, this is actually better handled by the shost_recovery flag. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Reviewed-by: Eric Moore <Eric.moore@lsi.com> Cc: Stable Tree <stable@kernel.org> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
committed by
James Bottomley
parent
cd4e12e8ad
commit
155dd4c763
@@ -94,7 +94,7 @@ _base_fault_reset_work(struct work_struct *work)
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress)
|
||||
if (ioc->shost_recovery)
|
||||
goto rearm_timer;
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
|
||||
@@ -3501,20 +3501,13 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
|
||||
__func__));
|
||||
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
if (ioc->shost_recovery) {
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
printk(MPT2SAS_ERR_FMT "%s: busy\n",
|
||||
ioc->name, __func__);
|
||||
return -EBUSY;
|
||||
}
|
||||
ioc->ioc_reset_in_progress = 1;
|
||||
ioc->shost_recovery = 1;
|
||||
if (ioc->shost->shost_state == SHOST_RUNNING) {
|
||||
/* set back to SHOST_RUNNING in mpt2sas_scsih.c */
|
||||
scsi_host_set_state(ioc->shost, SHOST_RECOVERY);
|
||||
printk(MPT2SAS_INFO_FMT "putting controller into "
|
||||
"SHOST_RECOVERY\n", ioc->name);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
|
||||
_base_reset_handler(ioc, MPT2_IOC_PRE_RESET);
|
||||
@@ -3534,7 +3527,7 @@ mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
|
||||
ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED")));
|
||||
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
ioc->ioc_reset_in_progress = 0;
|
||||
ioc->shost_recovery = 0;
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
|
||||
if (!r)
|
||||
|
Reference in New Issue
Block a user