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);