diff mbox

[12/17] lpfc: Fix mbox reuse in PLOGI completion

Message ID 5671efc3.0ctNdaGDOZR2f0ML%james.smart@avagotech.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

James Smart Dec. 16, 2015, 11:12 p.m. UTC
Fix mbox reuse in PLOGI completion. Moved allocations so that buffer
properly init'd.

Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
---
 drivers/scsi/lpfc/lpfc_nportdisc.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

Comments

Hannes Reinecke Dec. 17, 2015, 8:32 a.m. UTC | #1
On 12/17/2015 12:12 AM, James Smart wrote:
>
> Fix mbox reuse in PLOGI completion. Moved allocations so that buffer
> properly init'd.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
>   drivers/scsi/lpfc/lpfc_nportdisc.c | 31 +++++++++++++++++++++----------
>   1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
> index 9e571dd..193733e 100644
> --- a/drivers/scsi/lpfc/lpfc_nportdisc.c
> +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
> @@ -1045,16 +1045,6 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
>   	if (irsp->ulpStatus)
>   		goto out;
>
> -	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
> -	if (!mbox) {
> -		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
> -				 "0133 PLOGI: no memory for reg_login "
> -				 "Data: x%x x%x x%x x%x\n",
> -				 ndlp->nlp_DID, ndlp->nlp_state,
> -				 ndlp->nlp_flag, ndlp->nlp_rpi);
> -		goto out;
> -	}
> -
>   	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
>
>   	prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
> @@ -1118,6 +1108,17 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
>   		if (phba->sli_rev == LPFC_SLI_REV4) {
>   			lpfc_issue_reg_vfi(vport);
>   		} else {
> +			mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
> +			if (!mbox) {
> +				lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
> +						 "0133 PLOGI: no memory "
> +						 "for config_link "
> +						 "Data: x%x x%x x%x x%x\n",
> +						 ndlp->nlp_DID, ndlp->nlp_state,
> +						 ndlp->nlp_flag, ndlp->nlp_rpi);
> +				goto out;
> +			}
> +
>   			lpfc_config_link(phba, mbox);
>
>   			mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
> @@ -1132,6 +1133,16 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
>
>   	lpfc_unreg_rpi(vport, ndlp);
>
> +	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
> +	if (!mbox) {
> +		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
> +				 "0018 PLOGI: no memory for reg_login "
> +				 "Data: x%x x%x x%x x%x\n",
> +				 ndlp->nlp_DID, ndlp->nlp_state,
> +				 ndlp->nlp_flag, ndlp->nlp_rpi);
> +		goto out;
> +	}
> +
>   	if (lpfc_reg_rpi(phba, vport->vpi, irsp->un.elsreq64.remoteID,
>   			 (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) {
>   		switch (ndlp->nlp_DID) {
>
Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index 9e571dd..193733e 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -1045,16 +1045,6 @@  lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
 	if (irsp->ulpStatus)
 		goto out;
 
-	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
-	if (!mbox) {
-		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
-				 "0133 PLOGI: no memory for reg_login "
-				 "Data: x%x x%x x%x x%x\n",
-				 ndlp->nlp_DID, ndlp->nlp_state,
-				 ndlp->nlp_flag, ndlp->nlp_rpi);
-		goto out;
-	}
-
 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
 
 	prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
@@ -1118,6 +1108,17 @@  lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
 		if (phba->sli_rev == LPFC_SLI_REV4) {
 			lpfc_issue_reg_vfi(vport);
 		} else {
+			mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+			if (!mbox) {
+				lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
+						 "0133 PLOGI: no memory "
+						 "for config_link "
+						 "Data: x%x x%x x%x x%x\n",
+						 ndlp->nlp_DID, ndlp->nlp_state,
+						 ndlp->nlp_flag, ndlp->nlp_rpi);
+				goto out;
+			}
+
 			lpfc_config_link(phba, mbox);
 
 			mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
@@ -1132,6 +1133,16 @@  lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport,
 
 	lpfc_unreg_rpi(vport, ndlp);
 
+	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+	if (!mbox) {
+		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
+				 "0018 PLOGI: no memory for reg_login "
+				 "Data: x%x x%x x%x x%x\n",
+				 ndlp->nlp_DID, ndlp->nlp_state,
+				 ndlp->nlp_flag, ndlp->nlp_rpi);
+		goto out;
+	}
+
 	if (lpfc_reg_rpi(phba, vport->vpi, irsp->un.elsreq64.remoteID,
 			 (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) {
 		switch (ndlp->nlp_DID) {