From 7fb0f7467cf09cf79820ac11bb70d4e7cdaf3389 Mon Sep 17 00:00:00 2001 From: Tomasz Kulasek Date: Fri, 20 Apr 2018 14:24:00 +0200 Subject: [PATCH] lvol: raport not supported io types on ro lvol Change-Id: I07dac4bbf06a85659ae5d31e3f8d037d87825694 Signed-off-by: Tomasz Kulasek Reviewed-on: https://review.gerrithub.io/408483 Reviewed-by: Tomasz Zawadzki Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker --- lib/bdev/lvol/vbdev_lvol.c | 5 ++- .../lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c | 40 ++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index 0fe7aacf7..f1d250d6c 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -687,12 +687,13 @@ vbdev_lvol_get_io_channel(void *ctx) static bool vbdev_lvol_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type) { + struct spdk_lvol *lvol = ctx; + switch (io_type) { case SPDK_BDEV_IO_TYPE_WRITE: case SPDK_BDEV_IO_TYPE_UNMAP: case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: - /* TODO: Report false if snapshot */ - return true; + return !spdk_blob_is_read_only(lvol->blob); case SPDK_BDEV_IO_TYPE_RESET: case SPDK_BDEV_IO_TYPE_READ: return true; diff --git a/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c b/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c index 50695155d..3ae2104b0 100644 --- a/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c +++ b/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c @@ -177,6 +177,14 @@ spdk_blob_get_parent_snapshot(struct spdk_blob_store *bs, spdk_blob_id blobid) return 0; } +bool g_blob_is_read_only = false; + +bool +spdk_blob_is_read_only(struct spdk_blob *blob) +{ + return g_blob_is_read_only; +} + bool spdk_blob_is_snapshot(struct spdk_blob *blob) { @@ -1275,8 +1283,14 @@ ut_vbdev_lvol_get_io_channel(void) static void ut_vbdev_lvol_io_type_supported(void) { - struct spdk_lvol *lvol = g_lvol; + struct spdk_lvol *lvol; bool ret; + + lvol = calloc(1, sizeof(struct spdk_lvol)); + SPDK_CU_ASSERT_FATAL(lvol != NULL); + + g_blob_is_read_only = false; + /* Supported types */ ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_READ); CU_ASSERT(ret == true); @@ -1296,6 +1310,30 @@ ut_vbdev_lvol_io_type_supported(void) CU_ASSERT(ret == false); ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_IO); CU_ASSERT(ret == false); + + g_blob_is_read_only = true; + + /* Supported types */ + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_READ); + CU_ASSERT(ret == true); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_RESET); + CU_ASSERT(ret == true); + + /* Unsupported types */ + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE); + CU_ASSERT(ret == false); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_UNMAP); + CU_ASSERT(ret == false); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE_ZEROES); + CU_ASSERT(ret == false); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_FLUSH); + CU_ASSERT(ret == false); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_ADMIN); + CU_ASSERT(ret == false); + ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_IO); + CU_ASSERT(ret == false); + + free(lvol); } static void