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

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.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8dc8eb89
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1130,12 +1130,12 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
			 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
+1 −0
Original line number Diff line number Diff line
@@ -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);
}