diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index 85897829a..265ae11dc 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -138,6 +138,14 @@ spdk_lvol_open(struct spdk_lvol *lvol, spdk_lvol_op_with_handle_complete cb_fn, spdk_bs_md_open_blob(lvol->lvol_store->blobstore, lvol->blob_id, _spdk_lvol_open_cb, req); } +static void +_spdk_bs_unload_with_error_cb(void *cb_arg, int lvolerrno) +{ + struct spdk_lvs_with_handle_req *req = (struct spdk_lvs_with_handle_req *)cb_arg; + + req->cb_fn(req->cb_arg, NULL, req->lvserrno); + free(req); +} static void _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno) @@ -158,15 +166,9 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno) free(req); return; } else if (lvolerrno < 0) { - TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) { - TAILQ_REMOVE(&lvs->lvols, lvol, link); - free(lvol->old_name); - free(lvol); - } SPDK_ERRLOG("Failed to fetch blobs list\n"); - req->cb_fn(req->cb_arg, lvs, lvolerrno); - free(req); - return; + req->lvserrno = lvolerrno; + goto invalid; } blob_id = spdk_blob_get_id(blob); @@ -180,9 +182,8 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno) lvol = calloc(1, sizeof(*lvol)); if (!lvol) { SPDK_ERRLOG("Cannot alloc memory for lvol base pointer\n"); - req->cb_fn(req->cb_arg, lvs, -ENOMEM); - free(req); - return; + req->lvserrno = -ENOMEM; + goto invalid; } lvol->blob = blob; @@ -194,20 +195,18 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno) lvol->old_name = spdk_sprintf_alloc("%s_%"PRIu64, uuid, (uint64_t)blob_id); if (!lvol->old_name) { SPDK_ERRLOG("Cannot assign lvol name\n"); - req->cb_fn(req->cb_arg, lvs, -ENOMEM); - free(req); free(lvol); - return; + req->lvserrno = -ENOMEM; + goto invalid; } rc = spdk_bs_md_get_xattr_value(blob, "name", (const void **)&attr, &value_len); if (rc != 0 || value_len > SPDK_LVOL_NAME_MAX) { SPDK_ERRLOG("Cannot assign lvol name\n"); - req->cb_fn(req->cb_arg, lvs, -EINVAL); free(lvol->old_name); - free(req); free(lvol); - return; + req->lvserrno = -EINVAL; + goto invalid; } strncpy(lvol->name, attr, SPDK_LVOL_NAME_MAX); @@ -219,15 +218,18 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno) SPDK_INFOLOG(SPDK_TRACE_LVOL, "added lvol %s\n", lvol->old_name); spdk_bs_md_iter_next(bs, &blob, _spdk_load_next_lvol, req); -} -static void -_spdk_bs_unload_with_error_cb(void *cb_arg, int lvolerrno) -{ - struct spdk_lvs_with_handle_req *req = (struct spdk_lvs_with_handle_req *)cb_arg; + return; - req->cb_fn(req->cb_arg, NULL, req->lvserrno); - free(req); +invalid: + TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) { + TAILQ_REMOVE(&lvs->lvols, lvol, link); + free(lvol->old_name); + free(lvol); + } + + _spdk_lvs_free(lvs); + spdk_bs_unload(bs, _spdk_bs_unload_with_error_cb, req); } static void