blob: set md_ro and data_ro fields only after persisting data
Currently, there is no possibility to save read only blob to disk. This patch modifies behaviour so that read only flags are applied after syncing blob. This is analogy to resize, set xattr and remove xattr operations. Signed-off-by: Piotr Pelplinski <piotr.pelplinski@intel.com> Change-Id: Iffed601c78cb83231bb20e7ef05b73847dc3c95a Reviewed-on: https://review.gerrithub.io/394243 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
be774bf664
commit
074f4d7627
@ -245,7 +245,11 @@ void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
* spdk_blob_sync_md() is called. */
|
||||
int spdk_blob_resize(struct spdk_blob *blob, size_t sz);
|
||||
|
||||
/* Set blob as read only */
|
||||
/* Set blob as read only.
|
||||
*
|
||||
* These changes do not take effect until
|
||||
* spdk_blob_sync_md() is called. */
|
||||
|
||||
void spdk_blob_set_read_only(struct spdk_blob *blob);
|
||||
|
||||
/* Sync a blob */
|
||||
|
@ -3125,8 +3125,6 @@ void spdk_blob_set_read_only(struct spdk_blob *b)
|
||||
{
|
||||
struct spdk_blob_data *blob = __blob_to_data(b);
|
||||
|
||||
blob->data_ro = true;
|
||||
blob->md_ro = true;
|
||||
blob->data_ro_flags |= SPDK_BLOB_READ_ONLY;
|
||||
|
||||
blob->state = SPDK_BLOB_STATE_DIRTY;
|
||||
@ -3138,6 +3136,13 @@ void spdk_blob_set_read_only(struct spdk_blob *b)
|
||||
static void
|
||||
_spdk_blob_sync_md_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
{
|
||||
struct spdk_blob_data *blob = __blob_to_data(cb_arg);
|
||||
|
||||
if (bserrno == 0 && (blob->data_ro_flags & SPDK_BLOB_READ_ONLY)) {
|
||||
blob->data_ro = true;
|
||||
blob->md_ro = true;
|
||||
}
|
||||
|
||||
spdk_bs_sequence_finish(seq, bserrno);
|
||||
}
|
||||
|
||||
|
@ -557,7 +557,13 @@ blob_read_only(void)
|
||||
spdk_blob_set_read_only(blob);
|
||||
|
||||
blob_data = __blob_to_data(blob);
|
||||
CU_ASSERT(blob_data->data_ro == false);
|
||||
CU_ASSERT(blob_data->md_ro == false);
|
||||
|
||||
spdk_blob_sync_md(blob, bs_op_complete, NULL);
|
||||
|
||||
CU_ASSERT(blob_data->data_ro == true);
|
||||
CU_ASSERT(blob_data->md_ro == true);
|
||||
CU_ASSERT(blob_data->data_ro_flags & SPDK_BLOB_READ_ONLY);
|
||||
|
||||
spdk_blob_close(blob, blob_op_complete, NULL);
|
||||
@ -570,6 +576,7 @@ blob_read_only(void)
|
||||
|
||||
blob_data = __blob_to_data(blob);
|
||||
CU_ASSERT(blob_data->data_ro == true);
|
||||
CU_ASSERT(blob_data->md_ro == true);
|
||||
CU_ASSERT(blob_data->data_ro_flags & SPDK_BLOB_READ_ONLY);
|
||||
|
||||
spdk_blob_close(blob, blob_op_complete, NULL);
|
||||
@ -578,6 +585,31 @@ blob_read_only(void)
|
||||
spdk_bs_unload(g_bs, bs_op_complete, NULL);
|
||||
CU_ASSERT(g_bserrno == 0);
|
||||
g_bs = NULL;
|
||||
g_blob = NULL;
|
||||
g_blobid = 0;
|
||||
|
||||
/* Load an existing blob store */
|
||||
dev = init_dev();
|
||||
strncpy(opts.bstype.bstype, "TESTTYPE", SPDK_BLOBSTORE_TYPE_LENGTH);
|
||||
spdk_bs_load(dev, &opts, bs_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_bserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
|
||||
|
||||
spdk_bs_open_blob(g_bs, blobid, blob_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_bserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_blob != NULL);
|
||||
blob = g_blob;
|
||||
|
||||
blob_data = __blob_to_data(blob);
|
||||
CU_ASSERT(blob_data->data_ro == true);
|
||||
CU_ASSERT(blob_data->md_ro == true);
|
||||
CU_ASSERT(blob_data->data_ro_flags & SPDK_BLOB_READ_ONLY);
|
||||
|
||||
spdk_blob_close(blob, blob_op_complete, NULL);
|
||||
CU_ASSERT(g_bserrno == 0);
|
||||
|
||||
spdk_bs_unload(g_bs, bs_op_complete, NULL);
|
||||
CU_ASSERT(g_bserrno == 0);
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user