bdev/iscsi: add create callback

Also convert bdev_iscsi_set_module_init() into new callback.

Change-Id: I439369180e1e10eab5dee6aba27ffb0489ea2550
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/410095
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Pawel Wodkowski 2018-05-04 02:03:23 +02:00 committed by Jim Harris
parent 4e51a274de
commit a76cc7ce61

View File

@ -58,7 +58,6 @@ static TAILQ_HEAD(, bdev_iscsi_lun) g_iscsi_lun_head = TAILQ_HEAD_INITIALIZER(g_
static TAILQ_HEAD(, bdev_iscsi_conn_req) g_iscsi_conn_req = TAILQ_HEAD_INITIALIZER( static TAILQ_HEAD(, bdev_iscsi_conn_req) g_iscsi_conn_req = TAILQ_HEAD_INITIALIZER(
g_iscsi_conn_req); g_iscsi_conn_req);
static struct spdk_poller *g_conn_poller = NULL; static struct spdk_poller *g_conn_poller = NULL;
static bool g_module_is_initialized;
struct bdev_iscsi_io { struct bdev_iscsi_io {
struct spdk_thread *submit_td; struct spdk_thread *submit_td;
@ -81,6 +80,8 @@ struct bdev_iscsi_lun {
TAILQ_ENTRY(bdev_iscsi_lun) link; TAILQ_ENTRY(bdev_iscsi_lun) link;
}; };
typedef void (*spdk_bdev_iscsi_create_cb)(void);
struct bdev_iscsi_io_channel { struct bdev_iscsi_io_channel {
struct spdk_poller *poller; struct spdk_poller *poller;
struct bdev_iscsi_lun *lun; struct bdev_iscsi_lun *lun;
@ -91,6 +92,7 @@ struct bdev_iscsi_conn_req {
char *bdev_name; char *bdev_name;
char *initiator_iqn; char *initiator_iqn;
struct iscsi_context *context; struct iscsi_context *context;
spdk_bdev_iscsi_create_cb create_cb;
TAILQ_ENTRY(bdev_iscsi_conn_req) link; TAILQ_ENTRY(bdev_iscsi_conn_req) link;
}; };
@ -100,20 +102,15 @@ bdev_iscsi_get_ctx_size(void)
return sizeof(struct bdev_iscsi_io); return sizeof(struct bdev_iscsi_io);
} }
static void
bdev_iscsi_remove_conn_req(struct bdev_iscsi_conn_req *req)
{
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
free(req);
}
static void static void
bdev_iscsi_finish_done(void) bdev_iscsi_finish_done(void)
{ {
struct bdev_iscsi_conn_req *req, *tmp; struct bdev_iscsi_conn_req *req;
TAILQ_FOREACH_SAFE(req, &g_iscsi_conn_req, link, tmp) { while (!TAILQ_EMPTY(&g_iscsi_conn_req)) {
bdev_iscsi_remove_conn_req(req); req = TAILQ_FIRST(&g_iscsi_conn_req);
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
free(req);
} }
if (g_conn_poller) { if (g_conn_poller) {
@ -493,21 +490,6 @@ error_return:
return NULL; return NULL;
} }
static void
_bdev_iscsi_set_module_init(void)
{
spdk_bdev_module_init_done(&g_iscsi_bdev_module);
g_module_is_initialized = true;
}
static void
bdev_iscsi_set_module_init(void)
{
if (!g_module_is_initialized && TAILQ_EMPTY(&g_iscsi_conn_req)) {
_bdev_iscsi_set_module_init();
}
}
static void static void
iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status, iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status,
void *command_data, void *private_data) void *command_data, void *private_data)
@ -529,9 +511,10 @@ iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status,
} }
ret: ret:
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
req->create_cb();
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
bdev_iscsi_remove_conn_req(req); free(req);
bdev_iscsi_set_module_init();
} }
static void static void
@ -549,10 +532,12 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status,
if (task) { if (task) {
return; return;
} }
ret: ret:
SPDK_ERRLOG("iSCSI error: %s\n", iscsi_get_error(req->context)); SPDK_ERRLOG("iSCSI error: %s\n", iscsi_get_error(req->context));
bdev_iscsi_remove_conn_req(req); TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
bdev_iscsi_set_module_init(); req->create_cb();
free(req);
} }
static int static int
@ -581,13 +566,14 @@ iscsi_bdev_conn_poll(void *arg)
} }
static int static int
create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_iqn) create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_iqn,
spdk_bdev_iscsi_create_cb cb_fn)
{ {
struct bdev_iscsi_conn_req *req; struct bdev_iscsi_conn_req *req;
struct iscsi_url *iscsi_url = NULL; struct iscsi_url *iscsi_url = NULL;
int rc; int rc;
if (!bdev_name || !url || !initiator_iqn || strlen(initiator_iqn) == 0) { if (!bdev_name || !url || !initiator_iqn || strlen(initiator_iqn) == 0 || !cb_fn) {
return -EINVAL; return -EINVAL;
} }
@ -607,6 +593,8 @@ create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_
goto err; goto err;
} }
req->create_cb = cb_fn;
iscsi_url = iscsi_parse_full_url(req->context, url); iscsi_url = iscsi_parse_full_url(req->context, url);
if (iscsi_url == NULL) { if (iscsi_url == NULL) {
SPDK_ERRLOG("could not parse URL: %s\n", iscsi_get_error(req->context)); SPDK_ERRLOG("could not parse URL: %s\n", iscsi_get_error(req->context));
@ -630,6 +618,10 @@ create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_
iscsi_destroy_url(iscsi_url); iscsi_destroy_url(iscsi_url);
TAILQ_INSERT_TAIL(&g_iscsi_conn_req, req, link); TAILQ_INSERT_TAIL(&g_iscsi_conn_req, req, link);
if (!g_conn_poller) {
g_conn_poller = spdk_poller_register(iscsi_bdev_conn_poll, NULL, 0);
}
return 0; return 0;
err: err:
@ -649,6 +641,14 @@ err:
return rc; return rc;
} }
static void
bdev_iscsi_initialize_cb(void)
{
if (TAILQ_EMPTY(&g_iscsi_conn_req)) {
spdk_bdev_module_init_done(&g_iscsi_bdev_module);
}
}
static int static int
bdev_iscsi_initialize(void) bdev_iscsi_initialize(void)
{ {
@ -659,7 +659,7 @@ bdev_iscsi_initialize(void)
sp = spdk_conf_find_section(NULL, "iSCSI_Initiator"); sp = spdk_conf_find_section(NULL, "iSCSI_Initiator");
if (sp == NULL) { if (sp == NULL) {
_bdev_iscsi_set_module_init(); spdk_bdev_module_init_done(&g_iscsi_bdev_module);
return 0; return 0;
} }
@ -677,18 +677,14 @@ bdev_iscsi_initialize(void)
break; break;
} }
rc = create_iscsi_disk(bdev_name, url, initiator_iqn); rc = create_iscsi_disk(bdev_name, url, initiator_iqn, bdev_iscsi_initialize_cb);
if (rc) { if (rc) {
break; break;
} }
} }
if (!TAILQ_EMPTY(&g_iscsi_conn_req)) { if (i == 0) {
g_conn_poller = spdk_poller_register(iscsi_bdev_conn_poll, NULL, 0); spdk_bdev_module_init_done(&g_iscsi_bdev_module);
}
if (rc) {
bdev_iscsi_set_module_init();
} }
return rc; return rc;