|
Daniel Wagner |
a07c5a |
From: James Smart <jsmart2021@gmail.com>
|
|
Daniel Wagner |
a07c5a |
Date: Fri, 14 May 2021 12:55:52 -0700
|
|
Daniel Wagner |
a07c5a |
Subject: scsi: lpfc: Add ndlp kref accounting for resume RPI path
|
|
Daniel Wagner |
a07c5a |
Patch-mainline: Queued in subsystem maintainer repository
|
|
Daniel Wagner |
a07c5a |
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git
|
|
Daniel Wagner |
a07c5a |
Git-commit: 1037e4b4f81dc4ddf928e0ca2f1b182efdfdcc9d
|
|
Daniel Wagner |
a07c5a |
References: bsc#1186452
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
The driver is crashing due to a bad pointer during driver load due in an
|
|
Daniel Wagner |
a07c5a |
adisc acc receive routine. The driver is missing node get/put in the
|
|
Daniel Wagner |
a07c5a |
mbx_resume_rpi paths.
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
Fix by adding the proper gets and puts into the resume_rpi path.
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
Link: https://lore.kernel.org/r/20210514195559.119853-5-jsmart2021@gmail.com
|
|
Daniel Wagner |
a07c5a |
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
|
|
Daniel Wagner |
a07c5a |
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
|
|
Daniel Wagner |
a07c5a |
Signed-off-by: James Smart <jsmart2021@gmail.com>
|
|
Daniel Wagner |
a07c5a |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Daniel Wagner |
a07c5a |
Acked-by: Daniel Wagner <dwagner@suse.de>
|
|
Daniel Wagner |
a07c5a |
---
|
|
Daniel Wagner |
a07c5a |
drivers/scsi/lpfc/lpfc_nportdisc.c | 4 ++++
|
|
Daniel Wagner |
a07c5a |
drivers/scsi/lpfc/lpfc_sli.c | 23 ++++++++++++++++++++++-
|
|
Daniel Wagner |
a07c5a |
2 files changed, 26 insertions(+), 1 deletion(-)
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
|
|
Daniel Wagner |
a07c5a |
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
|
|
Daniel Wagner |
a07c5a |
@@ -659,6 +659,10 @@ lpfc_mbx_cmpl_resume_rpi(struct lpfc_hba
|
|
Daniel Wagner |
a07c5a |
lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, elsiocb,
|
|
Daniel Wagner |
a07c5a |
ndlp, NULL);
|
|
Daniel Wagner |
a07c5a |
}
|
|
Daniel Wagner |
a07c5a |
+
|
|
Daniel Wagner |
a07c5a |
+ /* This nlp_put pairs with lpfc_sli4_resume_rpi */
|
|
Daniel Wagner |
a07c5a |
+ lpfc_nlp_put(ndlp);
|
|
Daniel Wagner |
a07c5a |
+
|
|
Daniel Wagner |
a07c5a |
kfree(elsiocb);
|
|
Daniel Wagner |
a07c5a |
mempool_free(mboxq, phba->mbox_mem_pool);
|
|
Daniel Wagner |
a07c5a |
}
|
|
Daniel Wagner |
a07c5a |
--- a/drivers/scsi/lpfc/lpfc_sli.c
|
|
Daniel Wagner |
a07c5a |
+++ b/drivers/scsi/lpfc/lpfc_sli.c
|
|
Daniel Wagner |
a07c5a |
@@ -2682,6 +2682,12 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *
|
|
Daniel Wagner |
a07c5a |
}
|
|
Daniel Wagner |
a07c5a |
}
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
+ /* This nlp_put pairs with lpfc_sli4_resume_rpi */
|
|
Daniel Wagner |
a07c5a |
+ if (pmb->u.mb.mbxCommand == MBX_RESUME_RPI) {
|
|
Daniel Wagner |
a07c5a |
+ ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp;
|
|
Daniel Wagner |
a07c5a |
+ lpfc_nlp_put(ndlp);
|
|
Daniel Wagner |
a07c5a |
+ }
|
|
Daniel Wagner |
a07c5a |
+
|
|
Daniel Wagner |
a07c5a |
/* Check security permission status on INIT_LINK mailbox command */
|
|
Daniel Wagner |
a07c5a |
if ((pmb->u.mb.mbxCommand == MBX_INIT_LINK) &&
|
|
Daniel Wagner |
a07c5a |
(pmb->u.mb.mbxStatus == MBXERR_SEC_NO_PERMISSION))
|
|
Daniel Wagner |
a07c5a |
@@ -18911,14 +18917,28 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelis
|
|
Daniel Wagner |
a07c5a |
if (!mboxq)
|
|
Daniel Wagner |
a07c5a |
return -ENOMEM;
|
|
Daniel Wagner |
a07c5a |
|
|
Daniel Wagner |
a07c5a |
+ /* If cmpl assigned, then this nlp_get pairs with
|
|
Daniel Wagner |
a07c5a |
+ * lpfc_mbx_cmpl_resume_rpi.
|
|
Daniel Wagner |
a07c5a |
+ *
|
|
Daniel Wagner |
a07c5a |
+ * Else cmpl is NULL, then this nlp_get pairs with
|
|
Daniel Wagner |
a07c5a |
+ * lpfc_sli_def_mbox_cmpl.
|
|
Daniel Wagner |
a07c5a |
+ */
|
|
Daniel Wagner |
a07c5a |
+ if (!lpfc_nlp_get(ndlp)) {
|
|
Daniel Wagner |
a07c5a |
+ lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
|
|
Daniel Wagner |
a07c5a |
+ "2122 %s: Failed to get nlp ref\n",
|
|
Daniel Wagner |
a07c5a |
+ __func__);
|
|
Daniel Wagner |
a07c5a |
+ mempool_free(mboxq, phba->mbox_mem_pool);
|
|
Daniel Wagner |
a07c5a |
+ return -EIO;
|
|
Daniel Wagner |
a07c5a |
+ }
|
|
Daniel Wagner |
a07c5a |
+
|
|
Daniel Wagner |
a07c5a |
/* Post all rpi memory regions to the port. */
|
|
Daniel Wagner |
a07c5a |
lpfc_resume_rpi(mboxq, ndlp);
|
|
Daniel Wagner |
a07c5a |
if (cmpl) {
|
|
Daniel Wagner |
a07c5a |
mboxq->mbox_cmpl = cmpl;
|
|
Daniel Wagner |
a07c5a |
mboxq->ctx_buf = arg;
|
|
Daniel Wagner |
a07c5a |
- mboxq->ctx_ndlp = ndlp;
|
|
Daniel Wagner |
a07c5a |
} else
|
|
Daniel Wagner |
a07c5a |
mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
|
|
Daniel Wagner |
a07c5a |
+ mboxq->ctx_ndlp = ndlp;
|
|
Daniel Wagner |
a07c5a |
mboxq->vport = ndlp->vport;
|
|
Daniel Wagner |
a07c5a |
rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
|
|
Daniel Wagner |
a07c5a |
if (rc == MBX_NOT_FINISHED) {
|
|
Daniel Wagner |
a07c5a |
@@ -18926,6 +18946,7 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelis
|
|
Daniel Wagner |
a07c5a |
"2010 Resume RPI Mailbox failed "
|
|
Daniel Wagner |
a07c5a |
"status %d, mbxStatus x%x\n", rc,
|
|
Daniel Wagner |
a07c5a |
bf_get(lpfc_mqe_status, &mboxq->u.mqe));
|
|
Daniel Wagner |
a07c5a |
+ lpfc_nlp_put(ndlp);
|
|
Daniel Wagner |
a07c5a |
mempool_free(mboxq, phba->mbox_mem_pool);
|
|
Daniel Wagner |
a07c5a |
return -EIO;
|
|
Daniel Wagner |
a07c5a |
}
|