Commit d409da0c authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Iebda158f85e3a0e3046686f76991217fa7297c24
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469198


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarSeth Howell <seth.howell@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAlexey Marchuk <alexeymar@mellanox.com>
parent 2d224c0d
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -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;
}