From a5014efc2ba37e230c380e17c588e5ee7451166e Mon Sep 17 00:00:00 2001 From: Paul Luse Date: Mon, 14 Aug 2017 11:23:25 -0700 Subject: [PATCH] blob: add check for supported underlying dev block lengths Fail spdk_bs_init() if the dev being used has an LBA size that is larger than a metadata page or not evenly divisible by the size of a metadata page. Change-Id: I0e0ca747ecd5b6039c20fb6a885382bde4527158 Signed-off-by: Paul Luse Reviewed-on: https://review.gerrithub.io/374182 Reviewed-by: Jim Harris Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker --- lib/blob/blobstore.c | 7 +++++++ test/unit/lib/blob/blob.c/blob_ut.c | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 164bef2b2..7798b1dad 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -1480,6 +1480,13 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o, SPDK_TRACELOG(SPDK_TRACE_BLOB, "Initializing blobstore on dev %p\n", dev); + if ((sizeof(struct spdk_blob_md_page) % dev->blocklen) != 0) { + SPDK_ERRLOG("unsupported dev block length of %d\n", + dev->blocklen); + cb_fn(cb_arg, NULL, -EINVAL); + return; + } + if (o) { opts = *o; } else { diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index 52eb4c1f8..00ec81d64 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -95,6 +95,12 @@ blob_init(void) init_dev(&dev); + /* should fail for an unsupported blocklen */ + dev.blocklen = 500; + spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL); + CU_ASSERT(g_bserrno == -EINVAL); + + init_dev(&dev); spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL); CU_ASSERT(g_bserrno == 0); SPDK_CU_ASSERT_FATAL(g_bs != NULL);