diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index 2a452d1f5..e37bc570b 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -72,6 +72,7 @@ struct spdk_lvol_store { struct spdk_blob_store *blobstore; uuid_t uuid; struct spdk_lvs_req *destruct_req; + uint64_t total_blocks; TAILQ_HEAD(, spdk_lvol) lvols; }; diff --git a/lib/bdev/lvol/vbdev_lvol_rpc.c b/lib/bdev/lvol/vbdev_lvol_rpc.c index 61041daab..7f1fb9c60 100644 --- a/lib/bdev/lvol/vbdev_lvol_rpc.c +++ b/lib/bdev/lvol/vbdev_lvol_rpc.c @@ -387,6 +387,8 @@ spdk_rpc_get_lvol_stores(struct spdk_jsonrpc_request *request, { struct spdk_json_write_ctx *w; struct lvol_store_bdev *lvs_bdev; + struct spdk_blob_store *bs; + uint64_t free_blocks, cluster_size, block_size; char uuid[UUID_STRING_LEN]; if (params != NULL) { @@ -404,6 +406,13 @@ spdk_rpc_get_lvol_stores(struct spdk_jsonrpc_request *request, for (lvs_bdev = vbdev_lvol_store_first(); lvs_bdev != NULL; lvs_bdev = vbdev_lvol_store_next(lvs_bdev)) { + + bs = lvs_bdev->lvs->blobstore; + cluster_size = spdk_bs_get_cluster_size(bs); + /* Block size of lvols is always size of blob store page */ + block_size = spdk_bs_get_page_size(bs); + free_blocks = (cluster_size * spdk_bs_free_cluster_count(bs)) / block_size; + spdk_json_write_object_begin(w); uuid_unparse(lvs_bdev->lvs->uuid, uuid); @@ -413,6 +422,18 @@ spdk_rpc_get_lvol_stores(struct spdk_jsonrpc_request *request, spdk_json_write_name(w, "base_bdev"); spdk_json_write_string(w, spdk_bdev_get_name(lvs_bdev->bdev)); + spdk_json_write_name(w, "total_num_blocks"); + spdk_json_write_uint64(w, lvs_bdev->lvs->total_blocks); + + spdk_json_write_name(w, "free_num_blocks"); + spdk_json_write_uint64(w, free_blocks); + + spdk_json_write_name(w, "block_size"); + spdk_json_write_uint64(w, block_size); + + spdk_json_write_name(w, "cluster_size"); + spdk_json_write_uint64(w, cluster_size); + spdk_json_write_object_end(w); } spdk_json_write_array_end(w); diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index fb83b8251..c14ac656e 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -62,6 +62,8 @@ _lvs_init_cb(void *cb_arg, struct spdk_blob_store *bs, int lvserrno) assert(bs != NULL); lvs->blobstore = bs; TAILQ_INIT(&lvs->lvols); + lvs->total_blocks = (spdk_bs_get_cluster_size(bs) * spdk_bs_free_cluster_count( + bs)) / spdk_bs_get_page_size(bs); SPDK_INFOLOG(SPDK_TRACE_LVOL, "Lvol store initialized\n"); } diff --git a/test/unit/lib/lvol/lvol.c/lvol_ut.c b/test/unit/lib/lvol/lvol.c/lvol_ut.c index b1de9338a..240433981 100644 --- a/test/unit/lib/lvol/lvol.c/lvol_ut.c +++ b/test/unit/lib/lvol/lvol.c/lvol_ut.c @@ -44,6 +44,7 @@ #define DEV_BUFFER_BLOCKCNT (DEV_BUFFER_SIZE / DEV_BUFFER_BLOCKLEN) #define BS_CLUSTER_SIZE (1024 * 1024) #define BS_FREE_CLUSTERS (DEV_BUFFER_SIZE / BS_CLUSTER_SIZE) +#define BS_PAGE_SIZE (4096) #define SPDK_BLOB_OPTS_CLUSTER_SZ (1024 * 1024) #define SPDK_BLOB_OPTS_NUM_MD_PAGES UINT32_MAX @@ -72,7 +73,7 @@ spdk_blob_md_set_xattr(struct spdk_blob *blob, const char *name, const void *val uint64_t spdk_bs_get_page_size(struct spdk_blob_store *bs) { - return 0; + return BS_PAGE_SIZE; } static void