From 6a75bb948e8388875cdddbe7659fe68e99aabcd7 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 18 Jun 2019 10:20:21 +0200 Subject: [PATCH] bdev/part: separate buffer metadata support Allow requests using separate buffer for metadata IO if base bdev supports it. Copy base bdev's metadata configuration (separate / interleaved, size, DIF type and location). Change-Id: I89996f89cad805e696cacf0bba486b4cc1f617e6 Signed-off-by: Konrad Sztyber Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/458407 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Darek Stojaczyk --- lib/bdev/part.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/bdev/part.c b/lib/bdev/part.c index 4dd9f0d70..2dd648271 100644 --- a/lib/bdev/part.c +++ b/lib/bdev/part.c @@ -218,17 +218,35 @@ spdk_bdev_part_submit_request(struct spdk_bdev_part_channel *ch, struct spdk_bde switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: offset = bdev_io->u.bdev.offset_blocks + part->internal.offset_blocks; - rc = spdk_bdev_readv_blocks(base_desc, base_ch, bdev_io->u.bdev.iovs, - bdev_io->u.bdev.iovcnt, offset, - bdev_io->u.bdev.num_blocks, spdk_bdev_part_complete_io, - bdev_io); + if (bdev_io->u.bdev.md_buf == NULL) { + rc = spdk_bdev_readv_blocks(base_desc, base_ch, bdev_io->u.bdev.iovs, + bdev_io->u.bdev.iovcnt, offset, + bdev_io->u.bdev.num_blocks, + spdk_bdev_part_complete_io, bdev_io); + } else { + rc = spdk_bdev_readv_blocks_with_md(base_desc, base_ch, + bdev_io->u.bdev.iovs, + bdev_io->u.bdev.iovcnt, + bdev_io->u.bdev.md_buf, offset, + bdev_io->u.bdev.num_blocks, + spdk_bdev_part_complete_io, bdev_io); + } break; case SPDK_BDEV_IO_TYPE_WRITE: offset = bdev_io->u.bdev.offset_blocks + part->internal.offset_blocks; - rc = spdk_bdev_writev_blocks(base_desc, base_ch, bdev_io->u.bdev.iovs, - bdev_io->u.bdev.iovcnt, offset, - bdev_io->u.bdev.num_blocks, spdk_bdev_part_complete_io, - bdev_io); + if (bdev_io->u.bdev.md_buf == NULL) { + rc = spdk_bdev_writev_blocks(base_desc, base_ch, bdev_io->u.bdev.iovs, + bdev_io->u.bdev.iovcnt, offset, + bdev_io->u.bdev.num_blocks, + spdk_bdev_part_complete_io, bdev_io); + } else { + rc = spdk_bdev_writev_blocks_with_md(base_desc, base_ch, + bdev_io->u.bdev.iovs, + bdev_io->u.bdev.iovcnt, + bdev_io->u.bdev.md_buf, offset, + bdev_io->u.bdev.num_blocks, + spdk_bdev_part_complete_io, bdev_io); + } break; case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: offset = bdev_io->u.bdev.offset_blocks + part->internal.offset_blocks; @@ -346,6 +364,12 @@ spdk_bdev_part_construct(struct spdk_bdev_part *part, struct spdk_bdev_part_base part->internal.bdev.module = base->module; part->internal.bdev.fn_table = base->fn_table; + part->internal.bdev.md_interleave = base->bdev->md_interleave; + part->internal.bdev.md_len = base->bdev->md_len; + part->internal.bdev.dif_type = base->bdev->dif_type; + part->internal.bdev.dif_is_head_of_md = base->bdev->dif_is_head_of_md; + part->internal.bdev.dif_check_flags = base->bdev->dif_check_flags; + part->internal.bdev.name = strdup(name); part->internal.bdev.product_name = strdup(product_name);