From 02acec4e26d35d5ee36fea3c7cf8ddcf3bd6d3e0 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 12 Jan 2023 13:09:27 +0900 Subject: [PATCH] bdev/nvme: Factor out abort to-be-retried I/O into a helper function This is in the same effort as gathering all retry functions into the same place. This will make the following patches easier. Signed-off-by: Shuhei Matsumoto Change-Id: If2a017ebda45eb1eaf0dc93b15d02b4122dc3be0 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15958 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- module/bdev/nvme/bdev_nvme.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 8ca191df4..cd529997f 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1022,6 +1022,23 @@ bdev_nvme_abort_retry_ios(struct nvme_bdev_channel *nbdev_ch) spdk_poller_unregister(&nbdev_ch->retry_io_poller); } +static int +bdev_nvme_abort_retry_io(struct nvme_bdev_channel *nbdev_ch, + struct nvme_bdev_io *bio_to_abort) +{ + struct spdk_bdev_io *bdev_io_to_abort; + + TAILQ_FOREACH(bdev_io_to_abort, &nbdev_ch->retry_io_list, module_link) { + if ((struct nvme_bdev_io *)bdev_io_to_abort->driver_ctx == bio_to_abort) { + TAILQ_REMOVE(&nbdev_ch->retry_io_list, bdev_io_to_abort, module_link); + __bdev_nvme_io_complete(bdev_io_to_abort, SPDK_BDEV_IO_STATUS_ABORTED, NULL); + return 0; + } + } + + return -ENOENT; +} + static void bdev_nvme_update_nvme_error_stat(struct spdk_bdev_io *bdev_io, const struct spdk_nvme_cpl *cpl) { @@ -6735,24 +6752,20 @@ bdev_nvme_abort(struct nvme_bdev_channel *nbdev_ch, struct nvme_bdev_io *bio, struct nvme_bdev_io *bio_to_abort) { struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(bio); - struct spdk_bdev_io *bdev_io_to_abort; struct nvme_io_path *io_path; struct nvme_ctrlr *nvme_ctrlr; int rc = 0; bio->orig_thread = spdk_get_thread(); - /* Traverse the retry_io_list first. */ - TAILQ_FOREACH(bdev_io_to_abort, &nbdev_ch->retry_io_list, module_link) { - if ((struct nvme_bdev_io *)bdev_io_to_abort->driver_ctx == bio_to_abort) { - TAILQ_REMOVE(&nbdev_ch->retry_io_list, bdev_io_to_abort, module_link); - __bdev_nvme_io_complete(bdev_io_to_abort, SPDK_BDEV_IO_STATUS_ABORTED, NULL); - - __bdev_nvme_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS, NULL); - return; - } + rc = bdev_nvme_abort_retry_io(nbdev_ch, bio_to_abort); + if (rc == 0) { + __bdev_nvme_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS, NULL); + return; } + rc = 0; + /* Even admin commands, they were submitted to only nvme_ctrlrs which were * on any io_path. So traverse the io_path list for not only I/O commands * but also admin commands.