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:
parent
7430431518
commit
3219bc9a80
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user