Commit b875638c authored by Justin Tee's avatar Justin Tee Committed by Cheng Yu
Browse files

scsi: lpfc: Move NPIV's transport unregistration to after resource clean up

mainline inclusion
from mainline-v6.9-rc2
commit 4ddf01f2f1504fa08b766e8cfeec558e9f8eef6c
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I9UMD0
CVE: CVE-2024-36952

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4ddf01f2f1504fa08b766e8cfeec558e9f8eef6c



--------------------------------

There are cases after NPIV deletion where the fabric switch still believes
the NPIV is logged into the fabric.  This occurs when a vport is
unregistered before the Remove All DA_ID CT and LOGO ELS are sent to the
fabric.

Currently fc_remove_host(), which calls dev_loss_tmo for all D_IDs including
the fabric D_ID, removes the last ndlp reference and frees the ndlp rport
object.  This sometimes causes the race condition where the final DA_ID and
LOGO are skipped from being sent to the fabric switch.

Fix by moving the fc_remove_host() and scsi_remove_host() calls after DA_ID
and LOGO are sent.

Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240305200503.57317-3-justintee8345@gmail.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Conflicts:
        drivers/scsi/lpfc/lpfc_vport.c
[There are only context conficts, no code logic conflicts.]
Signed-off-by: default avatarCheng Yu <serein.chengyu@huawei.com>
parent 9e1339f3
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -668,10 +668,6 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
		ns_ndlp_referenced = true;
	}

	/* Remove FC host and then SCSI host with the vport */
	fc_remove_host(shost);
	scsi_remove_host(shost);

	ndlp = lpfc_findnode_did(phba->pport, Fabric_DID);

	/* In case of driver unload, we shall not perform fabric logo as the
@@ -774,6 +770,10 @@ lpfc_vport_delete(struct fc_vport *fc_vport)

skip_logo:

	/* Remove FC host and then SCSI host with the vport */
	fc_remove_host(shost);
	scsi_remove_host(shost);

	/*
	 * If the NameServer ndlp has been incremented to allow the DA_ID CT
	 * command to be sent, decrement the ndlp now.