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

lvol: claim base bdev on lvol load



Signed-off-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
Change-Id: Idd19b8be38a843dfd50710c09d0c6c31773c2f0c
Reviewed-on: https://review.gerrithub.io/380014


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent c4fe4798
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ _vbdev_lvs_create_cb(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno)
	struct spdk_lvs_with_handle_req *req = cb_arg;
	struct lvol_store_bdev *lvs_bdev;
	struct spdk_bdev *bdev = req->base_bdev;
	struct spdk_bs_dev *bs_dev = req->bs_dev;

	if (lvserrno != 0) {
		assert(lvs == NULL);
@@ -71,6 +72,13 @@ _vbdev_lvs_create_cb(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno)
		goto end;
	}

	lvserrno = spdk_bs_bdev_claim(bs_dev, SPDK_GET_BDEV_MODULE(lvol));
	if (lvserrno != 0) {
		SPDK_INFOLOG(SPDK_TRACE_VBDEV_LVOL, "Lvol store base bdev already claimed by another bdev\n");
		req->bs_dev->destroy(req->bs_dev);
		goto end;
	}

	assert(lvs != NULL);

	lvs_bdev = calloc(1, sizeof(*lvs_bdev));
@@ -160,28 +168,38 @@ vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn,
	struct lvol_store_bdev *lvs_bdev;
	struct spdk_lvol *lvol, *tmp;

	lvs_bdev = vbdev_get_lvs_bdev_by_lvs(lvs);
	TAILQ_REMOVE(&g_spdk_lvol_pairs, lvs_bdev, lvol_stores);

	req = calloc(1, sizeof(*req));
	if (!req) {
		SPDK_ERRLOG("Cannot alloc memory for vbdev lvol store request pointer\n");
		if (cb_fn != NULL)
			cb_fn(cb_arg, -ENOMEM);
		return;
	}

	req->cb_fn = cb_fn;
	req->cb_arg = cb_arg;

	lvs_bdev = vbdev_get_lvs_bdev_by_lvs(lvs);
	TAILQ_REMOVE(&g_spdk_lvol_pairs, lvs_bdev, lvol_stores);

	free(lvs_bdev);

	if (TAILQ_EMPTY(&lvs->lvols)) {
		spdk_lvs_unload(lvs, _vbdev_lvs_destruct_cb, req);
	} else {
		lvs->destruct_req = req;
		lvs->destruct_req = calloc(1, sizeof(*lvs->destruct_req));
		if (!lvs->destruct_req) {
			SPDK_ERRLOG("Cannot alloc memory for vbdev lvol store request pointer\n");
			_vbdev_lvs_destruct_cb(req, -ENOMEM);
			return;
		}
		lvs->destruct_req->cb_fn = _vbdev_lvs_destruct_cb;
		lvs->destruct_req->cb_arg = req;
		TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) {
			lvol->close_only = true;
			spdk_bdev_unregister(lvol->bdev);
			spdk_vbdev_unregister(lvol->bdev);
		}
	}

	free(lvs_bdev);
}

struct lvol_store_bdev *
@@ -462,7 +480,7 @@ _create_lvol_disk(struct spdk_lvol *lvol)
	bdev->fn_table = &vbdev_lvol_fn_table;
	bdev->module = SPDK_GET_BDEV_MODULE(lvol);

	spdk_bdev_register(bdev);
	spdk_vbdev_register(bdev, &lvs_bdev->bdev, 1);

	return bdev;
}
+13 −4
Original line number Diff line number Diff line
@@ -54,8 +54,19 @@ bool lvol_store_initialize_fail = false;
bool lvol_store_initialize_cb_fail = false;
bool lvol_already_opened = false;

int
spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module_if *module)
{
	if (lvol_already_opened == true)
		return -1;

	lvol_already_opened = true;

	return 0;
}

void
spdk_bdev_unregister(struct spdk_bdev *bdev)
spdk_vbdev_unregister(struct spdk_bdev *vbdev)
{
	return;
}
@@ -85,8 +96,6 @@ spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb,
	if (lvol_already_opened == true)
		return NULL;

	lvol_already_opened = true;

	bs_dev = calloc(1, sizeof(*bs_dev));
	bs_dev->destroy = bdev_blob_destroy;

@@ -266,7 +275,7 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
}

void
spdk_bdev_register(struct spdk_bdev *bdev)
spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count)
{
}