From f12094267ba5ddf4e035db1e9ba8593f942cecbd Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Wed, 31 Jul 2019 08:55:54 +0000 Subject: [PATCH] bdev/null: Add metadata support for Null bdev 'md_interleave' option is added to spdk_null_bdev_opts along with 'md_size', but only interleaved metadata is supported at the moment. 'md_interleave' option must be initialiazed with 'true', otherwise -ENOTSUP will be returned from Null bdev constructor. Signed-off-by: Evgeniy Kochetov Signed-off-by: Sasha Kotchubievsky Signed-off-by: Alexey Marchuk Change-Id: Ibee745741d0125534e06aa6a35767d9dff795951 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/464777 Reviewed-by: Shuhei Matsumoto Reviewed-by: Broadcom SPDK FC-NVMe CI Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- CHANGELOG.md | 4 ++++ module/bdev/null/bdev_null.c | 21 +++++++++++++++++++-- module/bdev/null/bdev_null.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c36d8399..1013a56d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,10 @@ A new RPC `bdev_compress_get_orphans` has been added to list compress bdevs that were not loaded due to a missing pm metadata file. In this state they can only be deleted. +### null bdev + +Metadata support has been added to Null bdev module. + ## v19.07: ### ftl diff --git a/module/bdev/null/bdev_null.c b/module/bdev/null/bdev_null.c index 4d9670252..5e10b67dc 100644 --- a/module/bdev/null/bdev_null.c +++ b/module/bdev/null/bdev_null.c @@ -175,6 +175,7 @@ int create_null_bdev(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts *opts) { struct null_bdev *null_disk; + uint32_t data_block_size; int rc; if (!opts) { @@ -182,8 +183,22 @@ create_null_bdev(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts *opts return -EINVAL; } - if (opts->block_size % 512 != 0) { - SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", opts->block_size); + if (opts->md_interleave) { + if (opts->block_size < opts->md_size) { + SPDK_ERRLOG("Interleaved metadata size can not be greater than block size.\n"); + return -EINVAL; + } + data_block_size = opts->block_size - opts->md_size; + } else { + if (opts->md_size != 0) { + SPDK_ERRLOG("Metadata in separate buffer is not supported\n"); + return -ENOTSUP; + } + data_block_size = opts->block_size; + } + + if (data_block_size % 512 != 0) { + SPDK_ERRLOG("Data block size %u is not a multiple of 512.\n", opts->block_size); return -EINVAL; } @@ -208,6 +223,8 @@ create_null_bdev(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts *opts null_disk->bdev.write_cache = 0; null_disk->bdev.blocklen = opts->block_size; null_disk->bdev.blockcnt = opts->num_blocks; + null_disk->bdev.md_len = opts->md_size; + null_disk->bdev.md_interleave = opts->md_interleave; if (opts->uuid) { null_disk->bdev.uuid = *opts->uuid; } else { diff --git a/module/bdev/null/bdev_null.h b/module/bdev/null/bdev_null.h index c771eda14..0b4c60dfc 100644 --- a/module/bdev/null/bdev_null.h +++ b/module/bdev/null/bdev_null.h @@ -46,6 +46,8 @@ struct spdk_null_bdev_opts { const struct spdk_uuid *uuid; uint64_t num_blocks; uint32_t block_size; + uint32_t md_size; + bool md_interleave; }; int create_null_bdev(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts *opts);