From 074f4d7627ea38cf74c1cd680429ba64c4757b76 Mon Sep 17 00:00:00 2001 From: Piotr Pelplinski Date: Wed, 10 Jan 2018 16:46:10 +0100 Subject: [PATCH] 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 Change-Id: Iffed601c78cb83231bb20e7ef05b73847dc3c95a Reviewed-on: https://review.gerrithub.io/394243 Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris Tested-by: SPDK Automated Test System --- include/spdk/blob.h | 6 +++++- lib/blob/blobstore.c | 9 ++++++-- test/unit/lib/blob/blob.c/blob_ut.c | 32 +++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/include/spdk/blob.h b/include/spdk/blob.h index 21f4961b5..57f626123 100644 --- a/include/spdk/blob.h +++ b/include/spdk/blob.h @@ -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 */ diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 29310c90f..83687a0c8 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -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); } diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index dca8b1e81..118fa0cf6 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -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); }