diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index bff237502..8e36ccc2d 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright (C) 2018 Intel Corporation. All rights reserved. * Copyright (c) 2020 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 2021, 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ /* @@ -411,12 +411,18 @@ _tcp_write_pdu(struct nvme_tcp_pdu *pdu) uint32_t mapped_length = 0; struct nvme_tcp_qpair *tqpair = pdu->qpair; - pdu->sock_req.iovcnt = nvme_tcp_build_iovs(pdu->iov, NVME_TCP_MAX_SGL_DESCRIPTORS, pdu, + pdu->sock_req.iovcnt = nvme_tcp_build_iovs(pdu->iov, SPDK_COUNTOF(pdu->iov), pdu, (bool)tqpair->flags.host_hdgst_enable, (bool)tqpair->flags.host_ddgst_enable, &mapped_length); + TAILQ_INSERT_TAIL(&tqpair->send_queue, pdu, tailq); + if (spdk_unlikely(mapped_length < pdu->data_len)) { + SPDK_ERRLOG("could not map the whole %u bytes (mapped only %u bytes)\n", pdu->data_len, + mapped_length); + _pdu_write_done(pdu, -EINVAL); + return; + } pdu->sock_req.cb_fn = _pdu_write_done; pdu->sock_req.cb_arg = pdu; - TAILQ_INSERT_TAIL(&tqpair->send_queue, pdu, tailq); tqpair->stats->submitted_requests++; spdk_sock_writev_async(tqpair->sock, &pdu->sock_req); } @@ -2166,13 +2172,7 @@ nvme_tcp_ctrlr_get_max_xfer_size(struct spdk_nvme_ctrlr *ctrlr) static uint16_t nvme_tcp_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) { - /* - * We do not support >1 SGE in the initiator currently, - * so we can only return 1 here. Once that support is - * added, this should return ctrlr->cdata.nvmf_specific.msdbd - * instead. - */ - return 1; + return NVME_TCP_MAX_SGL_DESCRIPTORS; } static int