Commit 06918ac5 authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.45: Fixed crash during driver unload.

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent e10b2022
...@@ -6223,11 +6223,11 @@ lpfc_els_timeout(unsigned long ptr) ...@@ -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) ...@@ -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,8 +6328,9 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport) ...@@ -6319,8 +6328,9 @@ 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))
mod_timer(&vport->els_tmofunc, if (!(phba->pport->load_flag & FC_UNLOADING))
jiffies + msecs_to_jiffies(1000 * timeout)); mod_timer(&vport->els_tmofunc,
jiffies + msecs_to_jiffies(1000 * timeout));
} }
/** /**
......
...@@ -1006,9 +1006,14 @@ lpfc_rrq_timeout(unsigned long ptr) ...@@ -1006,9 +1006,14 @@ 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);
phba->hba_flag |= HBA_RRQ_ACTIVE; if (!(phba->pport->load_flag & FC_UNLOADING))
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);
lpfc_worker_wake_up(phba);
if (!(phba->pport->load_flag & FC_UNLOADING))
lpfc_worker_wake_up(phba);
} }
/** /**
......
...@@ -678,7 +678,8 @@ lpfc_handle_rrq_active(struct lpfc_hba *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) ...@@ -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, ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment