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 <smatsumoto@nvidia.com>
Change-Id: I3b830b4331cb4c7d0794a555957cdcc73902c14f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15026
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
This commit is contained in:
Shuhei Matsumoto 2022-10-25 22:08:13 +09:00 committed by Tomasz Zawadzki
parent 7078874b80
commit fa5e7d1b8d

View File

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