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