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(
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user