scsi: lpfc: Move determination of vmid_flag after VMID reinitialization completes
authorJustin Tee <justin.tee@broadcom.com>
Thu, 7 Dec 2023 22:40:38 +0000 (14:40 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2024 20:14:23 +0000 (20:14 +0000)
[ Upstream commit aba0fb0ef607a71511d23a07406f11130c1a54c5 ]

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: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20231207224039.35466-4-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_vmid.c

index 932d479..18b8325 100644 (file)
@@ -1119,12 +1119,12 @@ stop_rr_fcf_flogi:
                         vport->port_state, vport->fc_flag,
                         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 */
        if (lpfc_is_vmid_enabled(phba))
                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
index cf8ba84..773e02a 100644 (file)
@@ -321,5 +321,6 @@ lpfc_reinit_vmid(struct lpfc_vport *vport)
        if (!hash_empty(vport->hash_table))
                hash_for_each_safe(vport->hash_table, bucket, tmp, cur, hnode)
                        hash_del(&cur->hnode);
+       vport->vmid_flag = 0;
        write_unlock(&vport->vmid_lock);
 }