blob: add spdk_blob_is_esnap_clone

Add an API to easily determine if a blob is an esnap clone, similar to
what already exists for snapshot, clone, and thin_provisioned.

Signed-off-by: Mike Gerdts <mgerdts@nvidia.com>
Change-Id: Ie07cd09b30513893e82f1c85e94a24a93c79d71e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16862
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Community-CI: Mellanox Build Bot
This commit is contained in:
Mike Gerdts 2023-02-17 23:12:49 -06:00 committed by Konrad Sztyber
parent 2948183f2b
commit c64ce716e4
4 changed files with 21 additions and 5 deletions

View File

@ -701,6 +701,15 @@ bool spdk_blob_is_clone(struct spdk_blob *blob);
*/
bool spdk_blob_is_thin_provisioned(struct spdk_blob *blob);
/**
* Check if blob is a clone of an external bdev.
*
* \param blob Blob.
*
* \return true if blob is a clone of an external bdev.
*/
bool spdk_blob_is_esnap_clone(const struct spdk_blob *blob);
/**
* Delete an existing blob from the given blobstore.
*

View File

@ -8242,6 +8242,12 @@ spdk_blob_is_thin_provisioned(struct spdk_blob *blob)
return !!(blob->invalid_flags & SPDK_BLOB_THIN_PROV);
}
bool
spdk_blob_is_esnap_clone(const struct spdk_blob *blob)
{
return blob_is_esnap_clone(blob);
}
static void
blob_update_clear_method(struct spdk_blob *blob)
{

View File

@ -34,6 +34,7 @@
spdk_blob_is_snapshot;
spdk_blob_is_clone;
spdk_blob_is_thin_provisioned;
spdk_blob_is_esnap_clone;
spdk_bs_delete_blob;
spdk_bs_inflate_blob;
spdk_bs_blob_decouple_parent;

View File

@ -7431,7 +7431,7 @@ blob_esnap_create(void)
/* Create a normal blob and verify it is not an esnap clone. */
ut_spdk_blob_opts_init(&opts);
blob = ut_blob_create_and_open(bs, &opts);
CU_ASSERT(!blob_is_esnap_clone(blob));
CU_ASSERT(!spdk_blob_is_esnap_clone(blob));
ut_blob_close_and_delete(bs, blob);
/* Create an esnap clone blob then verify it is an esnap clone and has the right size */
@ -7441,7 +7441,7 @@ blob_esnap_create(void)
opts.esnap_id_len = sizeof(esnap_opts);
opts.num_clusters = esnap_num_clusters;
blob = ut_blob_create_and_open(bs, &opts);
SPDK_CU_ASSERT_FATAL(blob_is_esnap_clone(blob));
SPDK_CU_ASSERT_FATAL(spdk_blob_is_esnap_clone(blob));
sz = spdk_blob_get_num_clusters(blob);
CU_ASSERT(sz == esnap_num_clusters);
ut_blob_close_and_delete(bs, blob);
@ -7452,7 +7452,7 @@ blob_esnap_create(void)
opts.esnap_id = &esnap_opts;
opts.esnap_id_len = sizeof(esnap_opts);
blob = ut_blob_create_and_open(bs, &opts);
SPDK_CU_ASSERT_FATAL(blob_is_esnap_clone(blob));
SPDK_CU_ASSERT_FATAL(spdk_blob_is_esnap_clone(blob));
sz = spdk_blob_get_num_clusters(blob);
CU_ASSERT(sz == 0);
spdk_blob_resize(blob, 1, blob_op_complete, NULL);
@ -7485,7 +7485,7 @@ blob_esnap_create(void)
CU_ASSERT(g_bserrno == 0);
CU_ASSERT(g_blob != NULL);
blob = g_blob;
SPDK_CU_ASSERT_FATAL(blob_is_esnap_clone(blob));
SPDK_CU_ASSERT_FATAL(spdk_blob_is_esnap_clone(blob));
sz = spdk_blob_get_num_clusters(blob);
CU_ASSERT(sz == esnap_num_clusters + 1);
@ -7516,7 +7516,7 @@ blob_esnap_create(void)
/* Opening the blob also triggers the esnap to be loaded */
CU_ASSERT(bs_ctx_count == 2);
blob = g_blob;
SPDK_CU_ASSERT_FATAL(blob_is_esnap_clone(blob));
SPDK_CU_ASSERT_FATAL(spdk_blob_is_esnap_clone(blob));
sz = spdk_blob_get_num_clusters(blob);
CU_ASSERT(sz == esnap_num_clusters + 1);
spdk_blob_close(blob, blob_op_complete, NULL);