From fa5e7d1b8d95ea151d6cd9ebaa83df30b8838c4d Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 25 Oct 2022 22:08:13 +0900 Subject: [PATCH] bdev/error: Use switch-case to process error injection at submission The following patches will support data corruption. For write I/O, data corruption will be injected before submission, and for read I/O, data corruption will be injected after completion. To do these cleanly, use switch-case and reorder to process error injection at submission. Signed-off-by: Shuhei Matsumoto Change-Id: I3b830b4331cb4c7d0794a555957cdcc73902c14f Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15026 Tested-by: SPDK CI Jenkins Reviewed-by: Krzysztof Karas Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Community-CI: Mellanox Build Bot --- module/bdev/error/vbdev_error.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/module/bdev/error/vbdev_error.c b/module/bdev/error/vbdev_error.c index 46857876b..6ffbcdb34 100644 --- a/module/bdev/error/vbdev_error.c +++ b/module/bdev/error/vbdev_error.c @@ -162,6 +162,7 @@ vbdev_error_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bde struct error_channel *ch = spdk_io_channel_get_ctx(_ch); struct error_disk *error_disk = bdev_io->bdev->ctxt; uint32_t error_type; + int rc; if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) { vbdev_error_reset(error_disk, bdev_io); @@ -169,20 +170,26 @@ vbdev_error_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bde } error_type = vbdev_error_get_error_type(error_disk, bdev_io->type); - if (error_type == 0) { - int rc = spdk_bdev_part_submit_request(&ch->part_ch, bdev_io); + switch (error_type) { + case VBDEV_IO_FAILURE: + error_disk->error_vector[bdev_io->type].error_num--; + spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); + break; + case VBDEV_IO_PENDING: + TAILQ_INSERT_TAIL(&error_disk->pending_ios, bdev_io, module_link); + error_disk->error_vector[bdev_io->type].error_num--; + break; + case 0: + rc = spdk_bdev_part_submit_request(&ch->part_ch, bdev_io); if (rc) { SPDK_ERRLOG("bdev_error: submit request failed, rc=%d\n", rc); spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } - return; - } else if (error_type == VBDEV_IO_FAILURE) { - error_disk->error_vector[bdev_io->type].error_num--; - spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); - } else if (error_type == VBDEV_IO_PENDING) { - TAILQ_INSERT_TAIL(&error_disk->pending_ios, bdev_io, module_link); - error_disk->error_vector[bdev_io->type].error_num--; + break; + default: + assert(false); + break; } }