diff --git a/lib/bdev/iscsi/bdev_iscsi.c b/lib/bdev/iscsi/bdev_iscsi.c index 38f6049d2..8d929320b 100644 --- a/lib/bdev/iscsi/bdev_iscsi.c +++ b/lib/bdev/iscsi/bdev_iscsi.c @@ -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( g_iscsi_conn_req); static struct spdk_poller *g_conn_poller = NULL; -static bool g_module_is_initialized; struct bdev_iscsi_io { struct spdk_thread *submit_td; @@ -81,6 +80,8 @@ struct bdev_iscsi_lun { TAILQ_ENTRY(bdev_iscsi_lun) link; }; +typedef void (*spdk_bdev_iscsi_create_cb)(void); + struct bdev_iscsi_io_channel { struct spdk_poller *poller; struct bdev_iscsi_lun *lun; @@ -91,6 +92,7 @@ struct bdev_iscsi_conn_req { char *bdev_name; char *initiator_iqn; struct iscsi_context *context; + spdk_bdev_iscsi_create_cb create_cb; TAILQ_ENTRY(bdev_iscsi_conn_req) link; }; @@ -100,20 +102,15 @@ bdev_iscsi_get_ctx_size(void) 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 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) { - bdev_iscsi_remove_conn_req(req); + while (!TAILQ_EMPTY(&g_iscsi_conn_req)) { + req = TAILQ_FIRST(&g_iscsi_conn_req); + TAILQ_REMOVE(&g_iscsi_conn_req, req, link); + free(req); } if (g_conn_poller) { @@ -493,21 +490,6 @@ error_return: 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 iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status, void *command_data, void *private_data) @@ -529,9 +511,10 @@ iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status, } ret: + TAILQ_REMOVE(&g_iscsi_conn_req, req, link); + req->create_cb(); scsi_free_scsi_task(task); - bdev_iscsi_remove_conn_req(req); - bdev_iscsi_set_module_init(); + free(req); } static void @@ -549,10 +532,12 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, if (task) { return; } + ret: SPDK_ERRLOG("iSCSI error: %s\n", iscsi_get_error(req->context)); - bdev_iscsi_remove_conn_req(req); - bdev_iscsi_set_module_init(); + TAILQ_REMOVE(&g_iscsi_conn_req, req, link); + req->create_cb(); + free(req); } static int @@ -581,13 +566,14 @@ iscsi_bdev_conn_poll(void *arg) } 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 iscsi_url *iscsi_url = NULL; 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; } @@ -607,6 +593,8 @@ create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_ goto err; } + req->create_cb = cb_fn; + iscsi_url = iscsi_parse_full_url(req->context, url); if (iscsi_url == NULL) { 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); 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; err: @@ -649,6 +641,14 @@ err: 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 bdev_iscsi_initialize(void) { @@ -659,7 +659,7 @@ bdev_iscsi_initialize(void) sp = spdk_conf_find_section(NULL, "iSCSI_Initiator"); if (sp == NULL) { - _bdev_iscsi_set_module_init(); + spdk_bdev_module_init_done(&g_iscsi_bdev_module); return 0; } @@ -677,18 +677,14 @@ bdev_iscsi_initialize(void) 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) { break; } } - if (!TAILQ_EMPTY(&g_iscsi_conn_req)) { - g_conn_poller = spdk_poller_register(iscsi_bdev_conn_poll, NULL, 0); - } - - if (rc) { - bdev_iscsi_set_module_init(); + if (i == 0) { + spdk_bdev_module_init_done(&g_iscsi_bdev_module); } return rc;