Commit d68cc1e9 authored by Damiano Cipriani's avatar Damiano Cipriani Committed by Jim Harris
Browse files

vbdev_lvol: add lvol set external parent



This function is mostly a wrapper around
spdk_lvol_set_external_parent to set the parent external snapshot
of a lvol.
It also performs some operations over external snapshot bdev.

Change-Id: Ib08358b46c9e39472df6c66264db20c412214731
Signed-off-by: default avatarDamiano Cipriani <damiano.cipriani@suse.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21691


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent 2a6c8d3f
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -2023,4 +2023,42 @@ vbdev_lvol_shallow_copy(struct spdk_lvol *lvol, const char *bdev_name,
	return rc;
}

void
vbdev_lvol_set_external_parent(struct spdk_lvol *lvol, const char *esnap_name,
			       spdk_lvol_op_complete cb_fn, void *cb_arg)
{
	struct spdk_bdev_desc *desc;
	struct spdk_bdev *bdev;
	char bdev_uuid[SPDK_UUID_STRING_LEN];
	int rc;

	rc = spdk_bdev_open_ext(esnap_name, false, ignore_bdev_event_cb, NULL, &desc);
	if (rc != 0) {
		SPDK_ERRLOG("bdev '%s' could not be opened: error %d\n", esnap_name, rc);
		cb_fn(cb_arg, -ENODEV);
		return;
	}
	bdev = spdk_bdev_desc_get_bdev(desc);

	rc = spdk_uuid_fmt_lower(bdev_uuid, sizeof(bdev_uuid), spdk_bdev_get_uuid(bdev));
	if (rc != 0) {
		spdk_bdev_close(desc);
		SPDK_ERRLOG("bdev %s: unable to parse UUID\n", esnap_name);
		assert(false);
		cb_fn(cb_arg, -ENODEV);
		return;
	}

	/*
	 * If lvol store is not loaded from disk, and so vbdev_lvs_load is not called, these
	 * assignments are necessary to let vbdev_lvol_esnap_dev_create be called.
	 */
	lvol->lvol_store->load_esnaps = true;
	lvol->lvol_store->esnap_bs_dev_create = vbdev_lvol_esnap_dev_create;

	spdk_lvol_set_external_parent(lvol, bdev_uuid, sizeof(bdev_uuid), cb_fn, cb_arg);

	spdk_bdev_close(desc);
}

SPDK_LOG_REGISTER_COMPONENT(vbdev_lvol)
+11 −0
Original line number Diff line number Diff line
@@ -132,4 +132,15 @@ int vbdev_lvol_shallow_copy(struct spdk_lvol *lvol, const char *bdev_name,
			    spdk_blob_shallow_copy_status status_cb_fn, void *status_cb_arg,
			    spdk_lvol_op_complete cb_fn, void *cb_arg);

/**
 * \brief Set an external snapshot as the parent of a lvol.
 *
 * \param lvol Handle to lvol
 * \param esnap_name Name of the bdev that acts as external snapshot
 * \param cb_fn Completion callback
 * \param cb_arg Completion callback custom arguments
 */
void vbdev_lvol_set_external_parent(struct spdk_lvol *lvol, const char *esnap_name,
				    spdk_lvol_op_complete cb_fn, void *cb_arg);

#endif /* SPDK_VBDEV_LVOL_H */
+56 −0
Original line number Diff line number Diff line
@@ -924,6 +924,13 @@ spdk_lvol_shallow_copy(struct spdk_lvol *lvol, struct spdk_bs_dev *ext_dev,
	return 0;
}

void
spdk_lvol_set_external_parent(struct spdk_lvol *lvol, const void *esnap_id, uint32_t id_len,
			      spdk_lvol_op_complete cb_fn, void *cb_arg)
{
	cb_fn(cb_arg, 0);
}

static void
lvol_store_op_complete(void *cb_arg, int lvserrno)
{
@@ -970,6 +977,12 @@ vbdev_lvol_shallow_copy_complete(void *cb_arg, int lvolerrno)
	g_lvolerrno = lvolerrno;
}

static void
vbdev_lvol_op_complete(void *cb_arg, int lvolerrno)
{
	g_lvolerrno = lvolerrno;
}

static void
ut_lvs_destroy(void)
{
@@ -2029,6 +2042,48 @@ ut_lvol_shallow_copy(void)
	CU_ASSERT(g_lvol_store == NULL);
}

static void
ut_lvol_set_external_parent(void)
{
	struct spdk_lvol_store lvs = { 0 };
	struct spdk_lvol lvol = { 0 };
	struct spdk_bdev bdev = { 0 };
	const char *esnap_uuid = "255f4236-9427-42d0-a9d1-aa17f37dd8db";
	const char *esnap_name = "esnap1";
	int rc;

	lvol.lvol_store = &lvs;

	rc = spdk_uuid_parse(&bdev.uuid, esnap_uuid);
	CU_ASSERT(rc == 0);
	bdev.name = strdup(esnap_name);
	SPDK_CU_ASSERT_FATAL(bdev.name != NULL);
	bdev.blocklen = 512;
	bdev.blockcnt = 8192;

	g_base_bdev = &bdev;

	/* Error when the bdev does not exist */
	g_base_bdev = NULL;
	g_lvolerrno = 0xbad;
	vbdev_lvol_set_external_parent(&lvol, esnap_uuid, vbdev_lvol_op_complete, NULL);
	CU_ASSERT(g_lvolerrno == -ENODEV);

	/* Success when setting parent by bdev UUID */
	g_base_bdev = &bdev;
	g_lvolerrno = 0xbad;
	vbdev_lvol_set_external_parent(&lvol, esnap_uuid, vbdev_lvol_op_complete, NULL);
	CU_ASSERT(g_lvolerrno == 0);

	/* Success when setting parent by bdev name */
	g_lvolerrno = 0xbad;
	vbdev_lvol_set_external_parent(&lvol, esnap_name, vbdev_lvol_op_complete, NULL);
	CU_ASSERT(g_lvolerrno == 0);

	free(bdev.name);
	g_base_bdev = NULL;
}

int
main(int argc, char **argv)
{
@@ -2061,6 +2116,7 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, ut_esnap_dev_create);
	CU_ADD_TEST(suite, ut_lvol_esnap_clone_bad_args);
	CU_ADD_TEST(suite, ut_lvol_shallow_copy);
	CU_ADD_TEST(suite, ut_lvol_set_external_parent);

	allocate_threads(1);
	set_thread(0);