lvol: fix lvol store load on lvols load fail

Currently when one of lvols fail during loading we end up
with empty lvol store loaded, where we actually should
unload lvol store as well.

Signed-off-by: Maciej Szwed <maciej.szwed@intel.com>
Change-Id: I90ce3b79baba0db0d875b106c94924be394aada9

Reviewed-on: https://review.gerrithub.io/385950
Reviewed-by: Piotr Pelpliński <piotr.pelplinski@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Maciej Szwed 2017-11-06 20:37:25 +01:00 committed by Daniel Verkamp
parent 97f3104bc7
commit bdba3e7e01

View File

@ -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