[SCSI] mptfusion: Fix for device offline while doing aggressive HBA reset
[Resend patch as per Bernd Schubert comment ] Issue: Device goes offline while doing aggressive HBA reset along with IO using some utility. Root cause: FW goes into bad state due to aggressive reset. Softreset does not help to recover FW. And also aggressive reset open up the window for Error handling thread to kicked off at the same time HBA will be in constant RESET loop as part of aggressive reset test case can lead Device to goes offline. Changes: 1. Added extra check as below inside eh_timed_out call back as below. if(ioc->ioc_reset_in_progress) Rc = EH_TIMER_RESET 2. Removed " DOORBELL_ACTIVE" check for SAS controller from task management context. Since SAS controller uses high priority queue for task management. This check is not required for SAS controller. 3. Moved SoftReset call to HardReset from Task Mgmt context. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
55a3a35dd4
commit
98cbe371fd
@@ -6474,8 +6474,19 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
|
||||
pReq->Action, ioc->mptbase_cmds.status, timeleft));
|
||||
if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET)
|
||||
goto out;
|
||||
if (!timeleft)
|
||||
if (!timeleft) {
|
||||
spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock,
|
||||
flags);
|
||||
printk(MYIOC_s_INFO_FMT "%s: host reset in"
|
||||
" progress mpt_config timed out.!!\n",
|
||||
__func__, ioc->name);
|
||||
return -EFAULT;
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
issue_hard_reset = 1;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -7189,7 +7200,18 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
|
||||
if (ioc->ioc_reset_in_progress) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
return 0;
|
||||
ioc->wait_on_reset_completion = 1;
|
||||
do {
|
||||
ssleep(1);
|
||||
} while (ioc->ioc_reset_in_progress == 1);
|
||||
ioc->wait_on_reset_completion = 0;
|
||||
return ioc->reset_status;
|
||||
}
|
||||
if (ioc->wait_on_reset_completion) {
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
rc = 0;
|
||||
time_count = jiffies;
|
||||
goto exit;
|
||||
}
|
||||
ioc->ioc_reset_in_progress = 1;
|
||||
if (ioc->alt_ioc)
|
||||
@@ -7226,6 +7248,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
ioc->ioc_reset_in_progress = 0;
|
||||
ioc->taskmgmt_quiesce_io = 0;
|
||||
ioc->taskmgmt_in_progress = 0;
|
||||
ioc->reset_status = rc;
|
||||
if (ioc->alt_ioc) {
|
||||
ioc->alt_ioc->ioc_reset_in_progress = 0;
|
||||
ioc->alt_ioc->taskmgmt_quiesce_io = 0;
|
||||
@@ -7241,7 +7264,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
dtmprintk(ioc,
|
||||
printk(MYIOC_s_DEBUG_FMT
|
||||
"HardResetHandler: completed (%d seconds): %s\n", ioc->name,
|
||||
|
Reference in New Issue
Block a user