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 <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/416257
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
Daniel Verkamp 2018-06-20 14:10:32 -07:00
parent a7b25a6770
commit f4a018722c

View File

@ -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 */