Commit 1e4f9974 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

bdev: do not finish unitialized modules



To achieve its goal, this patch changes the order
in which bdev modules are finished. All modules
that examine bdevs (e.g. lvol,split,...) will be now
finished last. It should not cause any issues though,
since all bdevs are already removed at the time when
any module finish is called

Fixes #387

Change-Id: Id60c375eb5c3d7306b69cdce86bded77354868d8
Signed-off-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/421158


Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 03f2a463
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ struct spdk_bdev_mgr {

	void *zero_buffer;

	TAILQ_HEAD(, spdk_bdev_module) bdev_modules;
	TAILQ_HEAD(bdev_module_list, spdk_bdev_module) bdev_modules;

	struct spdk_bdev_list bdevs;

@@ -688,6 +688,9 @@ spdk_bdev_module_examine_done(struct spdk_bdev_module *module)
	spdk_bdev_module_action_done(module);
}

/** The last initialized bdev module */
static struct spdk_bdev_module *g_resume_bdev_module = NULL;

static int
spdk_bdev_modules_init(void)
{
@@ -695,14 +698,15 @@ spdk_bdev_modules_init(void)
	int rc = 0;

	TAILQ_FOREACH(module, &g_bdev_mgr.bdev_modules, internal.tailq) {
		g_resume_bdev_module = module;
		rc = module->module_init();
		if (rc != 0) {
			break;
			return rc;
		}
	}

	g_bdev_mgr.module_init_complete = true;
	return rc;
	g_resume_bdev_module = NULL;
	return 0;
}


@@ -821,6 +825,7 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg)
				"bdev_mgr");

	rc = spdk_bdev_modules_init();
	g_bdev_mgr.module_init_complete = true;
	if (rc != 0) {
		SPDK_ERRLOG("bdev modules init failed\n");
		spdk_thread_send_msg(spdk_get_thread(), spdk_bdev_init_failed, NULL);
@@ -865,8 +870,6 @@ spdk_bdev_mgr_unregister_cb(void *io_device)
	g_fini_cb_arg = NULL;
}

static struct spdk_bdev_module *g_resume_bdev_module = NULL;

static void
spdk_bdev_module_finish_iter(void *arg)
{
@@ -874,9 +877,10 @@ spdk_bdev_module_finish_iter(void *arg)

	/* Start iterating from the last touched module */
	if (!g_resume_bdev_module) {
		bdev_module = TAILQ_FIRST(&g_bdev_mgr.bdev_modules);
		bdev_module = TAILQ_LAST(&g_bdev_mgr.bdev_modules, bdev_module_list);
	} else {
		bdev_module = TAILQ_NEXT(g_resume_bdev_module, internal.tailq);
		bdev_module = TAILQ_PREV(g_resume_bdev_module, bdev_module_list,
					 internal.tailq);
	}

	while (bdev_module) {
@@ -897,7 +901,8 @@ spdk_bdev_module_finish_iter(void *arg)
			return;
		}

		bdev_module = TAILQ_NEXT(bdev_module, internal.tailq);
		bdev_module = TAILQ_PREV(bdev_module, bdev_module_list,
					 internal.tailq);
	}

	g_resume_bdev_module = NULL;