mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
scsi: lpfc: Ignore ndlp rport mismatch in dev_loss_tmo callbk
With repeated port swaps between separate fabrics, there can be multiple registrations for fabric well known address 0xfffffe. This can cause ndlp reference confusion due to the usage of a single ndlp ptr that stores the rport object in fc_rport struct private storage during transport registration. Subsequent registrations update the ndlp->rport field with the newer rport, so when transport layer triggers dev_loss_tmo for the earlier registered rport the ndlp->rport private storage is referencing the newer rport instead of the older rport in dev_loss_tmo callbk. Because the older ndlp->rport object is already cleaned up elsewhere in driver code during the time of fabric swap, check that the rport provided in dev_loss_tmo callbk actually matches the rport stored in the LLDD's ndlp->rport field. Otherwise, skip dev_loss_tmo work on a stale rport. Signed-off-by: Justin Tee <justin.tee@broadcom.com> Link: https://lore.kernel.org/r/20250131000524.163662-4-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
f0842902b3
commit
23ed628977
|
|
@ -228,10 +228,16 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
|
|||
if (ndlp->nlp_state == NLP_STE_MAPPED_NODE)
|
||||
return;
|
||||
|
||||
/* check for recovered fabric node */
|
||||
if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE &&
|
||||
ndlp->nlp_DID == Fabric_DID)
|
||||
/* Ignore callback for a mismatched (stale) rport */
|
||||
if (ndlp->rport != rport) {
|
||||
lpfc_vlog_msg(vport, KERN_WARNING, LOG_NODE,
|
||||
"6788 fc rport mismatch: d_id x%06x ndlp x%px "
|
||||
"fc rport x%px node rport x%px state x%x "
|
||||
"refcnt %u\n",
|
||||
ndlp->nlp_DID, ndlp, rport, ndlp->rport,
|
||||
ndlp->nlp_state, kref_read(&ndlp->kref));
|
||||
return;
|
||||
}
|
||||
|
||||
if (rport->port_name != wwn_to_u64(ndlp->nlp_portname.u.wwn))
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user