From f4a018722c0fb4a50e55e9aa2e183e18f9aa6644 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 20 Jun 2018 14:10:32 -0700 Subject: [PATCH] blob: factor out mask loading into a function This is duplicated in three places; combine them into a shared helper function. Change-Id: I47682da8fa8b13134a6422c6a0e8a4d68f12ee36 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/416257 Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System --- lib/blob/blobstore.c | 52 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index c5dafb5a6f1..991f032ee41 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -2528,6 +2528,26 @@ _spdk_bs_set_mask(struct spdk_bit_array *array, struct spdk_bs_md_mask *mask) } } +static int +_spdk_bs_load_mask(struct spdk_bit_array **array_ptr, struct spdk_bs_md_mask *mask) +{ + struct spdk_bit_array *array; + uint32_t i; + + if (spdk_bit_array_resize(array_ptr, mask->length) < 0) { + return -ENOMEM; + } + + array = *array_ptr; + for (i = 0; i < mask->length; i++) { + if (mask->mask[i / 8] & (1U << (i % 8))) { + spdk_bit_array_set(array, i); + } + } + + return 0; +} + static void _spdk_bs_write_super(spdk_bs_sequence_t *seq, struct spdk_blob_store *bs, struct spdk_bs_super_block *super, spdk_bs_sequence_cpl cb_fn, void *cb_arg) @@ -2665,7 +2685,6 @@ static void _spdk_bs_load_used_blobids_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) { struct spdk_bs_load_ctx *ctx = cb_arg; - uint32_t i; int rc; /* The type must be correct */ @@ -2679,19 +2698,13 @@ _spdk_bs_load_used_blobids_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrn * (in pages) of the metadata region */ assert(ctx->mask->length == ctx->super->md_len); - rc = spdk_bit_array_resize(&ctx->bs->used_blobids, ctx->mask->length); + rc = _spdk_bs_load_mask(&ctx->bs->used_blobids, ctx->mask); if (rc < 0) { spdk_dma_free(ctx->mask); - _spdk_bs_load_ctx_fail(seq, ctx, -ENOMEM); + _spdk_bs_load_ctx_fail(seq, ctx, rc); return; } - for (i = 0; i < ctx->mask->length; i++) { - if (ctx->mask->mask[i / 8] & (1U << (i % 8))) { - spdk_bit_array_set(ctx->bs->used_blobids, i); - } - } - _spdk_bs_load_complete(seq, ctx, bserrno); } @@ -2700,7 +2713,6 @@ _spdk_bs_load_used_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserr { struct spdk_bs_load_ctx *ctx = cb_arg; uint64_t lba, lba_count, mask_size; - uint32_t i; int rc; /* The type must be correct */ @@ -2711,19 +2723,13 @@ _spdk_bs_load_used_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserr /* The length of the mask must be exactly equal to the total number of clusters */ assert(ctx->mask->length == ctx->bs->total_clusters); - rc = spdk_bit_array_resize(&ctx->bs->used_clusters, ctx->bs->total_clusters); + rc = _spdk_bs_load_mask(&ctx->bs->used_clusters, ctx->mask); if (rc < 0) { spdk_dma_free(ctx->mask); - _spdk_bs_load_ctx_fail(seq, ctx, -ENOMEM); + _spdk_bs_load_ctx_fail(seq, ctx, rc); return; } - for (i = 0; i < ctx->mask->length; i++) { - if (ctx->mask->mask[i / 8] & (1U << (i % 8))) { - spdk_bit_array_set(ctx->bs->used_clusters, i); - } - } - ctx->bs->num_free_clusters = spdk_bit_array_count_clear(ctx->bs->used_clusters); assert(ctx->bs->num_free_clusters <= ctx->bs->total_clusters); @@ -2747,7 +2753,6 @@ _spdk_bs_load_used_pages_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) { struct spdk_bs_load_ctx *ctx = cb_arg; uint64_t lba, lba_count, mask_size; - uint32_t i; int rc; /* The type must be correct */ @@ -2758,18 +2763,13 @@ _spdk_bs_load_used_pages_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) /* The length of the mask must be exactly equal to the size (in pages) of the metadata region */ assert(ctx->mask->length == ctx->super->md_len); - rc = spdk_bit_array_resize(&ctx->bs->used_md_pages, ctx->mask->length); + rc = _spdk_bs_load_mask(&ctx->bs->used_md_pages, ctx->mask); if (rc < 0) { spdk_dma_free(ctx->mask); - _spdk_bs_load_ctx_fail(seq, ctx, -ENOMEM); + _spdk_bs_load_ctx_fail(seq, ctx, rc); return; } - for (i = 0; i < ctx->mask->length; i++) { - if (ctx->mask->mask[i / 8] & (1U << (i % 8))) { - spdk_bit_array_set(ctx->bs->used_md_pages, i); - } - } spdk_dma_free(ctx->mask); /* Read the used clusters mask */