lib/blob: separate blob load md parsing from loading back_bs_dev

In current version, immidietly following parsing all
metadata pages an action is taken inform of loading the back_bs_dev.

Patches later in the series will add more metadata in form of
extent pages, which have to be read separetly from usual
blob metadata pages.

This patch add separation between the two steps,
so later a device read can be put between.

Additionally, _spdk_blob_load_final() when no snapshot was present
passed bserrno which was always 0. This patch just sets 0 directly
there as no errors occured at that point.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I4a77527f90bb1de12f972591067b7a50926f39c9
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/476427
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Tomasz Zawadzki 2019-11-29 06:47:58 -05:00
parent 7430431518
commit 3219bc9a80

View File

@ -952,14 +952,44 @@ _spdk_blob_load_snapshot_cpl(void *cb_arg, struct spdk_blob *snapshot, int bserr
_spdk_blob_load_final(ctx, bserrno);
}
static void
_spdk_blob_load_backing_dev(void *cb_arg)
{
struct spdk_blob_load_ctx *ctx = cb_arg;
struct spdk_blob *blob = ctx->blob;
const void *value;
size_t len;
int rc;
if (spdk_blob_is_thin_provisioned(blob)) {
rc = _spdk_blob_get_xattr_value(blob, BLOB_SNAPSHOT, &value, &len, true);
if (rc == 0) {
if (len != sizeof(spdk_blob_id)) {
_spdk_blob_load_final(ctx, -EINVAL);
return;
}
/* open snapshot blob and continue in the callback function */
blob->parent_id = *(spdk_blob_id *)value;
spdk_bs_open_blob(blob->bs, blob->parent_id,
_spdk_blob_load_snapshot_cpl, ctx);
return;
} else {
/* add zeroes_dev for thin provisioned blob */
blob->back_bs_dev = spdk_bs_create_zeroes_dev();
}
} else {
/* standard blob */
blob->back_bs_dev = NULL;
}
_spdk_blob_load_final(ctx, 0);
}
static void
_spdk_blob_load_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
{
struct spdk_blob_load_ctx *ctx = cb_arg;
struct spdk_blob *blob = ctx->blob;
struct spdk_blob_md_page *page;
const void *value;
size_t len;
int rc;
uint32_t crc;
@ -1004,27 +1034,7 @@ _spdk_blob_load_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
return;
}
if (spdk_blob_is_thin_provisioned(blob)) {
rc = _spdk_blob_get_xattr_value(blob, BLOB_SNAPSHOT, &value, &len, true);
if (rc == 0) {
if (len != sizeof(spdk_blob_id)) {
_spdk_blob_load_final(ctx, -EINVAL);
return;
}
/* open snapshot blob and continue in the callback function */
blob->parent_id = *(spdk_blob_id *)value;
spdk_bs_open_blob(blob->bs, blob->parent_id,
_spdk_blob_load_snapshot_cpl, ctx);
return;
} else {
/* add zeroes_dev for thin provisioned blob */
blob->back_bs_dev = spdk_bs_create_zeroes_dev();
}
} else {
/* standard blob */
blob->back_bs_dev = NULL;
}
_spdk_blob_load_final(ctx, bserrno);
_spdk_blob_load_backing_dev(ctx);
}
/* Load a blob from disk given a blobid */