From 42ad9d0379b10b71df592382b450780ffbcc161c Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Fri, 21 May 2021 06:25:37 -0400 Subject: [PATCH] lib/blob: resize open_blobids on bs load open_blobids holds bit array of currently open blobs, this is a way for quicker determination than iterating over all blobs. See patch introducing it: (30ee8137)blob: Add a bitmask for quickly checking which blobs are open That patch added resizes of this bit array to bs init and bs recovery path (not shut down cleanly). But that patch skipped over bs load from a clean shutdown. This resulted in blob open having multiple blob pointers that target the same blob id. Fixes #1937 Signed-off-by: Tomasz Zawadzki Change-Id: I3c42a63d168d1f5b013b449f010c5b207936045b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7998 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Ziye Yang Community-CI: Mellanox Build Bot --- lib/blob/blobstore.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 3476bed13..b6f00c623 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -4366,6 +4366,12 @@ bs_load_super_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) } ctx->bs->md_start = ctx->super->md_start; ctx->bs->md_len = ctx->super->md_len; + rc = spdk_bit_array_resize(&ctx->bs->open_blobids, ctx->bs->md_len); + if (rc < 0) { + bs_load_ctx_fail(ctx, -ENOMEM); + return; + } + ctx->bs->total_data_clusters = ctx->bs->total_clusters - spdk_divide_round_up( ctx->bs->md_start + ctx->bs->md_len, ctx->bs->pages_per_cluster); ctx->bs->super_blob = ctx->super->super_blob;