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