]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: lpfc: Fix unintentional double clearing of vmid_flag
authorJustin Tee <justin.tee@broadcom.com>
Fri, 26 Jul 2024 23:15:08 +0000 (16:15 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 3 Aug 2024 01:48:05 +0000 (21:48 -0400)
The vport->vmid_flag is unintentionally cleared twice after an issue_lip
via the lpfc_reinit_vmid routine().

The first call to lpfc_reinit_vmid() is in lpfc_cmpl_els_flogi().  Then
lpfc_cmpl_els_flogi_fabric() calls lpfc_register_new_vport(), which calls
lpfc_cmpl_reg_new_vport() when the mbox command completes and calls
lpfc_reinit_vmid() a second time.

Fix by moving the vmid_flag clear outside of the lpfc_reinit_vmid() routine
so that vmid_flag is only cleared once upon FLOGI completion.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240726231512.92867-5-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_vmid.c

index 50c0c0c91fdcbd6c4762416b20c2cb04c0c47872..6d49e23f6a628741c3bcf4dbff9de5bffe990975 100644 (file)
@@ -1099,8 +1099,10 @@ stop_rr_fcf_flogi:
                         sp->cmn.priority_tagging, kref_read(&ndlp->kref));
 
        /* reinitialize the VMID datastructure before returning */
-       if (lpfc_is_vmid_enabled(phba))
+       if (lpfc_is_vmid_enabled(phba)) {
                lpfc_reinit_vmid(vport);
+               vport->vmid_flag = 0;
+       }
        if (sp->cmn.priority_tagging)
                vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
                                                  LPFC_VMID_TYPE_PRIO);
index 773e02ae20c3743239dedc6d5e191f7e4e1bb05a..cf8ba840d0eab69575b67889e1ab371216817613 100644 (file)
@@ -321,6 +321,5 @@ 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);
 }