diff options
author | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:41:44 +0000 |
---|---|---|
committer | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:41:44 +0000 |
commit | d1d7e581e15f8b1cdfd9254f7230fede9e4da516 (patch) | |
tree | 32cf2d45c78413702bd69c54a6505dac6c340803 | |
parent | 89cd930dc9315e7a657187fefc924d7ed021aa93 (diff) | |
download | open-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.c | 10 | ||||
-rw-r--r-- | usr/initiator.c | 158 | ||||
-rw-r--r-- | usr/initiator.h | 25 | ||||
-rw-r--r-- | usr/io.c | 4 | ||||
-rw-r--r-- | usr/iscsi_sysfs.c | 74 | ||||
-rw-r--r-- | usr/iscsi_sysfs.h | 13 | ||||
-rw-r--r-- | usr/iscsiadm.c | 44 | ||||
-rw-r--r-- | usr/iscsid.c | 14 | ||||
-rw-r--r-- | usr/iscsistart.c | 2 | ||||
-rw-r--r-- | usr/login.c | 16 | ||||
-rw-r--r-- | usr/mgmt_ipc.c | 16 | ||||
-rw-r--r-- | usr/netlink.c | 21 | ||||
-rw-r--r-- | usr/transport.c | 22 | ||||
-rw-r--r-- | usr/transport.h | 6 | ||||
-rw-r--r-- | usr/util.c | 8 |
15 files changed, 181 insertions, 252 deletions
@@ -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; @@ -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 @@ -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) && |