From 3219bc9a80bb834322bdeb419603aa28ad3927d6 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Fri, 29 Nov 2019 06:47:58 -0500 Subject: [PATCH] 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 Change-Id: I4a77527f90bb1de12f972591067b7a50926f39c9 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/476427 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Paul Luse Community-CI: SPDK CI Jenkins --- lib/blob/blobstore.c | 56 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 42eebbb4a..15deadf53 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -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 */