diff mbox series

[02/11] lpfc: Check devloss callbk done flag for potential stale ndlp ptrs

Message ID 20241031223219.152342-3-justintee8345@gmail.com
State New
Headers show
Series Update lpfc to revision 14.4.0.6 | expand

Commit Message

Justin Tee Oct. 31, 2024, 10:32 p.m. UTC
Should an rport remain in the NOTPRESENT state it is possible that
stgt_delete_work is scheduled after dev_loss_tmo_callbk.  In such cases,
dev_loss_tmo_callbk would have cleaned up the ndlp object resulting in
stale ndlp pointers in lpfc_terminate_rport_io.

Check for the DEVLOSS_CALLBK_DONE flag to know if dev_loss_tmo_callbk has
been called.  This is a more reliable way to avoid dereferencing stale ndlp
pointers.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
---
 drivers/scsi/lpfc/lpfc_hbadisc.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff mbox series

Patch

diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 9241075f72fa..a434faec3c92 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -100,6 +100,12 @@  lpfc_rport_invalid(struct fc_rport *rport)
 		return -EINVAL;
 	}
 
+	if (rport->flags & FC_RPORT_DEVLOSS_CALLBK_DONE) {
+		pr_info("**** %s: devloss_callbk_done rport x%px SID x%x\n",
+			__func__, rport, rport->scsi_target_id);
+		return -EINVAL;
+	}
+
 	rdata = rport->dd_data;
 	if (!rdata) {
 		pr_err("**** %s: NULL dd_data on rport x%px SID x%x\n",