[SCSI] lpfc: Fixes in mbox_timeout_handler
Analysis: Timeout of READ_SPARM64 causes call to lpfc_mbox_timeout_handler which reads psli->mbox_active to determine the timeout mbox. Timeout handler then NULL's psli->mbox_active and calls lpfc_mbx_cmpl_read_sparam(), which on timeout condition, calls link_down(). link_down() now calls disc_done() which calls mbox_timeout_hander() again since WORKER_MBOX_TMO is still set, which goes back to read psli->mbox_active which is already NULL'ed. Remove redundant if statement in lpfc_mbox_timeout_handler. pmbox is assigned psli->mbox_active so there is no need to check if it actually equals psli->mbox_active. Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
6e8215e488
commit
db468d108a
@@ -1724,6 +1724,8 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
phba->work_hba_events &= ~WORKER_MBOX_TMO;
|
||||||
|
|
||||||
pmbox = phba->sli.mbox_active;
|
pmbox = phba->sli.mbox_active;
|
||||||
mb = &pmbox->mb;
|
mb = &pmbox->mb;
|
||||||
|
|
||||||
@@ -1738,16 +1740,14 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba)
|
|||||||
phba->sli.sli_flag,
|
phba->sli.sli_flag,
|
||||||
phba->sli.mbox_active);
|
phba->sli.mbox_active);
|
||||||
|
|
||||||
if (phba->sli.mbox_active == pmbox) {
|
phba->sli.mbox_active = NULL;
|
||||||
phba->sli.mbox_active = NULL;
|
if (pmbox->mbox_cmpl) {
|
||||||
if (pmbox->mbox_cmpl) {
|
mb->mbxStatus = MBX_NOT_FINISHED;
|
||||||
mb->mbxStatus = MBX_NOT_FINISHED;
|
spin_unlock_irq(phba->host->host_lock);
|
||||||
spin_unlock_irq(phba->host->host_lock);
|
(pmbox->mbox_cmpl) (phba, pmbox);
|
||||||
(pmbox->mbox_cmpl) (phba, pmbox);
|
spin_lock_irq(phba->host->host_lock);
|
||||||
spin_lock_irq(phba->host->host_lock);
|
|
||||||
}
|
|
||||||
phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
|
||||||
}
|
}
|
||||||
|
phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
||||||
|
|
||||||
spin_unlock_irq(phba->host->host_lock);
|
spin_unlock_irq(phba->host->host_lock);
|
||||||
lpfc_mbox_abort(phba);
|
lpfc_mbox_abort(phba);
|
||||||
|
Reference in New Issue
Block a user