scsi: lpfc: Fix pt2pt state transition causing rmmod hang
On a setup with a dual port HBA and both ports direct connected, an rmmod hangs momentarily when we log an Illegal State Transition. Once it resumes, a nodelist not empty logic is hit, which forces rmmod to cleanup and exit. We're missing a state transition case in the discovery engine. Fix by adding a case for a DEVICE_RM event while in the unmapped state to avoid illegal state transition log message. Link: https://lore.kernel.org/r/20210301171821.3427-17-jsmart2021@gmail.com Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
bb6fd33e3a
commit
debbc1e2b9
|
@ -2485,6 +2485,16 @@ lpfc_rcv_prlo_unmap_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
|||
return ndlp->nlp_state;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
lpfc_device_rm_unmap_node(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp,
|
||||
void *arg,
|
||||
uint32_t evt)
|
||||
{
|
||||
lpfc_drop_node(vport, ndlp);
|
||||
return NLP_STE_FREED_NODE;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
lpfc_device_recov_unmap_node(struct lpfc_vport *vport,
|
||||
struct lpfc_nodelist *ndlp,
|
||||
|
@ -2978,7 +2988,7 @@ static uint32_t (*lpfc_disc_action[NLP_STE_MAX_STATE * NLP_EVT_MAX_EVENT])
|
|||
lpfc_disc_illegal, /* CMPL_LOGO */
|
||||
lpfc_disc_illegal, /* CMPL_ADISC */
|
||||
lpfc_disc_illegal, /* CMPL_REG_LOGIN */
|
||||
lpfc_disc_illegal, /* DEVICE_RM */
|
||||
lpfc_device_rm_unmap_node, /* DEVICE_RM */
|
||||
lpfc_device_recov_unmap_node, /* DEVICE_RECOVERY */
|
||||
|
||||
lpfc_rcv_plogi_mapped_node, /* RCV_PLOGI MAPPED_NODE */
|
||||
|
|
Loading…
Reference in New Issue