From 9d4751a550d28f9dde6b2849b242832a51195cac Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 19 May 2020 02:15:02 +0900 Subject: [PATCH] lib/nvme: Fix Abort Command Limit to process as 0's based value SPDK NVMe driver had processed ACL as 1's based value by mistake, and SPDK NVMe-oF target sets ACL to 0. Hence If NVMe driver connects to SPDK NVMe-oF transport, spdk_nvme_ctrlr_cmd_abort() always queued abort request. Fix this bug to process ACL as 0's based value in spdk_nvme_ctrlr_cmd_abort(). Besides, initialize ACL explicitly to 0 in spdk_nvmf_ctrlr_identify_ctrlr() for clarification. Signed-off-by: Michael Haeuptle Signed-off-by: Shuhei Matsumoto Change-Id: Id4f3a469776cdab88bcc6f41e7893885a7b78d8c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2513 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Reviewed-by: Michael Haeuptle --- lib/nvme/nvme_ctrlr_cmd.c | 3 ++- lib/nvmf/ctrlr.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index ebd4bc85b..e17937cd7 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -628,7 +628,8 @@ spdk_nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair cmd->cdw10_bits.abort.sqid = sqid; cmd->cdw10_bits.abort.cid = cid; - if (ctrlr->outstanding_aborts >= ctrlr->cdata.acl) { + /* ACL is a 0's based value. */ + if (ctrlr->outstanding_aborts >= ctrlr->cdata.acl + 1U) { STAILQ_INSERT_TAIL(&ctrlr->queued_aborts, req, stailq); rc = 0; } else { diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index c0ea8a32d..215989508 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -1872,6 +1872,8 @@ spdk_nvmf_ctrlr_identify_ctrlr(struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvme_c cdata->cmic.multi_host = 1; cdata->oaes.ns_attribute_notices = 1; cdata->ctratt.host_id_exhid_supported = 1; + /* TODO: Concurrent execution of multiple abort commands. */ + cdata->acl = 0; cdata->aerl = 0; cdata->frmw.slot1_ro = 1; cdata->frmw.num_slots = 1;