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(
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;