Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
scsi: lpfc: Remove duplicate ndlp kref decrement in lpfc_cleanup_rpis()
Browse files Browse the repository at this point in the history
With faulty cables in PT2PT topology, an unintentional ndlp double kref
decrement can occur.

If a FLOGI request is outstanding before the link goes down, the missing
FLOGI_ACC causes an F_Port ndlp to remain in the UNUSED state.  During link
down, lpfc_cleanup_rpis() is called and decrements an ndlp kref.
Additionally, when the driver later decides to abort the FLOGI, the FLOGI
completion handler decrements the ndlp kref a second time.

Remove duplicate clean up logic in lpfc_cleanup_rpis() because the updated
FLOGI completion handler already handles the ndlp kref decrement.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Justin Tee authored and martinkpetersen committed Jan 12, 2023
1 parent f813955 commit ecdf4dd
Showing 1 changed file with 0 additions and 15 deletions.
15 changes: 0 additions & 15 deletions drivers/scsi/lpfc/lpfc_hbadisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1129,21 +1129,6 @@ lpfc_cleanup_rpis(struct lpfc_vport *vport, int remove)
struct lpfc_nodelist *ndlp, *next_ndlp;

list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
/* It's possible the FLOGI to the fabric node never
* successfully completed and never registered with the
* transport. In this case there is no way to clean up
* the node.
*/
if (ndlp->nlp_DID == Fabric_DID) {
if (ndlp->nlp_prev_state ==
NLP_STE_UNUSED_NODE &&
!ndlp->fc4_xpt_flags)
lpfc_nlp_put(ndlp);
}
continue;
}

if ((phba->sli3_options & LPFC_SLI3_VPORT_TEARDOWN) ||
((vport->port_type == LPFC_NPIV_PORT) &&
((ndlp->nlp_DID == NameServer_DID) ||
Expand Down

0 comments on commit ecdf4dd

Please sign in to comment.