]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
lpfc: Fix RDP ACC being too long.
authorJames Smart <james.smart@avagotech.com>
Wed, 16 Dec 2015 23:12:00 +0000 (18:12 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Fri, 26 Feb 2016 02:37:58 +0000 (18:37 -0800)
Fix RDP ACC being too long.

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>
(cherry picked from commit eb8d68c9930f7f9c8f3f4a6059b051b32077a735)

Orabug: 22493326
Signed-off-by: Manjunath Govindashetty <manjunath.govindashetty@oracle.com>
drivers/scsi/lpfc/lpfc_els.c

index 0253f9e60bfb2c86b72a073dbfda20608d396e4f..8a0c2d04cab3edd279a307d5132fa492c170d42e 100644 (file)
@@ -4834,6 +4834,7 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
        struct lpfc_nodelist *ndlp = rdp_context->ndlp;
        struct lpfc_vport *vport = ndlp->vport;
        struct lpfc_iocbq *elsiocb;
+       struct ulp_bde64 *bpl;
        IOCB_t *icmd;
        uint8_t *pcmd;
        struct ls_rjt *stat;
@@ -4843,6 +4844,8 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
 
        if (status != SUCCESS)
                goto error;
+
+       /* This will change once we know the true size of the RDP payload */
        cmdsize = sizeof(struct fc_rdp_res_frame);
 
        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
@@ -4884,6 +4887,13 @@ lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
        rdp_res->length = cpu_to_be32(fec_size + RDP_DESC_PAYLOAD_SIZE);
        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
 
+       /* Now that we know the true size of the payload, update the BPL */
+       bpl = (struct ulp_bde64 *)
+               (((struct lpfc_dmabuf *)(elsiocb->context3))->virt);
+       bpl->tus.f.bdeSize = (fec_size + RDP_DESC_PAYLOAD_SIZE + 8);
+       bpl->tus.f.bdeFlags = 0;
+       bpl->tus.w = le32_to_cpu(bpl->tus.w);
+
        phba->fc_stat.elsXmitACC++;
        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
        if (rc == IOCB_ERROR)