From d409da0c84b71924c3b24982c15b3a22c75843d9 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 24 Sep 2019 09:46:57 +0900 Subject: [PATCH] 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 Change-Id: Iebda158f85e3a0e3046686f76991217fa7297c24 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469198 Tested-by: SPDK CI Jenkins Reviewed-by: Seth Howell Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu Reviewed-by: Alexey Marchuk --- lib/nvmf/rdma.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 1e2864432..cc3d75521 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -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_poll_group *rgroup; struct spdk_nvmf_request *req = &rdma_req->req; + struct ibv_send_wr *wr = &rdma_req->data.wr; uint32_t num_buffers; - uint32_t i = 0; int rc = 0; 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, device, &rdma_req->req, - &rdma_req->data.wr, + wr, length, rdma_req->dif_ctx.block_size - rdma_req->dif_ctx.md_size, rdma_req->dif_ctx.md_size); } 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) { goto err_exit; @@ -1714,12 +1714,8 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport, err_exit: spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport, num_buffers); - while (i) { - i--; - 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; - } + memset(wr->sg_list, 0, sizeof(wr->sg_list[0]) * wr->num_sge); + wr->num_sge = 0; req->iovcnt = 0; return rc; }