From a5ecbadb2c6c57737e3e3776687f970514c0afeb Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Tue, 16 Jan 2018 21:22:13 -0700 Subject: [PATCH] blob: add spdk_bs_batch_xxx_blob variants These will be used to implement user request splitting on cluster boundaries. Signed-off-by: Jim Harris Change-Id: I29e00ae9555fdd8a149e92be3cf88a2e528f5c0e Reviewed-on: https://review.gerrithub.io/395021 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Maciej Szwed Reviewed-by: Tomasz Zawadzki Reviewed-by: Daniel Verkamp --- lib/blob/request.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++ lib/blob/request.h | 12 +++++++++ 2 files changed, 77 insertions(+) diff --git a/lib/blob/request.c b/lib/blob/request.c index 75c851744..a26c6dec2 100644 --- a/lib/blob/request.c +++ b/lib/blob/request.c @@ -373,6 +373,71 @@ spdk_bs_batch_write_zeroes_dev(spdk_bs_batch_t *batch, &set->cb_args); } +static void +spdk_bs_batch_blob_op_complete(void *arg, int bserrno) +{ + /* TODO: spdk_bs_batch_completion does not actually use the channel parameter - + * just pass NULL here instead of getting the channel from the set cb_arg. + */ + spdk_bs_batch_completion(NULL, arg, bserrno); +} + +void +spdk_bs_batch_read_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + void *payload, uint64_t offset, uint64_t length) +{ + struct spdk_bs_request_set *set = (struct spdk_bs_request_set *)batch; + struct spdk_bs_channel *channel = set->channel; + + SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Reading %lu pages from offset %lu\n", length, offset); + + set->u.batch.outstanding_ops++; + spdk_bs_io_read_blob(blob, spdk_io_channel_from_ctx(channel), payload, offset, + length, spdk_bs_batch_blob_op_complete, set); +} + +void +spdk_bs_batch_write_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + void *payload, uint64_t offset, uint64_t length) +{ + struct spdk_bs_request_set *set = (struct spdk_bs_request_set *)batch; + struct spdk_bs_channel *channel = set->channel; + + SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Writing %lu pages from offset %lu\n", length, offset); + + set->u.batch.outstanding_ops++; + spdk_bs_io_write_blob(blob, spdk_io_channel_from_ctx(channel), payload, offset, + length, spdk_bs_batch_blob_op_complete, set); +} + +void +spdk_bs_batch_unmap_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + uint64_t offset, uint64_t length) +{ + struct spdk_bs_request_set *set = (struct spdk_bs_request_set *)batch; + struct spdk_bs_channel *channel = set->channel; + + SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Unmapping %lu pages from offset %lu\n", length, offset); + + set->u.batch.outstanding_ops++; + spdk_bs_io_unmap_blob(blob, spdk_io_channel_from_ctx(channel), offset, length, + spdk_bs_batch_blob_op_complete, set); +} + +void +spdk_bs_batch_write_zeroes_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + uint64_t offset, uint64_t length) +{ + struct spdk_bs_request_set *set = (struct spdk_bs_request_set *)batch; + struct spdk_bs_channel *channel = set->channel; + + SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Zeroing %lu pages from offset %lu\n", length, offset); + + set->u.batch.outstanding_ops++; + spdk_bs_io_write_zeroes_blob(blob, spdk_io_channel_from_ctx(channel), offset, length, + spdk_bs_batch_blob_op_complete, set); +} + void spdk_bs_batch_close(spdk_bs_batch_t *batch) { diff --git a/lib/blob/request.h b/lib/blob/request.h index 9af07441a..c6f2941fa 100644 --- a/lib/blob/request.h +++ b/lib/blob/request.h @@ -184,6 +184,18 @@ void spdk_bs_batch_unmap_dev(spdk_bs_batch_t *batch, void spdk_bs_batch_write_zeroes_dev(spdk_bs_batch_t *batch, uint64_t lba, uint32_t lba_count); +void spdk_bs_batch_read_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + void *payload, uint64_t offset, uint64_t length); + +void spdk_bs_batch_write_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + void *payload, uint64_t offset, uint64_t length); + +void spdk_bs_batch_unmap_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + uint64_t offset, uint64_t length); + +void spdk_bs_batch_write_zeroes_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob, + uint64_t offset, uint64_t length); + void spdk_bs_batch_close(spdk_bs_batch_t *batch); spdk_bs_batch_t *spdk_bs_sequence_to_batch(spdk_bs_sequence_t *seq,