Commit 453f5ae9 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

bdev: unregister all bdevs in spdk_bdev_finish()



Instead of requiring each bdev module to track its own bdevs and clean
them up during its fini callback, we can walk the list of registered bdevs
during spdk_bdev_finish() and call spdk_bdev_unregister() on each one of
them before cleaning up the bdev modules.

Change-Id: I01816707c9100f66f542bfd73b90bcb0e0fb0c0c
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/389878


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 450ffbc6
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -490,7 +490,6 @@ typedef TAILQ_HEAD(bdev_part_tailq, spdk_bdev_part) SPDK_BDEV_PART_TAILQ;

void spdk_bdev_part_base_free(struct spdk_bdev_part_base *base);
void spdk_bdev_part_free(struct spdk_bdev_part *part);
void spdk_bdev_part_tailq_fini(struct bdev_part_tailq *tailq);
void spdk_bdev_part_base_hotremove(struct spdk_bdev *base_bdev, struct bdev_part_tailq *tailq);
int spdk_bdev_part_base_construct(struct spdk_bdev_part_base *base, struct spdk_bdev *bdev,
				  spdk_bdev_remove_cb_t remove_cb,
+45 −11
Original line number Diff line number Diff line
@@ -645,6 +645,50 @@ spdk_bdev_module_finish_done(void)
	}
}

static void
_spdk_bdev_finish_unregister_bdevs_iter(void *cb_arg, int bdeverrno)
{
	struct spdk_bdev *bdev = cb_arg;

	if (bdeverrno && bdev) {
		SPDK_WARNLOG("Unable to unregister bdev '%s' during spdk_bdev_finish()\n",
			     bdev->name);

		/*
		 * Since the call to spdk_bdev_unregister() failed, we have no way to free this
		 *  bdev; try to continue by manually removing this bdev from the list and continue
		 *  with the next bdev in the list.
		 */
		TAILQ_REMOVE(&g_bdev_mgr.bdevs, bdev, link);
	}

	if (TAILQ_EMPTY(&g_bdev_mgr.bdevs)) {
		SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Done unregistering bdevs\n");
		spdk_bdev_module_finish_iter(NULL);
		return;
	}

	/*
	 * Unregister the first bdev in the list.
	 *
	 * spdk_bdev_unregister() will handle the case where the bdev has open descriptors by
	 *  calling the remove_cb of the descriptors first.
	 *
	 * Once this bdev and all of its open descriptors have been cleaned up, this function
	 *  will be called again via the unregister completion callback to continue the cleanup
	 *  process with the next bdev.
	 */
	bdev = TAILQ_FIRST(&g_bdev_mgr.bdevs);
	SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Unregistering bdev '%s'\n", bdev->name);
	spdk_bdev_unregister(bdev, _spdk_bdev_finish_unregister_bdevs_iter, bdev);
}

static void
_spdk_bdev_finish_unregister_bdevs(void)
{
	_spdk_bdev_finish_unregister_bdevs_iter(NULL, 0);
}

void
spdk_bdev_finish(spdk_bdev_fini_cb cb_fn, void *cb_arg)
{
@@ -655,7 +699,7 @@ spdk_bdev_finish(spdk_bdev_fini_cb cb_fn, void *cb_arg)
	g_fini_cb_fn = cb_fn;
	g_fini_cb_arg = cb_arg;

	spdk_bdev_module_finish_iter(NULL);
	_spdk_bdev_finish_unregister_bdevs();
}

static struct spdk_bdev_io *
@@ -2107,16 +2151,6 @@ spdk_bdev_part_free(struct spdk_bdev_part *part)
	}
}

void
spdk_bdev_part_tailq_fini(struct bdev_part_tailq *tailq)
{
	struct spdk_bdev_part *part, *tmp;

	TAILQ_FOREACH_SAFE(part, tailq, tailq, tmp) {
		spdk_bdev_part_free(part);
	}
}

void
spdk_bdev_part_base_hotremove(struct spdk_bdev *base_bdev, struct bdev_part_tailq *tailq)
{
+1 −7
Original line number Diff line number Diff line
@@ -309,11 +309,5 @@ vbdev_error_examine(struct spdk_bdev *bdev)
	spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
}

static void
vbdev_error_fini(void)
{
	spdk_bdev_part_tailq_fini(&g_error_disks);
}

SPDK_BDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
SPDK_BDEV_MODULE_REGISTER(error, vbdev_error_init, NULL, NULL, NULL,
			  vbdev_error_examine)
+1 −7
Original line number Diff line number Diff line
@@ -358,12 +358,6 @@ vbdev_gpt_init(void)
	return 0;
}

static void
vbdev_gpt_fini(void)
{
	spdk_bdev_part_tailq_fini(&g_gpt_disks);
}

static void
vbdev_gpt_examine(struct spdk_bdev *bdev)
{
@@ -381,6 +375,6 @@ vbdev_gpt_examine(struct spdk_bdev *bdev)
	}
}

SPDK_BDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, vbdev_gpt_fini, NULL,
SPDK_BDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, NULL, NULL,
			  NULL, vbdev_gpt_examine)
SPDK_LOG_REGISTER_COMPONENT("vbdev_gpt", SPDK_LOG_VBDEV_GPT)
+1 −22
Original line number Diff line number Diff line
@@ -794,26 +794,6 @@ vbdev_lvs_init(void)
	return 0;
}

static void
vbdev_lvs_fini_next(void *cb_arg, int lvserrno)
{
	struct lvol_store_bdev *lvs_bdev;

	lvs_bdev = TAILQ_FIRST(&g_spdk_lvol_pairs);
	if (lvs_bdev == NULL) {
		spdk_bdev_module_finish_done();
		return;
	}

	vbdev_lvs_unload(lvs_bdev->lvs, vbdev_lvs_fini_next, cb_arg);
}

static void
vbdev_lvs_fini(void)
{
	vbdev_lvs_fini_next(NULL, 0);
}

static int
vbdev_lvs_get_ctx_size(void)
{
@@ -942,7 +922,6 @@ vbdev_lvs_examine(struct spdk_bdev *bdev)

	spdk_lvs_load(bs_dev, _vbdev_lvs_examine_cb, req);
}
SPDK_BDEV_MODULE_REGISTER(lvol, vbdev_lvs_init, vbdev_lvs_fini, NULL, vbdev_lvs_get_ctx_size,
SPDK_BDEV_MODULE_REGISTER(lvol, vbdev_lvs_init, NULL, NULL, vbdev_lvs_get_ctx_size,
			  vbdev_lvs_examine)
SPDK_BDEV_MODULE_ASYNC_FINI(lvol);
SPDK_LOG_REGISTER_COMPONENT("vbdev_lvol", SPDK_LOG_VBDEV_LVOL);
Loading