Commit a76cc7ce authored by Pawel Wodkowski's avatar Pawel Wodkowski Committed by Jim Harris
Browse files

bdev/iscsi: add create callback



Also convert bdev_iscsi_set_module_init() into new callback.

Change-Id: I439369180e1e10eab5dee6aba27ffb0489ea2550
Signed-off-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/410095


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 4e51a274
Loading
Loading
Loading
Loading
+36 −40
Original line number Diff line number Diff line
@@ -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;