lvol: Add size info to get_lvol_stores RPC

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 <tomasz.zawadzki@intel.com>
Change-Id: I93dec2d4b2843f0ee51dc9883c8451cf55353f7b
Reviewed-on: https://review.gerrithub.io/381131
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Piotr Pelpliński <piotr.pelplinski@intel.com>
Reviewed-by: Maciej Szwed <maciej.szwed@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Tomasz Zawadzki 2017-10-03 12:54:06 +02:00 committed by Daniel Verkamp
parent 108e3d9600
commit d4dc859947
4 changed files with 26 additions and 1 deletions

View File

@ -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;
};

View File

@ -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);

View File

@ -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");
}

View File

@ -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