summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:41:44 +0000
committermnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:41:44 +0000
commitd1d7e581e15f8b1cdfd9254f7230fede9e4da516 (patch)
tree32cf2d45c78413702bd69c54a6505dac6c340803
parent89cd930dc9315e7a657187fefc924d7ed021aa93 (diff)
downloadopen-iscsi-d1d7e581e15f8b1cdfd9254f7230fede9e4da516.tar.gz
use kernel list functions in almost all places (not queue.c yet), and fix some print output
git-svn-id: svn://svn.berlios.de/open-iscsi@815 d7303112-9cec-0310-bdd2-e83a94d6c2b6
-rw-r--r--usr/idbm.c10
-rw-r--r--usr/initiator.c158
-rw-r--r--usr/initiator.h25
-rw-r--r--usr/io.c4
-rw-r--r--usr/iscsi_sysfs.c74
-rw-r--r--usr/iscsi_sysfs.h13
-rw-r--r--usr/iscsiadm.c44
-rw-r--r--usr/iscsid.c14
-rw-r--r--usr/iscsistart.c2
-rw-r--r--usr/login.c16
-rw-r--r--usr/mgmt_ipc.c16
-rw-r--r--usr/netlink.c21
-rw-r--r--usr/transport.c22
-rw-r--r--usr/transport.h6
-rw-r--r--usr/util.c8
15 files changed, 181 insertions, 252 deletions
diff --git a/usr/idbm.c b/usr/idbm.c
index fab3bdb..0eb258a 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -403,7 +403,12 @@ idbm_print(int type, void *rec, int show, FILE *f)
static void
idbm_interface_setup_defaults(iface_rec_t *rec)
{
- sprintf(rec[0].name, "default");
+ int i;
+
+ for (i = 0; i < ISCSI_IFACE_MAX; i++) {
+ sprintf(rec[i].name, "default");
+ sprintf(rec[i].transport_name, "tcp");
+ }
}
static void
@@ -789,8 +794,7 @@ static int print_discovered(char *disc_path, int info_level)
else
printf("Portal: [%s]:%d,%d\n", address,
last_port, atoi(tpgt));
- last_address = namelist[i]->d_name +
- strlen(namelist[i]->d_name) + 1;
+ last_address = tpgt + strlen(tpgt) + 1;
}
printf(" Driver: %s\n", driver);
diff --git a/usr/initiator.c b/usr/initiator.c
index 57bacaf..b34b194 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -498,7 +498,7 @@ session_get(iscsi_session_t *session)
}
static iscsi_session_t*
-__session_create(node_rec_t *rec, iscsi_provider_t *provider)
+__session_create(node_rec_t *rec, struct iscsi_transport *t)
{
iscsi_session_t *session;
@@ -508,11 +508,11 @@ __session_create(node_rec_t *rec, iscsi_provider_t *provider)
return NULL;
}
+ INIT_LIST_HEAD(&session->list);
session_get(session);
/* opened at daemon load time (iscsid.c) */
session->ctrl_fd = control_fd;
- session->transport_handle = provider->handle;
- session->provider = provider;
+ session->t = t;
session->reopen_qtask.mgmt_ipc_fd = -1;
/* save node record. we might need it for redirection */
@@ -586,19 +586,18 @@ __session_create(node_rec_t *rec, iscsi_provider_t *provider)
__setup_authentication(session, &rec->session.auth);
session->param_mask = 0xFFFFFFFF;
- if (!(provider->caps & CAP_MULTI_R2T))
+ if (!(t->caps & CAP_MULTI_R2T))
session->param_mask &= ~(1 << ISCSI_PARAM_MAX_R2T);
- if (!(provider->caps & CAP_HDRDGST))
+ if (!(t->caps & CAP_HDRDGST))
session->param_mask &= ~(1 << ISCSI_PARAM_HDRDGST_EN);
- if (!(provider->caps & CAP_DATADGST))
+ if (!(t->caps & CAP_DATADGST))
session->param_mask &= ~(1 << ISCSI_PARAM_DATADGST_EN);
- if (!(provider->caps & CAP_MARKERS)) {
+ if (!(t->caps & CAP_MARKERS)) {
session->param_mask &= ~(1 << ISCSI_PARAM_IFMARKER_EN);
session->param_mask &= ~(1 << ISCSI_PARAM_OFMARKER_EN);
}
- insque(&session->item, &provider->sessions);
-
+ list_add_tail(&session->list, &t->sessions);
return session;
}
@@ -606,7 +605,7 @@ static void
__session_destroy(iscsi_session_t *session)
{
log_debug(1, "destroying session\n");
- remque(&session->item);
+ list_del(&session->list);
queue_flush(session->queue);
session_put(session);
}
@@ -644,14 +643,14 @@ __session_conn_shutdown(iscsi_conn_t *conn, queue_task_t *qtask,
actor_delete(&conn->connect_timer);
queue_flush(session->queue);
- if (ipc->destroy_conn(session->transport_handle, session->id,
+ if (ipc->destroy_conn(session->t->handle, session->id,
conn->id)) {
log_error("can not safely destroy connection %d", conn->id);
return MGMT_IPC_ERR_INTERNAL;
}
- conn->session->provider->utransport->ep_disconnect(conn);
+ conn->session->t->template->ep_disconnect(conn);
- if (ipc->destroy_session(session->transport_handle, session->id)) {
+ if (ipc->destroy_session(session->t->handle, session->id)) {
log_error("can not safely destroy session %d", session->id);
return MGMT_IPC_ERR_INTERNAL;
}
@@ -666,7 +665,7 @@ session_conn_shutdown(iscsi_conn_t *conn, queue_task_t *qtask,
{
iscsi_session_t *session = conn->session;
- if (ipc->stop_conn(session->transport_handle, session->id,
+ if (ipc->stop_conn(session->t->handle, session->id,
conn->id, STOP_CONN_TERM)) {
log_error("can't stop connection %d:%d (%d)",
session->id, conn->id, errno);
@@ -816,7 +815,7 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop)
if (do_stop) {
/* state: STATE_CLEANUP_WAIT */
- if (ipc->stop_conn(session->transport_handle, session->id,
+ if (ipc->stop_conn(session->t->handle, session->id,
conn->id, do_stop)) {
log_error("can't stop connection %d:%d (%d)",
session->id, conn->id, errno);
@@ -825,12 +824,12 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop)
log_debug(3, "connection %d:%d is stopped for recovery",
session->id, conn->id);
}
- conn->session->provider->utransport->ep_disconnect(conn);
+ conn->session->t->template->ep_disconnect(conn);
if (session->time2wait)
goto queue_reopen;
- rc = conn->session->provider->utransport->ep_connect(conn, 1);
+ rc = conn->session->t->template->ep_connect(conn, 1);
if (rc < 0 && errno != EINPROGRESS) {
char serv[NI_MAXSERV];
@@ -1113,7 +1112,7 @@ setup_full_feature_phase(iscsi_conn_t *conn)
if (!(session->param_mask & (1 << conntbl[i].param)))
continue;
- rc = ipc->set_param(session->transport_handle, session->id,
+ rc = ipc->set_param(session->t->handle, session->id,
conn->id, conntbl[i].param, conntbl[i].value,
conntbl[i].type);
if (rc && rc != -ENOSYS) {
@@ -1132,7 +1131,7 @@ setup_full_feature_phase(iscsi_conn_t *conn)
}
for (i = 0; i < MAX_HOST_PARAMS; i++) {
- rc = ipc->set_host_param(session->transport_handle,
+ rc = ipc->set_host_param(session->t->handle,
session->hostno, hosttbl[i].param,
hosttbl[i].value, hosttbl[i].type);
/* 2.6.20 and below returns EINVAL */
@@ -1151,7 +1150,7 @@ setup_full_feature_phase(iscsi_conn_t *conn)
conntbl[i].type);
}
- if (ipc->start_conn(session->transport_handle, session->id, conn->id,
+ if (ipc->start_conn(session->t->handle, session->id, conn->id,
&rc) || rc) {
__session_conn_shutdown(conn, c->qtask,
MGMT_IPC_ERR_INTERNAL);
@@ -1384,23 +1383,15 @@ __session_conn_recv_pdu(queue_item_t *item)
static int
__session_node_established(char *node_name)
{
- iscsi_provider_t *p;
- struct qelem *sitem, *pitem;
-
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- sitem = p->sessions.q_forw;
- while (sitem != &p->sessions) {
- iscsi_session_t *session = (iscsi_session_t *)sitem;
- if (session->conn[0].state == STATE_LOGGED_IN &&
- !strncmp(session->nrec.name, node_name, TARGET_NAME_MAXLEN))
+ struct iscsi_transport *t;
+ iscsi_session_t *session;
+
+ list_for_each_entry(t, &transports, list) {
+ list_for_each_entry(session, &t->sessions, list) {
+ if (!strncmp(session->nrec.name, node_name,
+ TARGET_NAME_MAXLEN))
return 1;
- sitem = sitem->q_forw;
}
-
- pitem = pitem->q_forw;
}
return 0;
}
@@ -1430,7 +1421,7 @@ __session_conn_poll(queue_item_t *item)
if (conn->state != STATE_XPT_WAIT)
return;
- rc = session->provider->utransport->ep_poll(conn, 1);
+ rc = session->t->template->ep_poll(conn, 1);
if (rc == 0) {
/* timedout: Poll again. */
queue_produce(session->queue, EV_CONN_POLL, qtask, 0, NULL);
@@ -1444,7 +1435,7 @@ __session_conn_poll(queue_item_t *item)
/* do not allocate new connection in case of reopen */
if (session->r_stage == R_STAGE_NO_CHANGE) {
if (conn->id == 0 &&
- ipc->create_session(session->transport_handle,
+ ipc->create_session(session->t->handle,
session->nrec.session.initial_cmdsn,
session->nrec.session.cmds_max,
session->nrec.session.queue_depth,
@@ -1464,7 +1455,7 @@ __session_conn_poll(queue_item_t *item)
session->isid[3] = session->id;
}
- if (ipc->create_conn(session->transport_handle,
+ if (ipc->create_conn(session->t->handle,
session->id, conn->id, &conn->id)) {
log_error("can't create connection (%d)",
errno);
@@ -1475,7 +1466,7 @@ __session_conn_poll(queue_item_t *item)
"%d:%d", session->id, conn->id);
}
- if (ipc->bind_conn(session->transport_handle, session->id,
+ if (ipc->bind_conn(session->t->handle, session->id,
conn->id, conn->transport_ep_handle,
(conn->id == 0), &rc) || rc) {
log_error("can't bind conn %d:%d to session %d, "
@@ -1521,17 +1512,17 @@ __session_conn_poll(queue_item_t *item)
return;
c_cleanup:
- if (ipc->destroy_conn(session->transport_handle, session->id,
+ if (ipc->destroy_conn(session->t->handle, session->id,
conn->id)) {
log_error("can not safely destroy connection %d:%d",
session->id, conn->id);
}
s_cleanup:
- if (ipc->destroy_session(session->transport_handle, session->id)) {
+ if (ipc->destroy_session(session->t->handle, session->id)) {
log_error("can not safely destroy session %d", session->id);
}
cleanup:
- session->provider->utransport->ep_disconnect(conn);
+ session->t->template->ep_disconnect(conn);
session_conn_cleanup(qtask, err);
}
@@ -1546,7 +1537,7 @@ __session_conn_timer(queue_item_t *item)
case STATE_XPT_WAIT:
switch (session->r_stage) {
case R_STAGE_NO_CHANGE:
- session->provider->utransport->ep_disconnect(conn);
+ session->t->template->ep_disconnect(conn);
log_debug(6, "conn_timer popped at XPT_WAIT: login");
/* timeout during initial connect.
* clean connection. write ipc rsp */
@@ -1743,54 +1734,33 @@ __session_mainloop(void *data)
iscsi_session_t*
session_find_by_sid(int sid)
{
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
iscsi_session_t *session;
- struct qelem *pitem, *sitem;
-
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- sitem = p->sessions.q_forw;
- while (sitem != &p->sessions) {
- session = (iscsi_session_t *)sitem;
+ list_for_each_entry(t, &transports, list) {
+ list_for_each_entry(session, &t->sessions, list) {
if (session->id == sid)
return session;
- sitem = sitem->q_forw;
}
- pitem = pitem->q_forw;
}
-
return NULL;
}
iscsi_session_t*
session_find_by_rec(node_rec_t *rec)
{
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
iscsi_session_t *session;
- struct qelem *pitem, *sitem;
-
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- sitem = p->sessions.q_forw;
- while (sitem != &p->sessions) {
- session = (iscsi_session_t *)sitem;
+ list_for_each_entry(t, &transports, list) {
+ list_for_each_entry(session, &t->sessions, list) {
if (iscsi_match_session(rec, session->nrec.name,
-1, session->nrec.conn[0].address,
session->nrec.conn[0].port,
session->id, session->nrec.iface.name))
return session;
-
- sitem = sitem->q_forw;
}
- pitem = pitem->q_forw;
}
-
return NULL;
}
@@ -1817,60 +1787,60 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask)
int rc;
iscsi_session_t *session;
iscsi_conn_t *conn;
- iscsi_provider_t *provider;
+ struct iscsi_transport *t;
- provider = get_transport_by_name(rec->iface.transport_name);
- if (!provider)
+ t = get_transport_by_name(rec->iface.transport_name);
+ if (!t)
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
- if (set_uspace_transport(provider))
+ if (set_transport_template(t))
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
- if ((!(provider->caps & CAP_RECOVERY_L0) &&
+ if ((!(t->caps & CAP_RECOVERY_L0) &&
rec->session.iscsi.ERL != 0) ||
- (!(provider->caps & CAP_RECOVERY_L1) &&
+ (!(t->caps & CAP_RECOVERY_L1) &&
rec->session.iscsi.ERL > 1)) {
log_error("transport '%s' does not support ERL %d",
- provider->name, rec->session.iscsi.ERL);
+ t->name, rec->session.iscsi.ERL);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- if (!(provider->caps & CAP_MULTI_R2T) &&
+ if (!(t->caps & CAP_MULTI_R2T) &&
rec->session.iscsi.MaxOutstandingR2T) {
log_error("transport '%s' does not support "
- "MaxOutstandingR2T %d", provider->name,
+ "MaxOutstandingR2T %d", t->name,
rec->session.iscsi.MaxOutstandingR2T);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- if (!(provider->caps & CAP_HDRDGST) &&
+ if (!(t->caps & CAP_HDRDGST) &&
rec->conn[0].iscsi.HeaderDigest) {
log_error("transport '%s' does not support "
- "HeaderDigest != None", provider->name);
+ "HeaderDigest != None", t->name);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- if (!(provider->caps & CAP_DATADGST) &&
+ if (!(t->caps & CAP_DATADGST) &&
rec->conn[0].iscsi.DataDigest) {
log_error("transport '%s' does not support "
- "DataDigest != None", provider->name);
+ "DataDigest != None", t->name);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- if (!(provider->caps & CAP_MARKERS) &&
+ if (!(t->caps & CAP_MARKERS) &&
rec->conn[0].iscsi.IFMarker) {
log_error("transport '%s' does not support IFMarker",
- provider->name);
+ t->name);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- if (!(provider->caps & CAP_MARKERS) &&
+ if (!(t->caps & CAP_MARKERS) &&
rec->conn[0].iscsi.OFMarker) {
log_error("transport '%s' does not support OFMarker",
- provider->name);
+ t->name);
return MGMT_IPC_ERR_TRANS_CAPS;
}
- session = __session_create(rec, provider);
+ session = __session_create(rec, t);
if (!session)
return MGMT_IPC_ERR_LOGIN_FAILURE;
@@ -1884,7 +1854,7 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask)
conn = &session->conn[0];
qtask->conn = conn;
- rc = session->provider->utransport->ep_connect(conn, 1);
+ rc = session->t->template->ep_connect(conn, 1);
if (rc < 0 && errno != EINPROGRESS) {
char serv[NI_MAXSERV];
@@ -1932,16 +1902,16 @@ mgmt_ipc_err_e
iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid)
{
iscsi_session_t *session;
- iscsi_provider_t *provider;
+ struct iscsi_transport *t;
int err;
- provider = get_transport_by_name(rec->iface.transport_name);
- if (!provider)
+ t = get_transport_by_name(rec->iface.transport_name);
+ if (!t)
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
- if (set_uspace_transport(provider))
+ if (set_transport_template(t))
return MGMT_IPC_ERR_TRANS_NOT_FOUND;
- session = __session_create(rec, provider);
+ session = __session_create(rec, t);
if (!session)
return MGMT_IPC_ERR_NOMEM;
diff --git a/usr/initiator.h b/usr/initiator.h
index a2ff51a..f9138d1 100644
--- a/usr/initiator.h
+++ b/usr/initiator.h
@@ -31,6 +31,7 @@
#include "config.h"
#include "actor.h"
#include "queue.h"
+#include "list.h"
#define ISCSI_CONFIG_ROOT "/etc/iscsi/"
#define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp"
@@ -200,33 +201,25 @@ typedef struct queue_task {
int mgmt_ipc_fd;
} queue_task_t;
-typedef enum iscsi_provider_status_e {
- PROVIDER_STATUS_UNKNOWN = 0,
- PROVIDER_STATUS_OPERATIONAL = 1,
- PROVIDER_STATUS_FAILED = 2,
-} iscsi_provider_status_e;
-
-struct iscsi_uspace_transport;
+struct iscsi_transport_template;
/* represents data path provider */
-typedef struct iscsi_provider_t {
- struct qelem list;
+struct iscsi_transport {
+ struct list_head list;
uint64_t handle;
uint32_t caps;
- iscsi_provider_status_e status;
char name[ISCSI_TRANSPORT_NAME_MAXLEN];
- struct qelem sessions;
- struct iscsi_uspace_transport *utransport;
-} iscsi_provider_t;
+ struct list_head sessions;
+ struct iscsi_transport_template *template;
+};
/* daemon's session structure */
typedef struct iscsi_session {
- struct qelem item; /* must stay at the top */
+ struct list_head list;
uint32_t id;
uint32_t hostno;
int refcount;
- uint64_t transport_handle;
- iscsi_provider_t *provider;
+ struct iscsi_transport *t;
node_rec_t nrec; /* copy of original Node record in database */
unsigned int irrelevant_keys_bitmap;
int send_async_text;
diff --git a/usr/io.c b/usr/io.c
index 9d36baf..85b0065 100644
--- a/usr/io.c
+++ b/usr/io.c
@@ -411,7 +411,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
pad_bytes = 0;
if (conn->kernel_io) {
- conn->send_pdu_begin(session->transport_handle, session->id,
+ conn->send_pdu_begin(session->t->handle, session->id,
conn->id, end - header,
ntoh24(hdr->dlength) + pad_bytes);
conn->send_pdu_timer_add(conn, timeout);
@@ -474,7 +474,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
}
if (conn->kernel_io) {
- if (conn->send_pdu_end(session->transport_handle, session->id,
+ if (conn->send_pdu_end(session->t->handle, session->id,
conn->id, &rc)) {
conn->send_pdu_timer_remove(conn);
ret = 0;
diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
index 9285293..6737582 100644
--- a/usr/iscsi_sysfs.c
+++ b/usr/iscsi_sysfs.c
@@ -36,6 +36,7 @@
#include "transport.h"
#include "version.h"
#include "iscsi_sysfs.h"
+#include "list.h"
#define ISCSI_TRANSPORT_DIR "/sys/class/iscsi_transport"
#define ISCSI_SESSION_DIR "/sys/class/iscsi_session"
@@ -47,8 +48,8 @@
/* tmp buffer used by sysfs functions */
static char sysfs_file[PATH_MAX];
-int num_providers = 0;
-struct qelem providers;
+int num_transports = 0;
+LIST_HEAD(transports);
int read_sysfs_file(char *filename, void *value, char *format)
{
@@ -73,12 +74,6 @@ int read_sysfs_file(char *filename, void *value, char *format)
return err;
}
-void init_providers(void)
-{
- providers.q_forw = &providers;
- providers.q_back = &providers;
-}
-
static int trans_filter(const struct dirent *dir)
{
return strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..");
@@ -86,17 +81,13 @@ static int trans_filter(const struct dirent *dir)
static int read_transports(void)
{
- struct qelem *item;
struct dirent **namelist;
char filename[64];
int i, n, found, err = 0;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
log_debug(7, "in %s", __FUNCTION__);
- if (num_providers == 0)
- init_providers();
-
n = scandir(ISCSI_TRANSPORT_DIR, &namelist, trans_filter,
versionsort);
if (n < 0) {
@@ -107,49 +98,43 @@ static int read_transports(void)
for (i = 0; i < n; i++) {
found = 0;
- /* copy existing pr vider to new array */
- item = providers.q_forw;
- while (item != &providers) {
- p = (iscsi_provider_t *)item;
-
- if (!strcmp(p->name, namelist[i]->d_name)) {
+ list_for_each_entry(t, &transports, list) {
+ if (!strcmp(t->name, namelist[i]->d_name)) {
found = 1;
break;
}
- item = item->q_forw;
}
if (found)
continue;
- /* copy new provider */
- p = malloc(sizeof(iscsi_provider_t));
- if (!p)
+ /* copy new transport */
+ t = malloc(sizeof(*t));
+ if (!t)
continue;
- p->sessions.q_forw = &p->sessions;
- p->sessions.q_back = &p->sessions;
-
- strncpy(p->name, namelist[i]->d_name,
+ INIT_LIST_HEAD(&t->sessions);
+ INIT_LIST_HEAD(&t->list);
+ strncpy(t->name, namelist[i]->d_name,
ISCSI_TRANSPORT_NAME_MAXLEN);
- sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/handle", p->name);
- err = read_sysfs_file(filename, &p->handle, "%llu\n");
+ sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/handle", t->name);
+ err = read_sysfs_file(filename, &t->handle, "%llu\n");
if (err)
continue;
- sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/caps", p->name);
- err = read_sysfs_file(filename, &p->caps, "0x%x");
+ sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/caps", t->name);
+ err = read_sysfs_file(filename, &t->caps, "0x%x");
if (err)
continue;
- insque(&p->list, &providers);
+ list_add_tail(&t->list, &transports);
}
for (i = 0; i < n; i++)
free(namelist[i]);
free(namelist);
- num_providers = n;
+ num_transports = n;
return 0;
}
@@ -560,29 +545,24 @@ static uint32_t get_target_no_from_sid(uint32_t sid, int *err)
}
-iscsi_provider_t *get_transport_by_name(char *transport_name)
+struct iscsi_transport *get_transport_by_name(char *transport_name)
{
- struct qelem *pitem;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
/* sync up kernel and userspace */
read_transports();
- /* check if the transport is loaded */
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- if (p->handle && !strncmp(p->name, transport_name,
+ /* check if the transport is loaded and matches */
+ list_for_each_entry(t, &transports, list) {
+ if (t->handle && !strncmp(t->name, transport_name,
ISCSI_TRANSPORT_NAME_MAXLEN))
- return p;
- pitem = pitem->q_forw;
+ return t;
}
return NULL;
}
/* TODO: replace the following functions with some decent sysfs links */
-iscsi_provider_t *get_transport_by_hba(long host_no)
+struct iscsi_transport *get_transport_by_hba(long host_no)
{
char name[ISCSI_TRANSPORT_NAME_MAXLEN];
int rc;
@@ -608,7 +588,7 @@ iscsi_provider_t *get_transport_by_hba(long host_no)
return get_transport_by_name(name);
}
-iscsi_provider_t *get_transport_by_sid(uint32_t sid)
+struct iscsi_transport *get_transport_by_sid(uint32_t sid)
{
uint32_t host_no;
int err;
@@ -745,7 +725,7 @@ pid_t scan_host(iscsi_session_t *session)
return __scan_host(session->hostno, 1);
}
-iscsi_provider_t *get_transport_by_session(char *sys_session)
+struct iscsi_transport *get_transport_by_session(char *sys_session)
{
uint32_t sid;
diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h
index 38e463e..e1e25a6 100644
--- a/usr/iscsi_sysfs.h
+++ b/usr/iscsi_sysfs.h
@@ -61,13 +61,12 @@ extern void set_device_online(int hostno, int target, int lun);
extern void delete_device(int hostno, int target, int lun);
extern int sysfs_for_each_device(int host_no, uint32_t sid,
void (* fn)(int host_no, int target, int lun));
-extern struct iscsi_provider_t *get_transport_by_hba(long host_no);
-extern struct iscsi_provider_t *get_transport_by_session(char *sys_session);
-extern struct iscsi_provider_t *get_transport_by_sid(uint32_t sid);
-extern struct iscsi_provider_t *get_transport_by_name(char *transport_name);
-extern void init_providers(void);
+extern struct iscsi_transport *get_transport_by_hba(long host_no);
+extern struct iscsi_transport *get_transport_by_session(char *sys_session);
+extern struct iscsi_transport *get_transport_by_sid(uint32_t sid);
+extern struct iscsi_transport *get_transport_by_name(char *transport_name);
-extern struct qelem providers;
-extern int num_providers;
+extern struct list_head transports;
+extern int num_transports;
#endif
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index 8ad1532..40fb4e7 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -351,15 +351,15 @@ logout_portal(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
node_rec_t tmprec, *rec = data;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
int rc;
- p = get_transport_by_sid(sid);
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
return 0;
if (!match_valid_session(rec, targetname, address, port, iface,
- p->name))
+ t->name))
return 0;
printf("Logout session [%s [%d] [%s]:%d %s]\n", iface, sid, address,
@@ -371,7 +371,7 @@ logout_portal(void *data, char *targetname, int tpgt, char *address,
tmprec.conn[0].port = port;
strncpy(tmprec.conn[0].address, address, NI_MAXHOST);
strncpy(tmprec.iface.name, iface, ISCSI_MAX_IFACE_LEN);
- strncpy(tmprec.iface.transport_name, p->name,
+ strncpy(tmprec.iface.transport_name, t->name,
ISCSI_TRANSPORT_NAME_MAXLEN);
rc = session_logout(&tmprec);
@@ -598,15 +598,15 @@ config_init(void)
static int print_session(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
- iscsi_provider_t *provider = get_transport_by_sid(sid);
+ struct iscsi_transport *t = get_transport_by_sid(sid);
if (strchr(address, '.'))
printf("%s: [%d] %s:%d,%d %s\n",
- provider ? provider->name : "NA",
+ t ? t->name : "NA",
sid, address, port, tpgt, targetname);
else
printf("%s: [%d] [%s]:%d,%d %s\n",
- provider ? provider->name : "NA",
+ t ? t->name : "NA",
sid, address, port, tpgt, targetname);
return 0;
}
@@ -798,7 +798,7 @@ static int print_scsi_state(int sid)
static void print_sessions_tree(struct list_head *list, int level)
{
struct session_data *curr, *prev = NULL, *tmp;
- iscsi_provider_t *provider;
+ struct iscsi_transport *t;
list_for_each_entry(curr, list, list) {
if (!prev || strcmp(prev->targetname, curr->targetname)) {
@@ -815,8 +815,8 @@ static void print_sessions_tree(struct list_head *list, int level)
printf("\tPortal: [%s]:%d,%d\n", curr->address,
curr->port, curr->tpgt);
}
- provider = get_transport_by_sid(curr->sid);
- printf("\t\tDriver: %s\n", provider ? provider->name : "NA");
+ t = get_transport_by_sid(curr->sid);
+ printf("\t\tDriver: %s\n", t ? t->name : "NA");
printf("\t\tHWaddress: %s\n", curr->iface);
printf("\t\tSID: %d\n", curr->sid);
print_iscsi_state(curr->sid);
@@ -890,13 +890,14 @@ static int rescan_portal(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
int host_no, err;
- iscsi_provider_t *p = get_transport_by_sid(sid);
+ struct iscsi_transport *t;
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
return 0;
if (!match_valid_session(data, targetname, address, port, iface,
- p->name))
+ t->name))
return 0;
printf("Rescanning session [%s [%d] [%s]:%d %s]\n", iface, sid, address,
@@ -916,16 +917,17 @@ static int
session_stats(void *data, char *targetname, int tpgt, char *address,
int port, int sid, char *iface)
{
- iscsi_provider_t *p = get_transport_by_sid(sid);
+ struct iscsi_transport *t;
int rc, i;
iscsiadm_req_t req;
iscsiadm_rsp_t rsp;
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
return 0;
if (!match_valid_session(data, targetname, address, port, iface,
- p->name))
+ t->name))
return 0;
memset(&req, 0, sizeof(req));
@@ -1593,7 +1595,7 @@ main(int argc, char **argv)
if (sid >= 0) {
char session[64];
int tmp_sid, tpgt;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
snprintf(session, 63, "session%d", sid);
session[63] = '\0';
@@ -1627,15 +1629,15 @@ main(int argc, char **argv)
goto free_iface;
}
- p = get_transport_by_sid(sid);
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
goto free_iface;
/* drop down to node ops */
rc = exec_node_op(db, op, do_login, do_logout, do_show,
do_rescan, do_stats, info_level,
targetname, ip, port, iface,
- p->name, name, value);
+ t->name, name, value);
free_iface:
free(iface);
free_address:
diff --git a/usr/iscsid.c b/usr/iscsid.c
index 73246dc..b42f608 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -94,7 +94,7 @@ Open-iSCSI initiator daemon.\n\
static void
setup_rec_from_negotiated_values(idbm_t *db, node_rec_t *rec,
- iscsi_provider_t *p, char *targetname,
+ struct iscsi_transport *t, char *targetname,
int tpgt, char *address,
int port, int sid, char *iface)
{
@@ -107,7 +107,7 @@ setup_rec_from_negotiated_values(idbm_t *db, node_rec_t *rec,
rec->conn[0].port = port;
strncpy(rec->conn[0].address, address, NI_MAXHOST);
strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN);
- strncpy(rec->iface.transport_name, p->name,
+ strncpy(rec->iface.transport_name, t->name,
ISCSI_TRANSPORT_NAME_MAXLEN);
rec->tpgt = tpgt;
@@ -190,14 +190,14 @@ static int sync_session(void *data, char *targetname, int tpgt, char *address,
int fd = -1;
iscsiadm_req_t req;
iscsiadm_rsp_t rsp;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
log_debug(7, "sync session [%d][%s,%s.%d][%s]\n", sid, targetname,
address, port, iface);
/* don't do anything for qlogic right now */
- p = get_transport_by_sid(sid);
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
return 0;
if (!idbm_node_read(db, &rec, targetname, address, port, iface)) {
@@ -207,7 +207,7 @@ static int sync_session(void *data, char *targetname, int tpgt, char *address,
} else {
log_warning("Could not read data from db. Using default and "
"currently negotiated values\n");
- setup_rec_from_negotiated_values(db, &rec, p, targetname, tpgt,
+ setup_rec_from_negotiated_values(db, &rec, t, targetname, tpgt,
address, port, sid, iface);
}
@@ -381,8 +381,6 @@ int main(int argc, char *argv[])
log_debug(1, "InitiatorName=%s", daemon_config.initiator_name);
log_debug(1, "InitiatorAlias=%s", daemon_config.initiator_alias);
- init_providers();
-
/* oom-killer will not kill us at the night... */
if (oom_adjust())
log_debug(1, "can not adjust oom-killer's pardon");
diff --git a/usr/iscsistart.c b/usr/iscsistart.c
index 27dd2bc..3b45255 100644
--- a/usr/iscsistart.c
+++ b/usr/iscsistart.c
@@ -263,8 +263,6 @@ int main(int argc, char *argv[])
if (check_params(initiatorname))
exit(1);
- init_providers();
-
pid = fork();
if (pid < 0) {
log_error("iscsiboot fork failed");
diff --git a/usr/login.c b/usr/login.c
index d5bc11d..e7bbc6e 100644
--- a/usr/login.c
+++ b/usr/login.c
@@ -380,7 +380,7 @@ get_op_params_text_keys(iscsi_session_t *session, int cid,
} else if (iscsi_find_key_value("MaxRecvDataSegmentLength", text, end,
&value, &value_end)) {
if (session->type == ISCSI_SESSION_TYPE_DISCOVERY ||
- !session->provider->utransport->rdma)
+ !session->t->template->rdma)
conn->max_xmit_dlength = strtoul(value, NULL, 0);
text = value_end;
} else if (iscsi_find_key_value("FirstBurstLength", text, end, &value,
@@ -538,7 +538,7 @@ get_op_params_text_keys(iscsi_session_t *session, int cid,
text = value_end;
} else if (iscsi_find_key_value("RDMAExtensions", text, end,
&value, &value_end)) {
- if (session->provider->utransport->rdma &&
+ if (session->t->template->rdma &&
strcmp(value, "Yes") != 0) {
log_error("Login negotiation failed, "
"Target must support RDMAExtensions");
@@ -547,14 +547,14 @@ get_op_params_text_keys(iscsi_session_t *session, int cid,
text = value_end;
} else if (iscsi_find_key_value("InitiatorRecvDataSegmentLength", text,
end, &value, &value_end)) {
- if (session->provider->utransport->rdma) {
+ if (session->t->template->rdma) {
conn->max_recv_dlength = MIN(conn->max_recv_dlength,
strtoul(value, NULL, 0));
}
text = value_end;
} else if (iscsi_find_key_value("TargetRecvDataSegmentLength", text,
end, &value, &value_end)) {
- if (session->provider->utransport->rdma) {
+ if (session->t->template->rdma) {
conn->max_xmit_dlength = MIN(conn->max_xmit_dlength,
strtoul(value, NULL, 0));
}
@@ -806,7 +806,7 @@ add_params_normal_session(iscsi_session_t *session, struct iscsi_hdr *pdu,
}
static int
-add_params_provider_specific(iscsi_session_t *session, int cid,
+add_params_transport_specific(iscsi_session_t *session, int cid,
struct iscsi_hdr *pdu, char *data,
int max_data_length)
{
@@ -814,7 +814,7 @@ add_params_provider_specific(iscsi_session_t *session, int cid,
iscsi_conn_t *conn = &session->conn[cid];
if (session->type == ISCSI_SESSION_TYPE_DISCOVERY ||
- !session->provider->utransport->rdma) {
+ !session->t->template->rdma) {
sprintf(value, "%d", conn->max_recv_dlength);
if (!iscsi_add_text(pdu, data, max_data_length,
"MaxRecvDataSegmentLength", value))
@@ -958,7 +958,7 @@ fill_op_params_text(iscsi_session_t *session, int cid, struct iscsi_hdr *pdu,
*transit = 1;
rdma = (session->type == ISCSI_SESSION_TYPE_NORMAL) &&
- session->provider->utransport->rdma;
+ session->t->template->rdma;
/*
* If we haven't gotten a partial response, then either we shouldn't be
@@ -1001,7 +1001,7 @@ fill_op_params_text(iscsi_session_t *session, int cid, struct iscsi_hdr *pdu,
max_data_length))
return 0;
- if (!add_params_provider_specific(session, cid,
+ if (!add_params_transport_specific(session, cid,
pdu, data,
max_data_length))
return 0;
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
index d171339..a478de7 100644
--- a/usr/mgmt_ipc.c
+++ b/usr/mgmt_ipc.c
@@ -101,21 +101,15 @@ static mgmt_ipc_err_e
mgmt_ipc_session_getstats(queue_task_t *qtask, int sid,
iscsiadm_rsp_t *rsp)
{
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
iscsi_session_t *session;
- struct qelem *sitem, *pitem;
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- sitem = p->sessions.q_forw;
- while (sitem != &p->sessions) {
- session = (iscsi_session_t *)sitem;
+ list_for_each_entry(t, &transports, list) {
+ list_for_each_entry(session, &t->sessions, list) {
if (session->id == sid) {
int rc;
- rc = ipc->get_stats(session->transport_handle,
+ rc = ipc->get_stats(session->t->handle,
session->id, session->conn[0].id,
(void*)&rsp->u.getstats,
MGMT_IPC_GETSTATS_BUF_MAX);
@@ -126,9 +120,7 @@ mgmt_ipc_session_getstats(queue_task_t *qtask, int sid,
}
return MGMT_IPC_OK;
}
- sitem = sitem->q_forw;
}
- pitem = pitem->q_forw;
}
return MGMT_IPC_ERR_NOT_FOUND;
diff --git a/usr/netlink.c b/usr/netlink.c
index 2e82b0d..cb68778 100644
--- a/usr/netlink.c
+++ b/usr/netlink.c
@@ -683,7 +683,7 @@ ktransport_ep_connect(iscsi_conn_t *conn, int non_blocking)
memset(setparam_buf, 0, NLM_SETPARAM_DEFAULT_MAX);
ev = (struct iscsi_uevent *)setparam_buf;
ev->type = ISCSI_UEVENT_TRANSPORT_EP_CONNECT;
- ev->transport_handle = conn->session->transport_handle;
+ ev->transport_handle = conn->session->t->handle;
if (dst_addr->sa_family == PF_INET)
addrlen = sizeof(struct sockaddr_in);
@@ -721,7 +721,7 @@ ktransport_ep_poll(iscsi_conn_t *conn, int timeout_ms)
memset(&ev, 0, sizeof(struct iscsi_uevent));
ev.type = ISCSI_UEVENT_TRANSPORT_EP_POLL;
- ev.transport_handle = conn->session->transport_handle;
+ ev.transport_handle = conn->session->t->handle;
ev.u.ep_poll.ep_handle = conn->transport_ep_handle;
ev.u.ep_poll.timeout_ms = timeout_ms;
@@ -745,7 +745,7 @@ ktransport_ep_disconnect(iscsi_conn_t *conn)
memset(&ev, 0, sizeof(struct iscsi_uevent));
ev.type = ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT;
- ev.transport_handle = conn->session->transport_handle;
+ ev.transport_handle = conn->session->t->handle;
ev.u.ep_disconnect.ep_handle = conn->transport_ep_handle;
if ((rc = __kipc_call(&ev, sizeof(ev))) < 0) {
@@ -807,8 +807,7 @@ ctldev_handle(void)
{
int rc;
struct iscsi_uevent *ev;
- struct qelem *item, *pitem;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
iscsi_session_t *session = NULL;
iscsi_conn_t *conn = NULL;
uintptr_t recv_handle;
@@ -827,14 +826,10 @@ ctldev_handle(void)
ev = (struct iscsi_uevent *)NLMSG_DATA(nlm_ev);
/* verify connection */
- pitem = providers.q_forw;
- while (pitem != &providers) {
- p = (iscsi_provider_t *)pitem;
-
- item = p->sessions.q_forw;
- while (item != &p->sessions) {
+ list_for_each_entry(t, &transports, list) {
+ list_for_each_entry(session, &t->sessions, list) {
int i;
- session = (iscsi_session_t *)item;
+
for (i=0; i<ISCSI_CONN_MAX; i++) {
if (ev->type == ISCSI_KEVENT_RECV_PDU &&
session->id == ev->r.recv_req.sid &&
@@ -849,9 +844,7 @@ ctldev_handle(void)
goto verify_conn;
}
}
- item = item->q_forw;
}
- pitem = pitem->q_forw;
}
verify_conn:
diff --git a/usr/transport.c b/usr/transport.c
index da48508..8af98ca 100644
--- a/usr/transport.c
+++ b/usr/transport.c
@@ -26,7 +26,7 @@
#include "util.h"
#include "iscsi_sysfs.h"
-struct iscsi_uspace_transport iscsi_tcp = {
+struct iscsi_transport_template iscsi_tcp = {
.name = "tcp",
.rdma = 0,
.ep_connect = iscsi_io_tcp_connect,
@@ -34,7 +34,7 @@ struct iscsi_uspace_transport iscsi_tcp = {
.ep_disconnect = iscsi_io_tcp_disconnect,
};
-struct iscsi_uspace_transport iscsi_iser = {
+struct iscsi_transport_template iscsi_iser = {
.name = "iser",
.rdma = 1,
.ep_connect = ktransport_ep_connect,
@@ -42,27 +42,27 @@ struct iscsi_uspace_transport iscsi_iser = {
.ep_disconnect = ktransport_ep_disconnect,
};
-struct iscsi_uspace_transport *iscsi_utransports[] = {
+static struct iscsi_transport_template *iscsi_transport_templates[] = {
&iscsi_tcp,
&iscsi_iser,
NULL
};
-int set_uspace_transport(iscsi_provider_t *p)
+int set_transport_template(struct iscsi_transport *t)
{
- struct iscsi_uspace_transport *utransport;
+ struct iscsi_transport_template *tmpl;
int j;
- for (j = 0; iscsi_utransports[j] != NULL; j++) {
- utransport = iscsi_utransports[j];
+ for (j = 0; iscsi_transport_templates[j] != NULL; j++) {
+ tmpl = iscsi_transport_templates[j];
- if (!strcmp(utransport->name, p->name)) {
- p->utransport = utransport;
- log_debug(3, "Matched transport %s\n", p->name);
+ if (!strcmp(tmpl->name, t->name)) {
+ t->template = tmpl;
+ log_debug(3, "Matched transport %s\n", t->name);
return 0;
}
}
- log_error("Could not fund uspace transport for %s\n", p->name);
+ log_error("Could not fund uspace transport for %s\n", t->name);
return -ENOSYS;
}
diff --git a/usr/transport.h b/usr/transport.h
index 8bc4043..b0292d1 100644
--- a/usr/transport.h
+++ b/usr/transport.h
@@ -19,10 +19,10 @@
#include "types.h"
-struct iscsi_provider_t;
+struct iscsi_transport;
struct iscsi_conn;
-struct iscsi_uspace_transport {
+struct iscsi_transport_template {
const char *name;
uint8_t rdma;
int (*ep_connect) (iscsi_conn_t *conn, int non_blocking);
@@ -30,6 +30,6 @@ struct iscsi_uspace_transport {
void (*ep_disconnect) (iscsi_conn_t *conn);
};
-extern int set_uspace_transport(struct iscsi_provider_t *p);
+extern int set_transport_template(struct iscsi_transport *t);
#endif
diff --git a/usr/util.c b/usr/util.c
index 5596c21..098b475 100644
--- a/usr/util.c
+++ b/usr/util.c
@@ -243,17 +243,17 @@ int iscsi_match_session(void *data, char *targetname, int tpgt,
char *address, int port, int sid, char *iface)
{
node_rec_t *rec = data;
- iscsi_provider_t *p;
+ struct iscsi_transport *t;
log_debug(6, "looking for session [%d][%s,%s,%d][%s]", sid,
rec->name, rec->conn[0].address, rec->conn[0].port,
iface);
- p = get_transport_by_sid(sid);
- if (!p)
+ t = get_transport_by_sid(sid);
+ if (!t)
return 0;
- if (!strcmp(rec->iface.transport_name, p->name) &&
+ if (!strcmp(rec->iface.transport_name, t->name) &&
!strcmp(rec->name, targetname) &&
!strcmp(rec->conn[0].address, address) &&
!strcmp(rec->iface.name, iface) &&