lib/blob: store clear_method in per blob metadata

Accept a clear method option on blob create by adding clear_method
to the opts structure passed in to _spdk_bs_create_blob(). Store
these 2 bits in md_ro_flags so that earlier versions without an
understanding of these bits can not alter metadata.

The new metadata values will be used later in the series.

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: I5440645ca20b426778d13b2e544b65dc2b3b83c7
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/472204
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
paul luse 2019-10-23 17:34:49 +00:00 committed by Tomasz Zawadzki
parent d68459fcb3
commit ea69d6d6cc
5 changed files with 26 additions and 2 deletions

View File

@ -410,6 +410,7 @@ struct spdk_blob_xattr_opts {
struct spdk_blob_opts { struct spdk_blob_opts {
uint64_t num_clusters; uint64_t num_clusters;
bool thin_provision; bool thin_provision;
enum blob_clear_method clear_method;
struct spdk_blob_xattr_opts xattrs; struct spdk_blob_xattr_opts xattrs;
}; };

View File

@ -165,6 +165,7 @@ spdk_blob_opts_init(struct spdk_blob_opts *opts)
{ {
opts->num_clusters = 0; opts->num_clusters = 0;
opts->thin_provision = false; opts->thin_provision = false;
opts->clear_method = BLOB_CLEAR_WITH_DEFAULT;
_spdk_blob_xattrs_init(&opts->xattrs); _spdk_blob_xattrs_init(&opts->xattrs);
} }
@ -2712,6 +2713,15 @@ _spdk_blob_set_thin_provision(struct spdk_blob *blob)
blob->state = SPDK_BLOB_STATE_DIRTY; blob->state = SPDK_BLOB_STATE_DIRTY;
} }
static void
_spdk_blob_set_clear_method(struct spdk_blob *blob, enum blob_clear_method clear_method)
{
_spdk_blob_verify_md_op(blob);
blob->clear_method = clear_method;
blob->md_ro_flags |= (clear_method << SPDK_BLOB_CLEAR_METHOD_SHIFT);
blob->state = SPDK_BLOB_STATE_DIRTY;
}
static void _spdk_bs_load_iter(void *arg, struct spdk_blob *blob, int bserrno); static void _spdk_bs_load_iter(void *arg, struct spdk_blob *blob, int bserrno);
static void static void
@ -4345,6 +4355,8 @@ _spdk_bs_create_blob(struct spdk_blob_store *bs,
_spdk_blob_set_thin_provision(blob); _spdk_blob_set_thin_provision(blob);
} }
_spdk_blob_set_clear_method(blob, opts->clear_method);
rc = _spdk_blob_resize(blob, opts->num_clusters); rc = _spdk_blob_resize(blob, opts->num_clusters);
if (rc < 0) { if (rc < 0) {
_spdk_blob_free(blob); _spdk_blob_free(blob);
@ -4621,6 +4633,9 @@ _spdk_bs_snapshot_freeze_cpl(void *cb_arg, int rc)
/* swap cluster maps */ /* swap cluster maps */
_spdk_bs_snapshot_swap_cluster_maps(newblob, origblob); _spdk_bs_snapshot_swap_cluster_maps(newblob, origblob);
/* Set the clear method on the new blob to match the original. */
_spdk_blob_set_clear_method(newblob, origblob->clear_method);
/* sync snapshot metadata */ /* sync snapshot metadata */
spdk_blob_sync_md(newblob, _spdk_bs_snapshot_newblob_sync_cpl, ctx); spdk_blob_sync_md(newblob, _spdk_bs_snapshot_newblob_sync_cpl, ctx);
} }

View File

@ -274,7 +274,10 @@ struct spdk_blob_md_descriptor_extent_rle {
#define SPDK_BLOB_READ_ONLY (1ULL << 0) #define SPDK_BLOB_READ_ONLY (1ULL << 0)
#define SPDK_BLOB_DATA_RO_FLAGS_MASK SPDK_BLOB_READ_ONLY #define SPDK_BLOB_DATA_RO_FLAGS_MASK SPDK_BLOB_READ_ONLY
#define SPDK_BLOB_MD_RO_FLAGS_MASK 0
#define SPDK_BLOB_CLEAR_METHOD_SHIFT 0
#define SPDK_BLOB_CLEAR_METHOD (3ULL << SPDK_BLOB_CLEAR_METHOD_SHIFT)
#define SPDK_BLOB_MD_RO_FLAGS_MASK SPDK_BLOB_CLEAR_METHOD
struct spdk_blob_md_descriptor_flags { struct spdk_blob_md_descriptor_flags {
uint8_t type; uint8_t type;

View File

@ -1066,6 +1066,7 @@ spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
spdk_blob_opts_init(&opts); spdk_blob_opts_init(&opts);
opts.thin_provision = thin_provision; opts.thin_provision = thin_provision;
opts.num_clusters = num_clusters; opts.num_clusters = num_clusters;
opts.clear_method = lvol->clear_method;
opts.xattrs.count = SPDK_COUNTOF(xattr_names); opts.xattrs.count = SPDK_COUNTOF(xattr_names);
opts.xattrs.names = xattr_names; opts.xattrs.names = xattr_names;
opts.xattrs.ctx = lvol; opts.xattrs.ctx = lvol;

View File

@ -4010,10 +4010,12 @@ blob_flags(void)
spdk_blob_id blobid_invalid, blobid_data_ro, blobid_md_ro; spdk_blob_id blobid_invalid, blobid_data_ro, blobid_md_ro;
struct spdk_blob *blob_invalid, *blob_data_ro, *blob_md_ro; struct spdk_blob *blob_invalid, *blob_data_ro, *blob_md_ro;
struct spdk_bs_opts opts; struct spdk_bs_opts opts;
struct spdk_blob_opts blob_opts;
int rc; int rc;
dev = init_dev(); dev = init_dev();
spdk_bs_opts_init(&opts); spdk_bs_opts_init(&opts);
spdk_blob_opts_init(&blob_opts);
/* Initialize a new blob store */ /* Initialize a new blob store */
spdk_bs_init(dev, &opts, bs_op_with_handle_complete, NULL); spdk_bs_init(dev, &opts, bs_op_with_handle_complete, NULL);
@ -4034,7 +4036,8 @@ blob_flags(void)
CU_ASSERT(g_blobid != SPDK_BLOBID_INVALID); CU_ASSERT(g_blobid != SPDK_BLOBID_INVALID);
blobid_data_ro = g_blobid; blobid_data_ro = g_blobid;
spdk_bs_create_blob(g_bs, blob_op_with_id_complete, NULL); blob_opts.clear_method = BLOB_CLEAR_WITH_WRITE_ZEROES;
spdk_bs_create_blob_ext(g_bs, &blob_opts, blob_op_with_id_complete, NULL);
poll_threads(); poll_threads();
CU_ASSERT(g_bserrno == 0); CU_ASSERT(g_bserrno == 0);
CU_ASSERT(g_blobid != SPDK_BLOBID_INVALID); CU_ASSERT(g_blobid != SPDK_BLOBID_INVALID);
@ -4057,6 +4060,7 @@ blob_flags(void)
CU_ASSERT(g_bserrno == 0); CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_blob != NULL); SPDK_CU_ASSERT_FATAL(g_blob != NULL);
blob_md_ro = g_blob; blob_md_ro = g_blob;
CU_ASSERT((blob_md_ro->md_ro_flags & SPDK_BLOB_MD_RO_FLAGS_MASK) == BLOB_CLEAR_WITH_WRITE_ZEROES);
/* Change the size of blob_data_ro to check if flags are serialized /* Change the size of blob_data_ro to check if flags are serialized
* when blob has non zero number of extents */ * when blob has non zero number of extents */