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:
parent
4e51a274de
commit
a76cc7ce61
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user