Commit aba0fb0e authored by Justin Tee's avatar Justin Tee Committed by Martin K. Petersen

scsi: lpfc: Move determination of vmid_flag after VMID reinitialization completes

If priority tagging is set in the service parameters of a FLOGI cmpl, then
we update the vmid_flag.  In the current logic, if a follow up FLOGI cmpl
updates its service parameters such that priority tagging is no longer set,
then the vmid_flag ends up keeping stale data.

Fix by ensuring we clear the vmid_flag member during lpfc_reinit_vmid, and
check the priority tagging service parameter after reinitialization of the
vmid data structures.
Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20231207224039.35466-4-justintee8345@gmail.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8dc8eb89
...@@ -1130,12 +1130,12 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ...@@ -1130,12 +1130,12 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
vport->port_state, vport->fc_flag, vport->port_state, vport->fc_flag,
sp->cmn.priority_tagging, kref_read(&ndlp->kref)); sp->cmn.priority_tagging, kref_read(&ndlp->kref));
if (sp->cmn.priority_tagging)
vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
LPFC_VMID_TYPE_PRIO);
/* reinitialize the VMID datastructure before returning */ /* reinitialize the VMID datastructure before returning */
if (lpfc_is_vmid_enabled(phba)) if (lpfc_is_vmid_enabled(phba))
lpfc_reinit_vmid(vport); lpfc_reinit_vmid(vport);
if (sp->cmn.priority_tagging)
vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
LPFC_VMID_TYPE_PRIO);
/* /*
* Address a timing race with dev_loss. If dev_loss is active on * Address a timing race with dev_loss. If dev_loss is active on
......
...@@ -321,5 +321,6 @@ lpfc_reinit_vmid(struct lpfc_vport *vport) ...@@ -321,5 +321,6 @@ lpfc_reinit_vmid(struct lpfc_vport *vport)
if (!hash_empty(vport->hash_table)) if (!hash_empty(vport->hash_table))
hash_for_each_safe(vport->hash_table, bucket, tmp, cur, hnode) hash_for_each_safe(vport->hash_table, bucket, tmp, cur, hnode)
hash_del(&cur->hnode); hash_del(&cur->hnode);
vport->vmid_flag = 0;
write_unlock(&vport->vmid_lock); write_unlock(&vport->vmid_lock);
} }
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