nvmf/rdma: Fix wrong clear of WR SGL when rdma_fill_buffers() fails

wr->num_sge has to be used in spdk_nvmf_rdma_request_fill_iovs(),
and memset() can be used instead of clearing each variable.

Besides, holding cached pointer to the current WR simplifies the
code a little and so is done together in this patch.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Iebda158f85e3a0e3046686f76991217fa7297c24
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469198
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Seth Howell <seth.howell@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Alexey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2019-09-24 09:46:57 +09:00 committed by Jim Harris
parent 2d224c0d60
commit d409da0c84

View File

@ -1673,8 +1673,8 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport,
struct spdk_nvmf_rdma_qpair *rqpair; struct spdk_nvmf_rdma_qpair *rqpair;
struct spdk_nvmf_rdma_poll_group *rgroup; struct spdk_nvmf_rdma_poll_group *rgroup;
struct spdk_nvmf_request *req = &rdma_req->req; struct spdk_nvmf_request *req = &rdma_req->req;
struct ibv_send_wr *wr = &rdma_req->data.wr;
uint32_t num_buffers; uint32_t num_buffers;
uint32_t i = 0;
int rc = 0; int rc = 0;
rqpair = SPDK_CONTAINEROF(req->qpair, struct spdk_nvmf_rdma_qpair, qpair); rqpair = SPDK_CONTAINEROF(req->qpair, struct spdk_nvmf_rdma_qpair, qpair);
@ -1695,12 +1695,12 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport,
rgroup, rgroup,
device, device,
&rdma_req->req, &rdma_req->req,
&rdma_req->data.wr, wr,
length, length,
rdma_req->dif_ctx.block_size - rdma_req->dif_ctx.md_size, rdma_req->dif_ctx.block_size - rdma_req->dif_ctx.md_size,
rdma_req->dif_ctx.md_size); rdma_req->dif_ctx.md_size);
} else { } else {
rc = nvmf_rdma_fill_buffers(rtransport, rgroup, device, req, &rdma_req->data.wr, length); rc = nvmf_rdma_fill_buffers(rtransport, rgroup, device, req, wr, length);
} }
if (rc != 0) { if (rc != 0) {
goto err_exit; goto err_exit;
@ -1714,12 +1714,8 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport,
err_exit: err_exit:
spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport, num_buffers); spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport, num_buffers);
while (i) { memset(wr->sg_list, 0, sizeof(wr->sg_list[0]) * wr->num_sge);
i--; wr->num_sge = 0;
rdma_req->data.wr.sg_list[i].addr = 0;
rdma_req->data.wr.sg_list[i].length = 0;
rdma_req->data.wr.sg_list[i].lkey = 0;
}
req->iovcnt = 0; req->iovcnt = 0;
return rc; return rc;
} }