Commit a2c6b716 authored by Ziye Yang's avatar Ziye Yang Committed by Jim Harris
Browse files

lib/iscsi: Make iscsi subsystem init in an asynchronous way



Prepared for adding spdk iscsi poll group.

Change-Id: I8cca51fcf6ca0d51982b8f28d52c4d102ce1fd73
Signed-off-by: default avatarZiye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/400903


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 59d901ad
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -38,15 +38,17 @@
#include "spdk_internal/event.h"

static void
spdk_iscsi_subsystem_init(void)
spdk_iscsi_subsystem_init_complete(void *cb_arg, int rc)
{
	int rc;

	rc = spdk_iscsi_init();

	spdk_subsystem_init_next(rc);
}

static void
spdk_iscsi_subsystem_init(void)
{
	spdk_iscsi_init(spdk_iscsi_subsystem_init_complete, NULL);
}

static void
spdk_iscsi_subsystem_fini_done(void *arg)
{
+3 −1
Original line number Diff line number Diff line
@@ -317,7 +317,9 @@ extern struct spdk_iscsi_globals g_spdk_iscsi;

struct spdk_iscsi_task;

int spdk_iscsi_init(void);
typedef void (*spdk_iscsi_init_cb)(void *cb_arg, int rc);

void spdk_iscsi_init(spdk_iscsi_init_cb cb_fn, void *cb_arg);
typedef void (*spdk_iscsi_fini_cb)(void *arg);
void spdk_iscsi_fini(spdk_iscsi_fini_cb cb_fn, void *cb_arg);
void spdk_iscsi_fini_done(void);
+31 −7
Original line number Diff line number Diff line
@@ -45,6 +45,9 @@
#include "spdk_internal/event.h"
#include "spdk_internal/log.h"

static spdk_iscsi_init_cb g_init_cb_fn = NULL;
static void *g_init_cb_arg = NULL;

static spdk_iscsi_fini_cb g_fini_cb_fn;
static void *g_fini_cb_arg;

@@ -815,36 +818,57 @@ spdk_iscsi_app_read_parameters(void)
	return 0;
}

int
spdk_iscsi_init(void)

static void
spdk_iscsi_init_complete(int rc)
{
	spdk_iscsi_init_cb cb_fn = g_init_cb_fn;
	void *cb_arg = g_init_cb_arg;

	g_init_cb_fn = NULL;
	g_init_cb_arg = NULL;

	cb_fn(cb_arg, rc);
}

void
spdk_iscsi_init(spdk_iscsi_init_cb cb_fn, void *cb_arg)
{
	int rc;

	assert(cb_fn != NULL);
	g_init_cb_fn = cb_fn;
	g_init_cb_arg = cb_arg;

	rc = spdk_iscsi_app_read_parameters();
	if (rc < 0) {
		SPDK_ERRLOG("spdk_iscsi_app_read_parameters() failed\n");
		return -1;
		spdk_iscsi_init_complete(-1);
		return;
	}

	rc = spdk_iscsi_initialize_all_pools();
	if (rc != 0) {
		SPDK_ERRLOG("spdk_initialize_all_pools() failed\n");
		return -1;
		spdk_iscsi_init_complete(-1);
		return;
	}

	rc = spdk_iscsi_init_tgt_nodes();
	if (rc < 0) {
		SPDK_ERRLOG("spdk_iscsi_init_tgt_nodes() failed\n");
		return -1;
		spdk_iscsi_init_complete(-1);
		return;
	}

	rc = spdk_initialize_iscsi_conns();
	if (rc < 0) {
		SPDK_ERRLOG("spdk_initialize_iscsi_conns() failed\n");
		return -1;
		spdk_iscsi_init_complete(-1);
		return;
	}

	return 0;
	spdk_iscsi_init_complete(0);
}

void