Commit 304153e5 authored by yupeng's avatar yupeng Committed by Tomasz Zawadzki
Browse files

blobstore: calculate correct num_md_clusters in bs_recover



The current num_md_clusters doesn't include the the part before
md_start. So the bs_recover will get more num_free_clusters than it
should be. This patch can fix it.

Signed-off-by: default avatarPeng Yu <yupeng0921@gmail.com>
Change-Id: I911926beb69aca677da508ba71f292496c917e7f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9034


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 455a5d78
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4131,7 +4131,8 @@ bs_load_replay_md_chain_cpl(struct spdk_bs_load_ctx *ctx)
		bs_load_replay_cur_md_page(ctx);
	} else {
		/* Claim all of the clusters used by the metadata */
		num_md_clusters = spdk_divide_round_up(ctx->super->md_len, ctx->bs->pages_per_cluster);
		num_md_clusters = spdk_divide_round_up(
					  ctx->super->md_start + ctx->super->md_len, ctx->bs->pages_per_cluster);
		for (i = 0; i < num_md_clusters; i++) {
			spdk_bit_array_set(ctx->used_clusters, i);
		}
+49 −0
Original line number Diff line number Diff line
@@ -2656,6 +2656,54 @@ bs_super_block(void)
	g_bs = NULL;
}

static void
bs_test_recover_cluster_count(void)
{
	struct spdk_blob_store *bs;
	struct spdk_bs_dev *dev;
	struct spdk_bs_super_block super_block;
	struct spdk_bs_opts opts;

	dev = init_dev();
	spdk_bs_opts_init(&opts, sizeof(opts));
	snprintf(opts.bstype.bstype, sizeof(opts.bstype.bstype), "TESTTYPE");

	super_block.version = 3;
	memcpy(super_block.signature, "SPDKBLOB", sizeof(super_block.signature));
	super_block.length = 0x1000;
	super_block.clean = 0;
	super_block.super_blob = 0xFFFFFFFFFFFFFFFF;
	super_block.cluster_size = 4096;
	super_block.used_page_mask_start = 0x01;
	super_block.used_page_mask_len = 0x01;
	super_block.used_cluster_mask_start = 0x02;
	super_block.used_cluster_mask_len = 0x01;
	super_block.used_blobid_mask_start = 0x03;
	super_block.used_blobid_mask_len = 0x01;
	super_block.md_start = 0x04;
	super_block.md_len = 0x40;
	memset(super_block.bstype.bstype, 0, sizeof(super_block.bstype.bstype));
	super_block.size = dev->blockcnt * dev->blocklen;
	super_block.io_unit_size = 0x1000;
	memset(super_block.reserved, 0, 4000);
	super_block.crc = blob_md_page_calc_crc(&super_block);
	memcpy(g_dev_buffer, &super_block, sizeof(struct spdk_bs_super_block));

	memset(opts.bstype.bstype, 0, sizeof(opts.bstype.bstype));
	spdk_bs_load(dev, &opts, bs_op_with_handle_complete, NULL);
	poll_threads();
	CU_ASSERT(g_bserrno == 0);
	SPDK_CU_ASSERT_FATAL(g_bs != NULL);
	bs = g_bs;
	CU_ASSERT(bs->num_free_clusters == bs->total_clusters - (super_block.md_start +
			super_block.md_len));

	spdk_bs_unload(bs, bs_op_complete, NULL);
	poll_threads();
	CU_ASSERT(g_bserrno == 0);
	g_bs = NULL;
}

/*
 * Create a blobstore and then unload it.
 */
@@ -7085,6 +7133,7 @@ int main(int argc, char **argv)
	CU_ADD_TEST(suite, bs_destroy);
	CU_ADD_TEST(suite, bs_type);
	CU_ADD_TEST(suite, bs_super_block);
	CU_ADD_TEST(suite, bs_test_recover_cluster_count);
	CU_ADD_TEST(suite, blob_serialize_test);
	CU_ADD_TEST(suite_bs, blob_crc);
	CU_ADD_TEST(suite, super_block_crc);