diff options
author | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:40:13 +0000 |
---|---|---|
committer | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:40:13 +0000 |
commit | 89cd930dc9315e7a657187fefc924d7ed021aa93 (patch) | |
tree | e49a91051de9d1fbe52b4b82b7a497ba9b4c8593 | |
parent | e3f8f0c590e0e1746366139a03466e813ddbc373 (diff) | |
download | open-iscsi-89cd930dc9315e7a657187fefc924d7ed021aa93.tar.gz |
With qla4xxx and braodcom we will want to be able to match the the drivers as well as the other params, so add a -D param
git-svn-id: svn://svn.berlios.de/open-iscsi@814 d7303112-9cec-0310-bdd2-e83a94d6c2b6
-rw-r--r-- | etc/iscsid.conf | 21 | ||||
-rw-r--r-- | usr/config.h | 4 | ||||
-rw-r--r-- | usr/idbm.c | 22 | ||||
-rw-r--r-- | usr/initiator.c | 4 | ||||
-rw-r--r-- | usr/iscsi_sysfs.c | 6 | ||||
-rw-r--r-- | usr/iscsi_sysfs.h | 8 | ||||
-rw-r--r-- | usr/iscsiadm.c | 139 | ||||
-rw-r--r-- | usr/iscsid.c | 3 | ||||
-rw-r--r-- | usr/util.c | 4 |
9 files changed, 138 insertions, 73 deletions
diff --git a/etc/iscsid.conf b/etc/iscsid.conf index 81f464b..bd4f637 100644 --- a/etc/iscsid.conf +++ b/etc/iscsid.conf @@ -14,24 +14,37 @@ #isns.address = 192.168.0.1 #isns.port = 3205 -################## -# NIC/HBA settings -################## +############################# +# NIC/HBA and driver settings +############################# # open-iscsi can create a session and bind it to a NIC/HBA. It # is currently limited to 32 NICs/HBAs, but this can be easily # changed so if you need a larger value send a mail. # # To define the defaults NICs/HBAs you want to create sessions # through, set the iface.name value to the MAC address of the NIC. +# +# open-iscsi can create sessions over serveral interconnects like iser +# and tcp. To specific which interconnect to use you can set the +# iface's transport_name value to "tcp" or "iser" +# # iface[0].name = 00:0F:1F:92:6B:BF +# iface[0].transport_name = tcp +# # iface[1].name = 00:0F:1F:92:6C:BF +# iface[1].transport_name = tcp +# # iface[2].name = 00:0F:1F:92:6C:CC +# iface[2].transport_name = tcp # the largest index that can be used is 31. # # For iscsi_tcp and ib_iser, The default behavior is create a single # session and let the network and infinninband layers decide which # NIC/RNIC to route through. -iface[0].name = default +# iface[0].name = default +# +# The default driver to use is iscsi_tcp +# iface[0].transport_name = tcp #***************** # Startup settings diff --git a/usr/config.h b/usr/config.h index b0dbae6..87900f6 100644 --- a/usr/config.h +++ b/usr/config.h @@ -193,18 +193,16 @@ typedef struct session_rec { #define ISCSI_TRANSPORT_NAME_MAXLEN 16 typedef struct iface_rec { - /* TODO move transport name from node to here */ - /* * TODO: we may have to make this bigger and interconnect * specific for iser and and possibly qla4xxx hba serials */ char name[ISCSI_MAX_IFACE_LEN]; + char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; } iface_rec_t; typedef struct node_rec { char name[TARGET_NAME_MAXLEN]; - char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; int tpgt; iscsi_startup_e startup; session_rec_t session; @@ -208,12 +208,16 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) int num = 0, i; __recinfo_str("node.name", ri, r, name, IDBM_SHOW, num); - __recinfo_str("node.transport_name", ri, r, transport_name, - IDBM_SHOW, num); __recinfo_int("node.tpgt", ri, r, tpgt, IDBM_SHOW, num); __recinfo_int_o3("node.startup", ri, r, startup, IDBM_SHOW, "manual", "automatic", "onboot", num); __recinfo_str("iface.name", ri, r, iface.name, IDBM_SHOW, num); + /* + * svn 780 compat: older versions used node.transport_name and + * rec->transport_name + */ + __recinfo_str("iface.transport_name", ri, r, iface.transport_name, + IDBM_SHOW, num); __recinfo_str("node.discovery_address", ri, r, disc_address, IDBM_SHOW, num); __recinfo_int("node.discovery_port", ri, r, disc_port, IDBM_SHOW, num); @@ -341,6 +345,8 @@ idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) for (i = 0; i < ISCSI_IFACE_MAX; i++) { sprintf(key, "iface[%d].name", i); __recinfo_str(key, ri, (&r[i]), name, IDBM_SHOW, num); + sprintf(key, "iface[%d].transport_name", i); + __recinfo_str(key, ri, (&r[i]), transport_name, IDBM_SHOW, num); } } @@ -694,7 +700,7 @@ int idbm_print_node_tree(idbm_t *db, void *data, node_rec_t *rec) rec->conn[0].port, rec->tpgt); } - printf("\t\tDriver: %s\n", rec->transport_name); + printf("\t\tDriver: %s\n", rec->iface.transport_name); printf("\t\tHWaddress: %s\n", rec->iface.name); memcpy(last_rec, rec, sizeof(node_rec_t)); @@ -1380,7 +1386,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec) ST_CONFIG_DIR, rec->disc_address, rec->disc_port, rec->name, rec->tpgt, rec->conn[0].address, rec->conn[0].port, - rec->iface.name, rec->transport_name); + rec->iface.name, rec->iface.transport_name); break; case DISCOVERY_TYPE_STATIC: if (access(STATIC_CONFIG_DIR, F_OK) != 0) { @@ -1394,7 +1400,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec) snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%s,%s", STATIC_CONFIG_DIR, rec->name, rec->conn[0].address, rec->conn[0].port, - rec->iface.name, rec->transport_name); + rec->iface.name, rec->iface.transport_name); break; case DISCOVERY_TYPE_ISNS: if (access(ISNS_CONFIG_DIR, F_OK) != 0) { @@ -1409,7 +1415,7 @@ static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec) ISNS_CONFIG_DIR, rec->disc_address, rec->disc_port, rec->name, rec->tpgt, rec->conn[0].address, rec->conn[0].port, rec->iface.name, - rec->transport_name); + rec->iface.transport_name); break; case DISCOVERY_TYPE_SLP: default: @@ -1487,6 +1493,8 @@ int idbm_add_nodes(idbm_t *db, node_rec_t *newrec, discovery_rec_t *drec) continue; strcpy(newrec->iface.name, db->irec_iface[i].name); + strcpy(newrec->iface.transport_name, + db->irec_iface[i].transport_name); rc = idbm_add_node(db, newrec, drec); if (rc) return rc; @@ -1539,7 +1547,7 @@ static void idbm_rm_disc_node_links(idbm_t *db, char *disc_dir) rec->conn[0].port = atoi(port); strncpy(rec->conn[0].address, address, NI_MAXHOST); strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN); - strncpy(rec->transport_name, driver, + strncpy(rec->iface.transport_name, driver, ISCSI_TRANSPORT_NAME_MAXLEN); if (idbm_delete_node(db, NULL, rec)) diff --git a/usr/initiator.c b/usr/initiator.c index 4b203de..57bacaf 100644 --- a/usr/initiator.c +++ b/usr/initiator.c @@ -1819,7 +1819,7 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) iscsi_conn_t *conn; iscsi_provider_t *provider; - provider = get_transport_by_name(rec->transport_name); + provider = get_transport_by_name(rec->iface.transport_name); if (!provider) return MGMT_IPC_ERR_TRANS_NOT_FOUND; if (set_uspace_transport(provider)) @@ -1935,7 +1935,7 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid) iscsi_provider_t *provider; int err; - provider = get_transport_by_name(rec->transport_name); + provider = get_transport_by_name(rec->iface.transport_name); if (!provider) return MGMT_IPC_ERR_TRANS_NOT_FOUND; if (set_uspace_transport(provider)) diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c index a6da62e..9285293 100644 --- a/usr/iscsi_sysfs.c +++ b/usr/iscsi_sysfs.c @@ -35,6 +35,7 @@ #include "initiator.h" #include "transport.h" #include "version.h" +#include "iscsi_sysfs.h" #define ISCSI_TRANSPORT_DIR "/sys/class/iscsi_transport" #define ISCSI_SESSION_DIR "/sys/class/iscsi_session" @@ -420,8 +421,7 @@ int get_sessioninfo_by_sysfs_id(int *sid, char *targetname, char *addr, return 0; } -int sysfs_for_each_session(void *data, int *nr_found, - int (* fn)(void *, char *, int, char *, int, int, char *)) +int sysfs_for_each_session(void *data, int *nr_found, sysfs_op_fn *fn) { struct dirent **namelist; int rc = 0, sid, port, tpgt, n, i; @@ -740,7 +740,7 @@ pid_t __scan_host(int hostno, int async) /* * Scan a session from usersapce using sysfs */ -pid_t scan_host(iscsi_session_t *session, int async) +pid_t scan_host(iscsi_session_t *session) { return __scan_host(session->hostno, 1); } diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h index ce28a3d..38e463e 100644 --- a/usr/iscsi_sysfs.h +++ b/usr/iscsi_sysfs.h @@ -34,8 +34,10 @@ extern int get_sessioninfo_by_sysfs_id(int *sid, char *targetname, char *addr, int *port, int *tpgt, char *iface, char *sys_session); extern int read_sysfs_file(char *filename, void *value, char *format); -extern int sysfs_for_each_session(void *data, int *nr_found, - int (* fn)(void *, char *, int, char *, int, int, char *)); + +typedef int (sysfs_op_fn)(void *, char *, int, char *, int, int, char *); + +extern int sysfs_for_each_session(void *data, int *nr_found, sysfs_op_fn *fn); extern uint32_t get_host_no_from_sid(uint32_t sid, int *err); extern int get_netdev_from_mac(char *mac, char *dev); extern char *get_blockdev_from_lun(int hostno, int target, int sid); @@ -51,7 +53,7 @@ extern void get_negotiated_session_conf(int sid, struct iscsi_session_operational_config *conf); extern void get_negotiated_conn_conf(int sid, struct iscsi_conn_operational_config *conf); -extern pid_t scan_host(struct iscsi_session *session); +extern pid_t scan_host(iscsi_session_t *session); extern pid_t __scan_host(int hostno, int async); extern int get_host_state(char *state, int host_no); extern int get_device_state(char *state, int host_no, int target, int lun); diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c index ee38e04..8ad1532 100644 --- a/usr/iscsiadm.c +++ b/usr/iscsiadm.c @@ -72,6 +72,7 @@ static struct option const long_options[] = {"portal", required_argument, NULL, 'p'}, {"targetname", required_argument, NULL, 'T'}, {"interface", required_argument, NULL, 'I'}, + {"driver", required_argument, NULL, 'D'}, {"op", required_argument, NULL, 'o'}, {"type", required_argument, NULL, 't'}, {"name", required_argument, NULL, 'n'}, @@ -90,7 +91,7 @@ static struct option const long_options[] = {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}, }; -static char *short_options = "RlVhm:p:P:T:I:U:L:d:r:n:v:o:sSt:u"; +static char *short_options = "RlVhm:p:P:T:I:D:U:L:d:r:n:v:o:sSt:u"; static void usage(int status) { @@ -101,7 +102,7 @@ static void usage(int status) printf("\ iscsiadm -m discovery [ -dhV ] [--print=[N]] [ -t type -p ip:port [ -l ] ] | [ -p ip:port ] \ [ -o operation ] [ -n name ] [ -v value ]\n\ -iscsiadm -m node [ -dhV ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I HWaddress ] [ -l | -u | -R | -s] ] \ +iscsiadm -m node [ -dhV ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I HWaddress -D driver ] [ -l | -u | -R | -s] ] \ [ [ -o operation ] [ -n name ] [ -v value ] [ -p ip:port ] ]\n\ iscsiadm -m session [ -dhV ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n"); } @@ -322,7 +323,8 @@ logout_by_startup(idbm_t *db, char *mode) } static int match_valid_session(node_rec_t *rec, char *targetname, - char *address, int port, char *iface) + char *address, int port, char *iface, + char *driver) { if (strlen(rec->name) && strcmp(rec->name, targetname)) return 0; @@ -331,6 +333,10 @@ static int match_valid_session(node_rec_t *rec, char *targetname, strcmp(rec->conn[0].address, address)) return 0; + if (strlen(rec->iface.transport_name) && + strcmp(rec->iface.transport_name, driver)) + return 0; + if (strlen(rec->iface.name) && strcmp(rec->iface.name, iface)) return 0; @@ -352,7 +358,8 @@ logout_portal(void *data, char *targetname, int tpgt, char *address, if (!p) return 0; - if (!match_valid_session(rec, targetname, address, port, iface)) + if (!match_valid_session(rec, targetname, address, port, iface, + p->name)) return 0; printf("Logout session [%s [%d] [%s]:%d %s]\n", iface, sid, address, @@ -364,7 +371,8 @@ 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.transport_name, p->name, ISCSI_TRANSPORT_NAME_MAXLEN); + strncpy(tmprec.iface.transport_name, p->name, + ISCSI_TRANSPORT_NAME_MAXLEN); rc = session_logout(&tmprec); /* we raced with another app or instance of iscsiadm */ @@ -382,7 +390,7 @@ logout_portal(void *data, char *targetname, int tpgt, char *address, } static void setup_node_record(node_rec_t *rec, char *targetname, char *ip, - int port, char *iface) + int port, char *iface, char *driver) { memset(rec, 0, sizeof(*rec)); idbm_node_setup_defaults(rec); @@ -395,16 +403,22 @@ static void setup_node_record(node_rec_t *rec, char *targetname, char *ip, strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN); else memset(rec->iface.name, 0, ISCSI_MAX_IFACE_LEN); + if (driver) + strncpy(rec->iface.transport_name, driver, + ISCSI_TRANSPORT_NAME_MAXLEN); + else + memset(rec->iface.transport_name, 0, + ISCSI_TRANSPORT_NAME_MAXLEN); } static int for_each_session(idbm_t *db, char *targetname, char *ip, int port, char *iface, - int (* fn)(void *, char *, int, char *, int, int, char *)) + char *driver, sysfs_op_fn *fn) { node_rec_t rec; int err, num_found = 0; - setup_node_record(&rec, targetname, ip, port, iface); + setup_node_record(&rec, targetname, ip, port, iface, driver); err = sysfs_for_each_session(&rec, &num_found, fn); if (!num_found) { log_error("No portal found."); @@ -428,7 +442,7 @@ static int login_portal(idbm_t *db, void *data, node_rec_t *rec) { int rc; - printf("Login session [%s:%s [%s]:%d %s]\n", rec->transport_name, + printf("Login session [%s:%s [%s]:%d %s]\n", rec->iface.transport_name, rec->iface.name, rec->conn[0].address, rec->conn[0].port, rec->name); @@ -485,13 +499,14 @@ static int iface_fn(idbm_t *db, void *data, node_rec_t *rec) if (!match_valid_session(op_data->match_rec, rec->name, rec->conn[0].address, rec->conn[0].port, - rec->iface.name)) + rec->iface.name, rec->iface.transport_name)) return 0; return op_data->fn(db, op_data->data, rec); } static int for_each_rec(idbm_t *db, char *targetname, char *ip, int port, - char *iface, void *data, idbm_iface_op_fn *fn) + char *iface, char *driver, void *data, + idbm_iface_op_fn *fn) { node_rec_t rec; struct rec_op_data op_data; @@ -501,7 +516,7 @@ static int for_each_rec(idbm_t *db, char *targetname, char *ip, int port, op_data.match_rec = &rec; op_data.fn = fn; - setup_node_record(&rec, targetname, ip, port, iface); + setup_node_record(&rec, targetname, ip, port, iface, driver); if (!idbm_for_each_rec(db, &op_data, iface_fn)) goto nodev; return 0; @@ -511,7 +526,7 @@ nodev: } static int print_nodes(idbm_t *db, int info_level, char *targetname, - char *ip, int port, char *iface) + char *ip, int port, char *iface, char *driver) { node_rec_t tmp_rec; int rc = 0; @@ -519,14 +534,14 @@ static int print_nodes(idbm_t *db, int info_level, char *targetname, switch (info_level) { case 0: case -1: - if (for_each_rec(db, targetname, ip, port, - iface, NULL, idbm_print_node_flat)) + if (for_each_rec(db, targetname, ip, port, iface, driver, NULL, + idbm_print_node_flat)) rc = -1; break; case 1: memset(&tmp_rec, 0, sizeof(node_rec_t)); - if (for_each_rec(db, targetname, ip, port, - iface, &tmp_rec, idbm_print_node_tree)) + if (for_each_rec(db, targetname, ip, port, iface, driver, + &tmp_rec, idbm_print_node_tree)) rc = -1; break; default: @@ -875,8 +890,13 @@ 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); + + if (!p) + return 0; - if (!match_valid_session(data, targetname, address, port, iface)) + if (!match_valid_session(data, targetname, address, port, iface, + p->name)) return 0; printf("Rescanning session [%s [%d] [%s]:%d %s]\n", iface, sid, address, @@ -896,11 +916,16 @@ 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); int rc, i; iscsiadm_req_t req; iscsiadm_rsp_t rsp; - if (!match_valid_session(data, targetname, address, port, iface)) + if (!p) + return 0; + + if (!match_valid_session(data, targetname, address, port, iface, + p->name)) return 0; memset(&req, 0, sizeof(req)); @@ -976,7 +1001,7 @@ session_stats(void *data, char *targetname, int tpgt, char *address, } static int add_static_rec(idbm_t *db, char *targetname, char *ip, int port, - char *iface) + char *iface, char *driver) { node_rec_t *rec; discovery_rec_t *drec; @@ -1002,13 +1027,15 @@ static int add_static_rec(idbm_t *db, char *targetname, char *ip, int port, rec->conn[0].port = port; strncpy(rec->conn[0].address, ip, NI_MAXHOST); strncpy(rec->iface.name, iface, ISCSI_MAX_IFACE_LEN); + strncpy(rec->iface.transport_name, driver, + ISCSI_TRANSPORT_NAME_MAXLEN); rc = idbm_add_node(db, rec, drec); if (rc) log_error("Could not add new record."); else printf("New iSCSI node [%s:%s [%s]:%d %s] added\n", - rec->transport_name, iface, ip, port, targetname); + rec->iface.transport_name, iface, ip, port, targetname); free(drec); free_rec: free(rec); @@ -1028,7 +1055,8 @@ static int for_each_portal_rec(idbm_t *db, void *data, char *targetname, if (rec->conn[0].port != -1 && rec->conn[0].port != port) return 0; - if (add_static_rec(db, targetname, ip, port, rec->iface.name)) + if (add_static_rec(db, targetname, ip, port, rec->iface.name, + rec->iface.transport_name)) return 0; return 1; } @@ -1047,7 +1075,8 @@ static int for_each_node_rec(idbm_t *db, void *data, char *targetname) goto search; if (add_static_rec(db, targetname, rec->conn[0].address, - rec->conn[0].port, rec->iface.name)) + rec->conn[0].port, rec->iface.name, + rec->iface.transport_name)) return 0; return 1; @@ -1056,7 +1085,7 @@ search: } static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port, - char *iface) + char *iface, char *driver) { node_rec_t *rec; int rc; @@ -1068,7 +1097,7 @@ static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port, goto done; } - setup_node_record(rec, targetname, ip, port, iface); + setup_node_record(rec, targetname, ip, port, iface, driver); rc = idbm_for_each_node(db, rec, for_each_node_rec); if (rc) goto free_rec; @@ -1077,7 +1106,9 @@ static int add_static_recs(idbm_t *db, char *targetname, char *ip, int port, if (targetname && ip) { if (!iface) iface = "default"; - rc = add_static_rec(db, targetname, ip, port, iface); + if (!driver) + driver = "tcp"; + rc = add_static_rec(db, targetname, ip, port, iface, driver); if (!rc) goto free_rec; } @@ -1152,30 +1183,31 @@ static void catch_sigint( int signo ) { static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout, int do_show, int do_rescan, int do_stats, int info_level, char *targetname, char *ip, int port, - char *iface, char *name, char *value) + char *iface, char *driver, char *name, char *value) { int rc = 0; struct db_set_param set_param; - log_debug(2, "%s: node [%s,%s,%d]", __FUNCTION__, - targetname, ip, port); + log_debug(2, "%s: %s:%s node [%s,%s,%d]", __FUNCTION__, + driver, iface, targetname, ip, port); if (op == OP_NEW) { - if (add_static_recs(db, targetname, ip, port, iface)) + if (add_static_recs(db, targetname, ip, port, iface, + driver)) rc = -1; goto out; } if (do_rescan) { if (for_each_session(db, targetname, ip, port, iface, - rescan_portal)) + driver, rescan_portal)) rc = -1; goto out; } if (do_stats) { if (for_each_session(db, targetname, ip, port, iface, - session_stats)) + driver, session_stats)) rc = -1; goto out; } @@ -1193,29 +1225,29 @@ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout, goto out; } - if (!do_login && !do_logout && op < 0 && - !targetname && !ip && !iface) { - rc = print_nodes(db, info_level, targetname, ip, port, iface); + if (!do_login && !do_logout && op < 0) { + rc = print_nodes(db, info_level, targetname, ip, port, iface, + driver); goto out; } if (do_login) { if (for_each_rec(db, targetname, ip, port, - iface, NULL, login_portal)) + iface, driver, NULL, login_portal)) rc = -1; goto out; } if (do_logout) { if (for_each_session(db, targetname, ip, port, iface, - logout_portal)) + driver, logout_portal)) rc = -1; goto out; } if (op < 0 || (!do_login && !do_logout && op == OP_SHOW)) { - if (for_each_rec(db, targetname, ip, port, - iface, &do_show, idbm_print_node_info)) + if (for_each_rec(db, targetname, ip, port, iface, driver, + &do_show, idbm_print_node_info)) rc = -1; goto out; } @@ -1231,13 +1263,13 @@ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout, set_param.name = name; set_param.value = value; - if (for_each_rec(db, targetname, ip, port, iface, + if (for_each_rec(db, targetname, ip, port, iface, driver, &set_param, idbm_node_set_param)) rc = -1; goto out; } else if (op == OP_DELETE) { - if (for_each_rec(db, targetname, ip, port, - iface, NULL, idbm_delete_node)) + if (for_each_rec(db, targetname, ip, port, iface, driver, + NULL, idbm_delete_node)) rc = -1; goto out; } else { @@ -1304,6 +1336,7 @@ main(int argc, char **argv) { char *ip = NULL, *name = NULL, *value = NULL, *iface = NULL; char *targetname = NULL, *group_session_mgmt_mode = NULL; + char *driver = NULL; int ch, longindex, mode=-1, port=-1, do_login=0, do_rescan=0; int rc=0, sid=-1, op=-1, type=-1, do_logout=0, do_stats=0, do_show=0; int do_login_all=0, do_logout_all=0, info_level=-1; @@ -1400,6 +1433,9 @@ main(int argc, char **argv) case 'I': iface = optarg; break; + case 'D': + driver = optarg; + break; case 'V': printf("%s version %s\n", program_name, ISCSI_VERSION_STR); @@ -1524,7 +1560,7 @@ main(int argc, char **argv) } } } else if (mode == MODE_NODE) { - if ((rc = verify_mode_params(argc, argv, "RsPdmlSonvupTIUL", + if ((rc = verify_mode_params(argc, argv, "RDsPdmlSonvupTIUL", 0))) { log_error("node mode: option '-%c' is not " "allowed/supported", rc); @@ -1544,10 +1580,11 @@ main(int argc, char **argv) rc = exec_node_op(db, op, do_login, do_logout, do_show, do_rescan, do_stats, info_level, targetname, - ip, port, iface, name, value); + ip, port, iface, driver, name, value); goto out; } else if (mode == MODE_SESSION) { - if ((rc = verify_mode_params(argc, argv, "PiRdrmusonuSv", 1))) { + if ((rc = verify_mode_params(argc, argv, + "PiDRdrmusonuSv", 1))) { log_error("session mode: option '-%c' is not " "allowed or supported", rc); rc = -1; @@ -1556,6 +1593,7 @@ main(int argc, char **argv) if (sid >= 0) { char session[64]; int tmp_sid, tpgt; + iscsi_provider_t *p; snprintf(session, 63, "session%d", sid); session[63] = '\0'; @@ -1589,11 +1627,15 @@ main(int argc, char **argv) goto free_iface; } + p = get_transport_by_sid(sid); + if (!p) + 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, name, - value); + targetname, ip, port, iface, + p->name, name, value); free_iface: free(iface); free_address: @@ -1606,7 +1648,8 @@ free_target: rc = exec_node_op(db, op, do_login, do_logout, do_show, do_rescan, do_stats, info_level, NULL, - NULL, -1, NULL, name, value); + NULL, -1, NULL, NULL, name, + value); goto out; } diff --git a/usr/iscsid.c b/usr/iscsid.c index bd03fa0..73246dc 100644 --- a/usr/iscsid.c +++ b/usr/iscsid.c @@ -107,7 +107,8 @@ 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->transport_name, p->name, ISCSI_TRANSPORT_NAME_MAXLEN); + strncpy(rec->iface.transport_name, p->name, + ISCSI_TRANSPORT_NAME_MAXLEN); rec->tpgt = tpgt; get_negotiated_session_conf(sid, &session_conf); @@ -161,7 +161,6 @@ void idbm_node_setup_defaults(node_rec_t *rec) memset(rec, 0, sizeof(node_rec_t)); - strcpy(rec->transport_name, "tcp"); rec->tpgt = PORTAL_GROUP_TAG_UNKNOWN; rec->disc_type = DISCOVERY_TYPE_STATIC; rec->session.initial_cmdsn = 0; @@ -212,6 +211,7 @@ void idbm_node_setup_defaults(node_rec_t *rec) * selects for us */ sprintf(rec->iface.name, "default"); + sprintf(rec->iface.transport_name, "tcp"); } void iscsid_handle_error(int err) @@ -253,7 +253,7 @@ int iscsi_match_session(void *data, char *targetname, int tpgt, if (!p) return 0; - if (!strcmp(rec->transport_name, p->name) && + if (!strcmp(rec->iface.transport_name, p->name) && !strcmp(rec->name, targetname) && !strcmp(rec->conn[0].address, address) && !strcmp(rec->iface.name, iface) && |