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 <smatsumoto@nvidia.com>
Change-Id: I015e29b0a8f58920b9a13081330a94f9dd976a45
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12557
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2022-05-06 10:26:24 +09:00 committed by Tomasz Zawadzki
parent e1b5d28c8b
commit 51e897c42e

View File

@ -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;