From acca82acf2265f6100f102089601dd8d0b422e4b Mon Sep 17 00:00:00 2001 From: Piotr Pelplinski Date: Thu, 11 Oct 2018 09:07:16 +0200 Subject: [PATCH] nvmf: set noiob no larger than mdts Signed-off-by: Piotr Pelplinski Change-Id: I875cc9d6a6bd1e9e9ac25ca9103a2070226ac236 Reviewed-on: https://review.gerrithub.io/428877 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/nvmf/ctrlr.c | 8 ++++++++ test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index d0703a107..b80fc040b 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -1143,6 +1143,7 @@ spdk_nvmf_ctrlr_identify_ns(struct spdk_nvmf_ctrlr *ctrlr, { struct spdk_nvmf_subsystem *subsystem = ctrlr->subsys; struct spdk_nvmf_ns *ns; + uint32_t max_num_blocks; if (cmd->nsid == 0 || cmd->nsid > subsystem->max_nsid) { SPDK_ERRLOG("Identify Namespace for invalid NSID %u\n", cmd->nsid); @@ -1166,6 +1167,13 @@ spdk_nvmf_ctrlr_identify_ns(struct spdk_nvmf_ctrlr *ctrlr, spdk_nvmf_bdev_ctrlr_identify_ns(ns, nsdata); + /* Due to bug in the Linux kernel NVMe driver we have to set noiob no larger than mdts */ + max_num_blocks = ctrlr->admin_qpair->transport->opts.max_io_size / + (1U << nsdata->lbaf[nsdata->flbas.format].lbads); + if (nsdata->noiob > max_num_blocks) { + nsdata->noiob = max_num_blocks; + } + return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 70ccc41b8..71555e320 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -689,7 +689,9 @@ static void test_identify_ns(void) { struct spdk_nvmf_subsystem subsystem = {}; - struct spdk_nvmf_ctrlr ctrlr = { .subsys = &subsystem }; + struct spdk_nvmf_transport transport = {}; + struct spdk_nvmf_qpair admin_qpair = { .transport = &transport}; + struct spdk_nvmf_ctrlr ctrlr = { .subsys = &subsystem, .admin_qpair = &admin_qpair }; struct spdk_nvme_cmd cmd = {}; struct spdk_nvme_cpl rsp = {}; struct spdk_nvme_ns_data nsdata = {};