From ea3a17fb55b2354fe6cb04c3667a87e8aa9248a9 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Mon, 19 Mar 2018 12:19:17 -0400 Subject: [PATCH] blob: disallow bs load on device with unsupported block length Blobstore supports only block lengths that are less than SPDK_BS_PAGE_SIZE or when multiplication of block len results in SPDK_BS_PAGE_SIZE. This was checked only on spdk_bs_init(), but not spdk_bs_load(). When not checked, it caused issues with lvol store tasting. During tasting, there is an attempt to perform spdk_bs_load() on a given device. It was possible to hit asserts in blobstore by creating malloc with block size 8192. Change-Id: I30b62bebad405b581eb2158925884adc616d9b92 Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/404537 Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris Tested-by: SPDK Automated Test System --- lib/blob/blobstore.c | 7 +++++++ test/unit/lib/blob/blob.c/blob_ut.c | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 5d3b4d95a..995c1a9d5 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -2811,6 +2811,13 @@ spdk_bs_load(struct spdk_bs_dev *dev, struct spdk_bs_opts *o, SPDK_DEBUGLOG(SPDK_LOG_BLOB, "Loading blobstore from dev %p\n", dev); + if ((SPDK_BS_PAGE_SIZE % dev->blocklen) != 0) { + SPDK_DEBUGLOG(SPDK_LOG_BLOB, "unsupported dev block length of %d\n", dev->blocklen); + dev->destroy(dev); + 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 cebeb32a1..f803cd574 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -1541,6 +1541,11 @@ bs_load(void) super_block = (struct spdk_bs_super_block *)g_dev_buffer; CU_ASSERT(super_block->clean == 1); + /* Load should fail for device with an unsupported blocklen */ + dev = init_dev(); + dev->blocklen = SPDK_BS_PAGE_SIZE * 2; + spdk_bs_load(dev, NULL, bs_op_with_handle_complete, NULL); + CU_ASSERT(g_bserrno == -EINVAL); /* Load an existing blob store */ dev = init_dev();