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:
parent
97f3104bc7
commit
bdba3e7e01
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user