[SCSI] lpfc 8.3.45: Fixed crash during driver unload.
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
e10b2022f9
commit
06918ac566
|
@ -6223,11 +6223,11 @@ lpfc_els_timeout(unsigned long ptr)
|
||||||
|
|
||||||
spin_lock_irqsave(&vport->work_port_lock, iflag);
|
spin_lock_irqsave(&vport->work_port_lock, iflag);
|
||||||
tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
|
tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
|
||||||
if (!tmo_posted)
|
if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
|
||||||
vport->work_port_events |= WORKER_ELS_TMO;
|
vport->work_port_events |= WORKER_ELS_TMO;
|
||||||
spin_unlock_irqrestore(&vport->work_port_lock, iflag);
|
spin_unlock_irqrestore(&vport->work_port_lock, iflag);
|
||||||
|
|
||||||
if (!tmo_posted)
|
if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
|
||||||
lpfc_worker_wake_up(phba);
|
lpfc_worker_wake_up(phba);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6259,10 +6259,19 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport)
|
||||||
timeout = (uint32_t)(phba->fc_ratov << 1);
|
timeout = (uint32_t)(phba->fc_ratov << 1);
|
||||||
|
|
||||||
pring = &phba->sli.ring[LPFC_ELS_RING];
|
pring = &phba->sli.ring[LPFC_ELS_RING];
|
||||||
|
if ((phba->pport->load_flag & FC_UNLOADING))
|
||||||
|
return;
|
||||||
spin_lock_irq(&phba->hbalock);
|
spin_lock_irq(&phba->hbalock);
|
||||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||||
spin_lock(&pring->ring_lock);
|
spin_lock(&pring->ring_lock);
|
||||||
|
|
||||||
|
if ((phba->pport->load_flag & FC_UNLOADING)) {
|
||||||
|
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||||
|
spin_unlock(&pring->ring_lock);
|
||||||
|
spin_unlock_irq(&phba->hbalock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
|
list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
|
||||||
cmd = &piocb->iocb;
|
cmd = &piocb->iocb;
|
||||||
|
|
||||||
|
@ -6319,6 +6328,7 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!list_empty(&phba->sli.ring[LPFC_ELS_RING].txcmplq))
|
if (!list_empty(&phba->sli.ring[LPFC_ELS_RING].txcmplq))
|
||||||
|
if (!(phba->pport->load_flag & FC_UNLOADING))
|
||||||
mod_timer(&vport->els_tmofunc,
|
mod_timer(&vport->els_tmofunc,
|
||||||
jiffies + msecs_to_jiffies(1000 * timeout));
|
jiffies + msecs_to_jiffies(1000 * timeout));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1006,8 +1006,13 @@ lpfc_rrq_timeout(unsigned long ptr)
|
||||||
|
|
||||||
phba = (struct lpfc_hba *)ptr;
|
phba = (struct lpfc_hba *)ptr;
|
||||||
spin_lock_irqsave(&phba->pport->work_port_lock, iflag);
|
spin_lock_irqsave(&phba->pport->work_port_lock, iflag);
|
||||||
|
if (!(phba->pport->load_flag & FC_UNLOADING))
|
||||||
phba->hba_flag |= HBA_RRQ_ACTIVE;
|
phba->hba_flag |= HBA_RRQ_ACTIVE;
|
||||||
|
else
|
||||||
|
phba->hba_flag &= ~HBA_RRQ_ACTIVE;
|
||||||
spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag);
|
spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag);
|
||||||
|
|
||||||
|
if (!(phba->pport->load_flag & FC_UNLOADING))
|
||||||
lpfc_worker_wake_up(phba);
|
lpfc_worker_wake_up(phba);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -678,7 +678,8 @@ lpfc_handle_rrq_active(struct lpfc_hba *phba)
|
||||||
next_time = rrq->rrq_stop_time;
|
next_time = rrq->rrq_stop_time;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||||
if (!list_empty(&phba->active_rrq_list))
|
if ((!list_empty(&phba->active_rrq_list)) &&
|
||||||
|
(!(phba->pport->load_flag & FC_UNLOADING)))
|
||||||
mod_timer(&phba->rrq_tmr, next_time);
|
mod_timer(&phba->rrq_tmr, next_time);
|
||||||
list_for_each_entry_safe(rrq, nextrrq, &send_rrq, list) {
|
list_for_each_entry_safe(rrq, nextrrq, &send_rrq, list) {
|
||||||
list_del(&rrq->list);
|
list_del(&rrq->list);
|
||||||
|
@ -792,7 +793,9 @@ lpfc_cleanup_wt_rrqs(struct lpfc_hba *phba)
|
||||||
list_del(&rrq->list);
|
list_del(&rrq->list);
|
||||||
lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
|
lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
|
||||||
}
|
}
|
||||||
if (!list_empty(&phba->active_rrq_list))
|
if ((!list_empty(&phba->active_rrq_list)) &&
|
||||||
|
(!(phba->pport->load_flag & FC_UNLOADING)))
|
||||||
|
|
||||||
mod_timer(&phba->rrq_tmr, next_time);
|
mod_timer(&phba->rrq_tmr, next_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1323,7 +1326,8 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||||
|
|
||||||
if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
|
if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
|
||||||
(piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
|
(piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
|
||||||
(piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
|
(piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN) &&
|
||||||
|
(!(piocb->vport->load_flag & FC_UNLOADING))) {
|
||||||
if (!piocb->vport)
|
if (!piocb->vport)
|
||||||
BUG();
|
BUG();
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue