diff options
author | James Smart <james.smart@avagotech.com> | 2015-12-16 18:12:03 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2015-12-21 22:04:33 -0500 |
commit | 01c73bbcd7cc4f31f45a1b0caeacdba46acd9c9c (patch) | |
tree | 59c5d710f6460507f74d84051c019013fbcf957b | |
parent | a085e87c814567c94e5d375e7362f9f25030aac1 (diff) |
lpfc: Fix mbox reuse in PLOGI completion
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>
Reviewed-by: Hannes Reinicke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 9e571dd41687..193733e8c823 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, | |||
1045 | if (irsp->ulpStatus) | 1045 | if (irsp->ulpStatus) |
1046 | goto out; | 1046 | goto out; |
1047 | 1047 | ||
1048 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
1049 | if (!mbox) { | ||
1050 | lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, | ||
1051 | "0133 PLOGI: no memory for reg_login " | ||
1052 | "Data: x%x x%x x%x x%x\n", | ||
1053 | ndlp->nlp_DID, ndlp->nlp_state, | ||
1054 | ndlp->nlp_flag, ndlp->nlp_rpi); | ||
1055 | goto out; | ||
1056 | } | ||
1057 | |||
1058 | pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; | 1048 | pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; |
1059 | 1049 | ||
1060 | prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); | 1050 | prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list); |
@@ -1118,6 +1108,17 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, | |||
1118 | if (phba->sli_rev == LPFC_SLI_REV4) { | 1108 | if (phba->sli_rev == LPFC_SLI_REV4) { |
1119 | lpfc_issue_reg_vfi(vport); | 1109 | lpfc_issue_reg_vfi(vport); |
1120 | } else { | 1110 | } else { |
1111 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
1112 | if (!mbox) { | ||
1113 | lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, | ||
1114 | "0133 PLOGI: no memory " | ||
1115 | "for config_link " | ||
1116 | "Data: x%x x%x x%x x%x\n", | ||
1117 | ndlp->nlp_DID, ndlp->nlp_state, | ||
1118 | ndlp->nlp_flag, ndlp->nlp_rpi); | ||
1119 | goto out; | ||
1120 | } | ||
1121 | |||
1121 | lpfc_config_link(phba, mbox); | 1122 | lpfc_config_link(phba, mbox); |
1122 | 1123 | ||
1123 | mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 1124 | mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
@@ -1132,6 +1133,16 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_vport *vport, | |||
1132 | 1133 | ||
1133 | lpfc_unreg_rpi(vport, ndlp); | 1134 | lpfc_unreg_rpi(vport, ndlp); |
1134 | 1135 | ||
1136 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
1137 | if (!mbox) { | ||
1138 | lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, | ||
1139 | "0018 PLOGI: no memory for reg_login " | ||
1140 | "Data: x%x x%x x%x x%x\n", | ||
1141 | ndlp->nlp_DID, ndlp->nlp_state, | ||
1142 | ndlp->nlp_flag, ndlp->nlp_rpi); | ||
1143 | goto out; | ||
1144 | } | ||
1145 | |||
1135 | if (lpfc_reg_rpi(phba, vport->vpi, irsp->un.elsreq64.remoteID, | 1146 | if (lpfc_reg_rpi(phba, vport->vpi, irsp->un.elsreq64.remoteID, |
1136 | (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) { | 1147 | (uint8_t *) sp, mbox, ndlp->nlp_rpi) == 0) { |
1137 | switch (ndlp->nlp_DID) { | 1148 | switch (ndlp->nlp_DID) { |