From 887ecc2d8224f89d79d6d60a11f983e713a8ee79 Mon Sep 17 00:00:00 2001 From: Tomasz Kulasek Date: Mon, 19 Mar 2018 12:30:51 +0100 Subject: [PATCH] lvol: display clone/snapshot status in get_bdevs --------------+------------------+------------------------------------------- Name | Type | Description --------------+------------------+------------------------------------------- snapshot | boolean | true if lvol is a snapshot clone | boolean | true if lvol is a clone base_snapshot | string | name of base snapshot if lvol is a clone clones | array of strings | array of clones names created from snapshot --------------+------------------+-------------------------------------------- Change-Id: I5df06798f3bd34bba89743aba896d129a0915d00 Signed-off-by: Tomasz Kulasek Reviewed-on: https://review.gerrithub.io/404638 Tested-by: SPDK Automated Test System Reviewed-by: Tomasz Zawadzki Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- lib/bdev/lvol/vbdev_lvol.c | 85 ++++++++++++++++++- .../lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c | 13 ++- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index 14a3c7d67..0fe7aacf7 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -562,13 +562,39 @@ vbdev_lvol_destruct(void *ctx) return 1; } +static char * +vbdev_lvol_find_name(struct spdk_lvol *lvol, spdk_blob_id blob_id) +{ + struct spdk_lvol_store *lvs; + struct spdk_lvol *_lvol; + + assert(lvol != NULL); + + lvs = lvol->lvol_store; + + assert(lvs); + + TAILQ_FOREACH(_lvol, &lvs->lvols, link) { + if (_lvol->blob_id == blob_id) { + return _lvol->name; + } + } + + return NULL; +} + static int vbdev_lvol_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) { struct spdk_lvol *lvol = ctx; struct lvol_store_bdev *lvs_bdev; struct spdk_bdev *bdev; + struct spdk_blob *blob; char lvol_store_uuid[SPDK_UUID_STRING_LEN]; + spdk_blob_id *ids = NULL; + size_t count, i; + char *name; + int rc = 0; spdk_json_write_name(w, "lvol"); spdk_json_write_object_begin(w); @@ -583,12 +609,65 @@ vbdev_lvol_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) spdk_json_write_name(w, "base_bdev"); spdk_json_write_string(w, spdk_bdev_get_name(bdev)); - spdk_json_write_name(w, "thin_provision"); - spdk_json_write_bool(w, lvol->thin_provision); + blob = lvol->blob; + spdk_json_write_name(w, "thin_provision"); + spdk_json_write_bool(w, spdk_blob_is_thin_provisioned(blob)); + + spdk_json_write_name(w, "snapshot"); + spdk_json_write_bool(w, spdk_blob_is_snapshot(blob)); + + spdk_json_write_name(w, "clone"); + spdk_json_write_bool(w, spdk_blob_is_clone(blob)); + + if (spdk_blob_is_clone(blob)) { + spdk_blob_id snapshotid = spdk_blob_get_parent_snapshot(lvol->lvol_store->blobstore, lvol->blob_id); + if (snapshotid != SPDK_BLOBID_INVALID) { + name = vbdev_lvol_find_name(lvol, snapshotid); + if (name != NULL) { + spdk_json_write_name(w, "base_snapshot"); + spdk_json_write_string(w, name); + } else { + SPDK_ERRLOG("Cannot obtain snapshots name\n"); + } + } + } + + if (spdk_blob_is_snapshot(blob)) { + /* Take a number of clones */ + rc = spdk_blob_get_clones(lvol->lvol_store->blobstore, lvol->blob_id, NULL, &count); + if (rc == -ENOMEM && count > 0) { + ids = malloc(sizeof(spdk_blob_id) * count); + if (ids == NULL) { + SPDK_ERRLOG("Cannot allocate memory\n"); + rc = -ENOMEM; + goto end; + } + + rc = spdk_blob_get_clones(lvol->lvol_store->blobstore, lvol->blob_id, ids, &count); + if (rc == 0) { + spdk_json_write_name(w, "clones"); + spdk_json_write_array_begin(w); + for (i = 0; i < count; i++) { + name = vbdev_lvol_find_name(lvol, ids[i]); + if (name != NULL) { + spdk_json_write_string(w, name); + } else { + SPDK_ERRLOG("Cannot obtain clone name\n"); + } + + } + spdk_json_write_array_end(w); + } + free(ids); + } + + } + +end: spdk_json_write_object_end(w); - return 0; + return rc; } static void 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 8a483b5e0..50695155d 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 @@ -536,6 +536,18 @@ spdk_json_write_name(struct spdk_json_write_ctx *w, const char *name) return 0; } +int +spdk_json_write_array_begin(struct spdk_json_write_ctx *w) +{ + return 0; +} + +int +spdk_json_write_array_end(struct spdk_json_write_ctx *w) +{ + return 0; +} + int spdk_json_write_string(struct spdk_json_write_ctx *w, const char *val) { @@ -1258,7 +1270,6 @@ ut_vbdev_lvol_get_io_channel(void) CU_ASSERT(ch == g_ch); free(g_lvol); - } static void