From: Rob Evers <revers@redhat.com> Date: Tue, 5 Oct 2010 14:24:51 -0400 Subject: [scsi] lpfc: fix bug w/cable swap and non-empty nodelist Message-id: <1286288695-20754-20-git-send-email-revers@redhat.com> Patchwork-id: 28602 O-Subject: [RHEL5.6 PATCH 19/23] Fix bug with cable swap and nodelist not empty message on console after rmmod. (CR: 105401) Bugzilla: 619917 RH-Acked-by: Tomas Henzl <thenzl@redhat.com> Fix bug with cable swap and nodelist not empty message on console after rmmod. (CR: 105401) From: Rob Evers on behalf of Emulex <revers@redhat.com> https://bugzilla.redhat.com/show_bug.cgi?id=619917 diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 5ccb942..b264491 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -1346,6 +1346,8 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, struct serv_parm *sp; uint8_t name[sizeof(struct lpfc_name)]; uint32_t rc, keepDID = 0; + int put_node; + int put_rport; /* Fabric nodes can have the same WWPN so we don't bother searching * by WWPN. Just return the ndlp that was given to us. @@ -1443,6 +1445,19 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, memcpy(&new_ndlp->nlp_nodename, &ndlp->nlp_nodename, sizeof(struct lpfc_name)); new_ndlp->nlp_state = ndlp->nlp_state; + /* Fix up the rport accordingly */ + rport = ndlp->rport; + if (rport) { + rdata = rport->dd_data; + put_node = rdata->pnode != NULL; + put_rport = ndlp->rport != NULL; + rdata->pnode = NULL; + ndlp->rport = NULL; + if (put_node) + lpfc_nlp_put(ndlp); + if (put_rport) + put_device(&rport->dev); + } } return new_ndlp; }