From 4bfe81b676ae76c673955a4a25cf2fbccf6d4659 Mon Sep 17 00:00:00 2001 From: Piotr Pelplinski Date: Fri, 5 Jan 2018 10:15:19 +0100 Subject: [PATCH] blobstore: fix serializing flags This patch fixes issue when blobstore doesn't serialize flags when there is also at least one extent or xattr. Signed-off-by: Piotr Pelplinski Change-Id: I85d5031dc45df510cebe1acf4694ab62bca2e720 Reviewed-on: https://review.gerrithub.io/393770 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki Reviewed-by: Ben Walker --- lib/blob/blobstore.c | 1 + test/unit/lib/blob/blob.c/blob_ut.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index ae677d79f..8dcc85525 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -559,6 +559,7 @@ _spdk_blob_serialize(const struct spdk_blob_data *blob, struct spdk_blob_md_page /* Serialize flags */ _spdk_blob_serialize_flags(blob, buf, &remaining_sz); + buf += sizeof(struct spdk_blob_md_descriptor_flags); /* Serialize xattrs */ TAILQ_FOREACH(xattr, &blob->xattrs, link) { diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index 08212ab78..de783ebce 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -2119,6 +2119,7 @@ blob_flags(void) spdk_blob_id blobid_invalid, blobid_data_ro, blobid_md_ro; struct spdk_blob *blob_invalid, *blob_data_ro, *blob_md_ro; struct spdk_bs_opts opts; + int rc; dev = init_dev(); spdk_bs_opts_init(&opts); @@ -2159,6 +2160,16 @@ blob_flags(void) SPDK_CU_ASSERT_FATAL(g_blob != NULL); blob_md_ro = g_blob; + /* Change the size of blob_data_ro to check if flags are serialized + * when blob has non zero number of extents */ + rc = spdk_blob_resize(blob_data_ro, 10); + CU_ASSERT(rc == 0); + + /* Set the xattr to check if flags are serialized + * when blob has non zero number of xattrs */ + rc = spdk_blob_set_xattr(blob_md_ro, "name", "log.txt", strlen("log.txt") + 1); + CU_ASSERT(rc == 0); + __blob_to_data(blob_invalid)->invalid_flags = (1ULL << 63); __blob_to_data(blob_invalid)->state = SPDK_BLOB_STATE_DIRTY; __blob_to_data(blob_data_ro)->data_ro_flags = (1ULL << 62); @@ -2218,6 +2229,7 @@ blob_flags(void) /* If an unknown data_ro flag was found, the blob should be marked both data and md read-only. */ CU_ASSERT(__blob_to_data(blob_data_ro)->data_ro == true); CU_ASSERT(__blob_to_data(blob_data_ro)->md_ro == true); + CU_ASSERT(spdk_blob_get_num_clusters(blob_data_ro) == 10); g_blob = NULL; g_bserrno = -1;