From d4dc859947602552c5f35abab92d8737ab3a4d82 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Tue, 3 Oct 2017 12:54:06 +0200 Subject: [PATCH] lvol: Add size info to get_lvol_stores RPC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently there is no way to know total space availible on lvol store or how much is left after creating lvol bdevs. Four new fields should were added to get_lvol_stores: - total number of blocks - number of free blocks left - block size (currently always 4096, but should be known to user) - cluster size Signed-off-by: Tomasz Zawadzki Change-Id: I93dec2d4b2843f0ee51dc9883c8451cf55353f7b Reviewed-on: https://review.gerrithub.io/381131 Tested-by: SPDK Automated Test System Reviewed-by: Piotr Pelpliński Reviewed-by: Maciej Szwed Reviewed-by: Daniel Verkamp --- include/spdk_internal/lvolstore.h | 1 + lib/bdev/lvol/vbdev_lvol_rpc.c | 21 +++++++++++++++++++++ lib/lvol/lvol.c | 2 ++ test/unit/lib/lvol/lvol.c/lvol_ut.c | 3 ++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index 2a452d1f58..e37bc570b2 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 61041daab0..7f1fb9c600 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 fb83b8251b..c14ac656e9 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 b1de9338a7..2404339812 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