Commit d4dc8599 authored by Tomasz Zawadzki's avatar Tomasz Zawadzki Committed by Daniel Verkamp
Browse files

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: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I93dec2d4b2843f0ee51dc9883c8451cf55353f7b
Reviewed-on: https://review.gerrithub.io/381131


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarPiotr Pelpliński <piotr.pelplinski@intel.com>
Reviewed-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 108e3d96
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
};

+21 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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");
	}
+2 −1
Original line number Diff line number Diff line
@@ -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