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

Prepared for adding spdk iscsi poll group.

Change-Id: I8cca51fcf6ca0d51982b8f28d52c4d102ce1fd73
Signed-off-by: Ziye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/400903
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Ziye Yang 2018-02-22 10:26:00 +08:00 committed by Jim Harris
parent 59d901ad72
commit a2c6b71614
3 changed files with 41 additions and 13 deletions

View File

@ -37,14 +37,16 @@
#include "spdk_internal/event.h"
static void
spdk_iscsi_subsystem_init_complete(void *cb_arg, int rc)
{
spdk_subsystem_init_next(rc);
}
static void
spdk_iscsi_subsystem_init(void)
{
int rc;
rc = spdk_iscsi_init();
spdk_subsystem_init_next(rc);
spdk_iscsi_init(spdk_iscsi_subsystem_init_complete, NULL);
}
static void

View File

@ -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);

View File

@ -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