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:
Piotr Pelplinski 2018-01-10 16:46:10 +01:00 committed by Daniel Verkamp
parent be774bf664
commit 074f4d7627
3 changed files with 44 additions and 3 deletions

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);
}