diff --git a/include/spdk/blob.h b/include/spdk/blob.h index 49a150ff6..5b71f0a09 100644 --- a/include/spdk/blob.h +++ b/include/spdk/blob.h @@ -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. * diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 30f6d6942..e91518839 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -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) { diff --git a/lib/blob/spdk_blob.map b/lib/blob/spdk_blob.map index 3a53ed00c..6a42d955e 100644 --- a/lib/blob/spdk_blob.map +++ b/lib/blob/spdk_blob.map @@ -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; diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index 6f8368c37..9ad145369 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -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);