Commit bdba3e7e authored by Maciej Szwed's avatar Maciej Szwed Committed by Daniel Verkamp
Browse files

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: default avatarMaciej Szwed <maciej.szwed@intel.com>
Change-Id: I90ce3b79baba0db0d875b106c94924be394aada9

Reviewed-on: https://review.gerrithub.io/385950


Reviewed-by: default avatarPiotr Pelpliński <piotr.pelplinski@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 97f3104b
Loading
Loading
Loading
Loading
+26 −24
Original line number Diff line number Diff line
@@ -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