From a8169c37e00a8e2459ebb608b72b81f01a1e3543 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Wed, 16 Jan 2019 11:15:59 -0700 Subject: [PATCH] rdma: add error path for fill_iovs_multi_sgl Catch an edge case where a multi sgl request is longer than the allowed transfer size. Change-Id: I79779050fe951d16f1240e2c3d8cf5037e576ea2 Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/440766 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker --- lib/nvmf/rdma.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index d5f3f5e84..ccd4f702b 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1641,6 +1641,7 @@ spdk_nvmf_rdma_request_parse_sgl(struct spdk_nvmf_rdma_transport *rtransport, struct spdk_nvme_cmd *cmd; struct spdk_nvme_cpl *rsp; struct spdk_nvme_sgl_descriptor *sgl; + int rc; cmd = &rdma_req->req.cmd->nvme_cmd; rsp = &rdma_req->req.rsp->nvme_cpl; @@ -1730,9 +1731,14 @@ spdk_nvmf_rdma_request_parse_sgl(struct spdk_nvmf_rdma_transport *rtransport, return 0; } else if (sgl->generic.type == SPDK_NVME_SGL_TYPE_LAST_SEGMENT && sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_OFFSET) { - if (nvmf_rdma_request_fill_iovs_multi_sgl(rtransport, device, rdma_req) < 0) { + + rc = nvmf_rdma_request_fill_iovs_multi_sgl(rtransport, device, rdma_req); + if (rc == -ENOMEM) { SPDK_DEBUGLOG(SPDK_LOG_RDMA, "No available large data buffers. Queueing request %p\n", rdma_req); return 0; + } else if (rc == -EINVAL) { + SPDK_ERRLOG("Multi SGL element request length exceeds the max I/O size\n"); + return -1; } /* backward compatible */