bdev/part: Modify spdk_bdev_part_submit_request() to use custom completion callback

In the following patches, we will add a feature to inject data
corruption to the error bdev module. For read I/O, we will have
to inject data corruption at completion. However, if we use
spdk_bdev_part_submit_request(), it will not be possible because we
cannot add any custom operation into the completion callback.
To fix the issue, modify spdk_+bdev_part_submit_request() and
rename it to spdk_bdev_part_submit_request_ext().
Fortunately, we can use stored_user_cb in struct spdk_bdev_io.

Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I46d3c40ea88a3fedd8a8fef6b68ee417c814a7a1
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15002
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Shuhei Matsumoto 2022-10-21 20:41:57 +09:00 committed by Tomasz Zawadzki
parent e6d258a64b
commit d683d7b792
4 changed files with 42 additions and 3 deletions

View File

@ -8,6 +8,8 @@ Both of interleaved and separated metadata are now supported by the malloc bdev
Protection information is now supported by the malloc bdev module. Protection information is now supported by the malloc bdev module.
A new API `spkd_bdev_part_submit_request_ext` was added to specify a custom completion callback.
### scheduler ### scheduler
Changing scheduler from dynamic back to static is no longer possible, Changing scheduler from dynamic back to static is no longer possible,

View File

@ -1287,6 +1287,25 @@ int spdk_bdev_part_construct(struct spdk_bdev_part *part, struct spdk_bdev_part_
*/ */
int spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bdev_io *bdev_io); int spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bdev_io *bdev_io);
/**
* Forwards I/O from an spdk_bdev_part to the underlying base bdev.
*
* This function will apply the offset_blocks the user provided to
* spdk_bdev_part_construct to the I/O. The user should not manually
* apply this offset before submitting any I/O through this function.
*
* This function enables user to specify a completion callback. It is required that
* the completion callback calls spdk_bdev_io_complete() for the forwarded I/O.
*
* \param ch The I/O channel associated with the spdk_bdev_part.
* \param bdev_io The I/O to be submitted to the underlying bdev.
* \param cb Called when the forwarded I/O completes.
* \return 0 on success or non-zero if submit request failed.
*/
int spdk_bdev_part_submit_request_ext(struct spdk_bdev_part_channel *ch,
struct spdk_bdev_io *bdev_io,
spdk_bdev_io_completion_cb cb);
/** /**
* Return a pointer to this part's spdk_bdev. * Return a pointer to this part's spdk_bdev.
* *

View File

@ -238,6 +238,7 @@ bdev_part_complete_io(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
{ {
struct spdk_bdev_io *part_io = cb_arg; struct spdk_bdev_io *part_io = cb_arg;
uint32_t offset, remapped_offset; uint32_t offset, remapped_offset;
spdk_bdev_io_completion_cb cb;
int rc, status; int rc, status;
switch (bdev_io->type) { switch (bdev_io->type) {
@ -260,14 +261,22 @@ bdev_part_complete_io(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
break; break;
} }
cb = part_io->u.bdev.stored_user_cb;
if (cb != NULL) {
cb(part_io, success, NULL);
} else {
status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED; status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED;
spdk_bdev_io_complete(part_io, status); spdk_bdev_io_complete(part_io, status);
}
spdk_bdev_free_io(bdev_io); spdk_bdev_free_io(bdev_io);
} }
int int
spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bdev_io *bdev_io) spdk_bdev_part_submit_request_ext(struct spdk_bdev_part_channel *ch, struct spdk_bdev_io *bdev_io,
spdk_bdev_io_completion_cb cb)
{ {
struct spdk_bdev_part *part = ch->part; struct spdk_bdev_part *part = ch->part;
struct spdk_io_channel *base_ch = ch->base_ch; struct spdk_io_channel *base_ch = ch->base_ch;
@ -275,6 +284,8 @@ spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bde
uint64_t offset, remapped_offset, remapped_src_offset; uint64_t offset, remapped_offset, remapped_src_offset;
int rc = 0; int rc = 0;
bdev_io->u.bdev.stored_user_cb = cb;
offset = bdev_io->u.bdev.offset_blocks; offset = bdev_io->u.bdev.offset_blocks;
remapped_offset = offset + part->internal.offset_blocks; remapped_offset = offset + part->internal.offset_blocks;
@ -382,6 +393,12 @@ spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bde
return rc; return rc;
} }
int
spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bdev_io *bdev_io)
{
return spdk_bdev_part_submit_request_ext(ch, bdev_io, NULL);
}
static int static int
bdev_part_channel_create_cb(void *io_device, void *ctx_buf) bdev_part_channel_create_cb(void *io_device, void *ctx_buf)
{ {

View File

@ -149,6 +149,7 @@
spdk_bdev_part_base_construct_ext; spdk_bdev_part_base_construct_ext;
spdk_bdev_part_construct; spdk_bdev_part_construct;
spdk_bdev_part_submit_request; spdk_bdev_part_submit_request;
spdk_bdev_part_submit_request_ext;
spdk_bdev_part_get_bdev; spdk_bdev_part_get_bdev;
spdk_bdev_part_get_base; spdk_bdev_part_get_base;
spdk_bdev_part_get_base_bdev; spdk_bdev_part_get_base_bdev;