Commit 074f4d76 authored by Piotr Pelplinski's avatar Piotr Pelplinski Committed by Daniel Verkamp
Browse files

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: default avatarPiotr Pelplinski <piotr.pelplinski@intel.com>
Change-Id: Iffed601c78cb83231bb20e7ef05b73847dc3c95a
Reviewed-on: https://review.gerrithub.io/394243


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
parent be774bf6
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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 */
+7 −2
Original line number Diff line number Diff line
@@ -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);
}

+32 −0
Original line number Diff line number Diff line
@@ -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);

}