blob: allocate ctx in bs_alloc

The ctx allocation was duplicated after both bs_alloc
calling sites, so this reduces the code a bit.  This change
also enables some future changes involving the used_clusters
bit array.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I4ea98f079dbe385654e9cb9c0c58a1926a990c9e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3973
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Jim Harris 2020-08-28 09:52:05 -07:00 committed by Tomasz Zawadzki
parent 39caf843a1
commit 04eb8e05d6

View File

@ -3166,9 +3166,11 @@ struct spdk_bs_load_ctx {
}; };
static int static int
bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_store **_bs) bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_store **_bs,
struct spdk_bs_load_ctx **_ctx)
{ {
struct spdk_blob_store *bs; struct spdk_blob_store *bs;
struct spdk_bs_load_ctx *ctx;
uint64_t dev_size; uint64_t dev_size;
int rc; int rc;
@ -3190,6 +3192,24 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
return -ENOMEM; return -ENOMEM;
} }
ctx = calloc(1, sizeof(struct spdk_bs_load_ctx));
if (!ctx) {
free(bs);
return -ENOMEM;
}
ctx->bs = bs;
ctx->iter_cb_fn = opts->iter_cb_fn;
ctx->iter_cb_arg = opts->iter_cb_arg;
ctx->super = spdk_zmalloc(sizeof(*ctx->super), 0x1000, NULL,
SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_DMA);
if (!ctx->super) {
free(ctx);
free(bs);
return -ENOMEM;
}
TAILQ_INIT(&bs->blobs); TAILQ_INIT(&bs->blobs);
TAILQ_INIT(&bs->snapshots); TAILQ_INIT(&bs->snapshots);
bs->dev = dev; bs->dev = dev;
@ -3210,6 +3230,8 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
bs->used_clusters = spdk_bit_array_create(bs->total_clusters); bs->used_clusters = spdk_bit_array_create(bs->total_clusters);
bs->io_unit_size = dev->blocklen; bs->io_unit_size = dev->blocklen;
if (bs->used_clusters == NULL) { if (bs->used_clusters == NULL) {
spdk_free(ctx->super);
free(ctx);
free(bs); free(bs);
return -ENOMEM; return -ENOMEM;
} }
@ -3235,11 +3257,14 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
spdk_bit_array_free(&bs->used_blobids); spdk_bit_array_free(&bs->used_blobids);
spdk_bit_array_free(&bs->used_md_pages); spdk_bit_array_free(&bs->used_md_pages);
spdk_bit_array_free(&bs->used_clusters); spdk_bit_array_free(&bs->used_clusters);
spdk_free(ctx->super);
free(ctx);
free(bs); free(bs);
/* FIXME: this is a lie but don't know how to get a proper error code here */ /* FIXME: this is a lie but don't know how to get a proper error code here */
return -ENOMEM; return -ENOMEM;
} }
*_ctx = ctx;
*_bs = bs; *_bs = bs;
return 0; return 0;
} }
@ -4239,34 +4264,13 @@ spdk_bs_load(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
return; return;
} }
err = bs_alloc(dev, &opts, &bs); err = bs_alloc(dev, &opts, &bs, &ctx);
if (err) { if (err) {
dev->destroy(dev); dev->destroy(dev);
cb_fn(cb_arg, NULL, err); cb_fn(cb_arg, NULL, err);
return; return;
} }
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM);
return;
}
ctx->bs = bs;
ctx->iter_cb_fn = opts.iter_cb_fn;
ctx->iter_cb_arg = opts.iter_cb_arg;
/* Allocate memory for the super block */
ctx->super = spdk_zmalloc(sizeof(*ctx->super), 0x1000, NULL,
SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_DMA);
if (!ctx->super) {
free(ctx);
bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM);
return;
}
cpl.type = SPDK_BS_CPL_TYPE_BS_HANDLE; cpl.type = SPDK_BS_CPL_TYPE_BS_HANDLE;
cpl.u.bs_handle.cb_fn = cb_fn; cpl.u.bs_handle.cb_fn = cb_fn;
cpl.u.bs_handle.cb_arg = cb_arg; cpl.u.bs_handle.cb_arg = cb_arg;
@ -4509,34 +4513,16 @@ spdk_bs_dump(struct spdk_bs_dev *dev, FILE *fp, spdk_bs_dump_print_xattr print_x
spdk_bs_opts_init(&opts); spdk_bs_opts_init(&opts);
err = bs_alloc(dev, &opts, &bs); err = bs_alloc(dev, &opts, &bs, &ctx);
if (err) { if (err) {
dev->destroy(dev); dev->destroy(dev);
cb_fn(cb_arg, err); cb_fn(cb_arg, err);
return; return;
} }
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
bs_free(bs);
cb_fn(cb_arg, -ENOMEM);
return;
}
ctx->bs = bs;
ctx->fp = fp; ctx->fp = fp;
ctx->print_xattr_fn = print_xattr_fn; ctx->print_xattr_fn = print_xattr_fn;
/* Allocate memory for the super block */
ctx->super = spdk_zmalloc(sizeof(*ctx->super), 0x1000, NULL,
SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_DMA);
if (!ctx->super) {
free(ctx);
bs_free(bs);
cb_fn(cb_arg, -ENOMEM);
return;
}
cpl.type = SPDK_BS_CPL_TYPE_BS_BASIC; cpl.type = SPDK_BS_CPL_TYPE_BS_BASIC;
cpl.u.bs_basic.cb_fn = cb_fn; cpl.u.bs_basic.cb_fn = cb_fn;
cpl.u.bs_basic.cb_arg = cb_arg; cpl.u.bs_basic.cb_arg = cb_arg;
@ -4620,7 +4606,7 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
return; return;
} }
rc = bs_alloc(dev, &opts, &bs); rc = bs_alloc(dev, &opts, &bs, &ctx);
if (rc) { if (rc) {
dev->destroy(dev); dev->destroy(dev);
cb_fn(cb_arg, NULL, rc); cb_fn(cb_arg, NULL, rc);
@ -4640,6 +4626,8 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
} }
rc = spdk_bit_array_resize(&bs->used_md_pages, bs->md_len); rc = spdk_bit_array_resize(&bs->used_md_pages, bs->md_len);
if (rc < 0) { if (rc < 0) {
spdk_free(ctx->super);
free(ctx);
bs_free(bs); bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
@ -4647,6 +4635,8 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
rc = spdk_bit_array_resize(&bs->used_blobids, bs->md_len); rc = spdk_bit_array_resize(&bs->used_blobids, bs->md_len);
if (rc < 0) { if (rc < 0) {
spdk_free(ctx->super);
free(ctx);
bs_free(bs); bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
@ -4654,29 +4644,13 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
rc = spdk_bit_array_resize(&bs->open_blobids, bs->md_len); rc = spdk_bit_array_resize(&bs->open_blobids, bs->md_len);
if (rc < 0) { if (rc < 0) {
bs_free(bs); spdk_free(ctx->super);
cb_fn(cb_arg, NULL, -ENOMEM);
return;
}
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM);
return;
}
ctx->bs = bs;
/* Allocate memory for the super block */
ctx->super = spdk_zmalloc(sizeof(*ctx->super), 0x1000, NULL,
SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_DMA);
if (!ctx->super) {
free(ctx); free(ctx);
bs_free(bs); bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
} }
memcpy(ctx->super->signature, SPDK_BS_SUPER_BLOCK_SIG, memcpy(ctx->super->signature, SPDK_BS_SUPER_BLOCK_SIG,
sizeof(ctx->super->signature)); sizeof(ctx->super->signature));
ctx->super->version = SPDK_BS_VERSION; ctx->super->version = SPDK_BS_VERSION;