From 51e897c42ef35db1167276ac2ba157b0cef21365 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 6 May 2022 10:26:24 +0900 Subject: [PATCH] nvme: Abort queued requests even if they are children of a large I/O A iterator function nvme_request_add_abort() covers not only a small I/O request but also children of a large I/O. However nvme_qpair_abort_queued_reqs_with_cbarg() did not check the latter. check if cmd_cb_arg matches not only req->cb_arg but also req->parent_cb_arg. Signed-off-by: Shuhei Matsumoto Change-Id: I015e29b0a8f58920b9a13081330a94f9dd976a45 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12557 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/nvme/nvme_qpair.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index 4ad25c534..97d0f063a 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -597,14 +597,17 @@ nvme_qpair_abort_queued_reqs_with_cbarg(struct spdk_nvme_qpair *qpair, void *cmd uint32_t aborting = 0; STAILQ_FOREACH_SAFE(req, &qpair->queued_req, stailq, tmp) { - if (req->cb_arg == cmd_cb_arg) { - STAILQ_REMOVE(&qpair->queued_req, req, nvme_request, stailq); - STAILQ_INSERT_TAIL(&qpair->aborting_queued_req, req, stailq); - if (!qpair->ctrlr->opts.disable_error_logging) { - SPDK_ERRLOG("aborting queued i/o\n"); - } - aborting++; + if ((req->cb_arg != cmd_cb_arg) && + (req->parent == NULL || req->parent->cb_arg != cmd_cb_arg)) { + continue; } + + STAILQ_REMOVE(&qpair->queued_req, req, nvme_request, stailq); + STAILQ_INSERT_TAIL(&qpair->aborting_queued_req, req, stailq); + if (!qpair->ctrlr->opts.disable_error_logging) { + SPDK_ERRLOG("aborting queued i/o\n"); + } + aborting++; } return aborting;