diff options
author | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:29:33 +0000 |
---|---|---|
committer | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2007-04-24 05:29:33 +0000 |
commit | 69455efa4b6d6fbebb3869b69c43e33b6dacbe9e (patch) | |
tree | a1a107f5cb66a98f68416cf113eaaa922e0753d1 | |
parent | 8f841fc627cae91f653a31c3c1d6eac11e1518a0 (diff) | |
download | open-iscsi-69455efa4b6d6fbebb3869b69c43e33b6dacbe9e.tar.gz |
merge node and session mode ops. session node takes a sysfs id or nothing and node mode takes the node record id values or nothing
git-svn-id: svn://svn.berlios.de/open-iscsi@805 d7303112-9cec-0310-bdd2-e83a94d6c2b6
-rw-r--r-- | README | 8 | ||||
-rw-r--r-- | doc/iscsiadm.8 | 13 | ||||
-rw-r--r-- | usr/iscsiadm.c | 134 |
3 files changed, 83 insertions, 72 deletions
@@ -184,7 +184,7 @@ Usage: iscsiadm [OPTION] -m node display all discovered nodes from internal persistent discovery database -m node --targetname=[name] --portal=[ip:port] --interface=[HWaddress] \ - [--login|--logout] + [--login|--logout|--rescan|--stats] -m node --targetname=[name] --portal=[ip:port] --interface=[HWaddress] \ --op=[op] [--name=[name] --value=[value]] -m node --targetname=[name] --portal=[ip:port] --interface=[HWaddress] \ @@ -205,6 +205,11 @@ Usage: iscsiadm [OPTION] you wish to update Print level can be 0 to 1. + + Rescan will perform a SCSI layer scan of the session + to find new LUNs. + + Stats prints the iSCSI stats for the session. -m node --logoutall=[all,manual,automatic] Logout "all" the running sessions or just the ones with a node or conn startup value manual or automatic. @@ -219,7 +224,6 @@ Usage: iscsiadm [OPTION] perform operation for specific session with session id sid. If no sid is given the operation will be performed on all running sessions if possible. - --logout, --rescan, --op only work on single session. --logout and --op work like they do in node mode, but in session mode targetname and portal info is is not passed in. diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 index 2a6893c..d2173ee 100644 --- a/doc/iscsiadm.8 +++ b/doc/iscsiadm.8 @@ -5,7 +5,7 @@ iscsiadm \- open-iscsi administration utility \fBiscsiadm\fR -m discovery [ -dhV ] [ -t type -p ip:port [ -l ] ] | [ -o operation ] [ -n name ] [ -v value ] -\fBiscsiadm\fR -m node [ -dhV ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I HWaddress ] [ -l | -u ] ] +\fBiscsiadm\fR -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] ] [ [ -o operation ] [ -n name ] [ -v value ] [ -p ip:port ] ] \fBiscsiadm\fR -m session [ -dhV ] [ -P printlevel ] [ -r sessionid | sysfsdir [ -R ] [ -u | -s ] ] @@ -122,16 +122,15 @@ Instead of sid, a sysfs path containing the session can be used. For example usi .TP \fB\-R\fR, \fB\-\-rescan\fR -If sid is also passed in rescan the session. If no sid has been passed in -rescan all running sessions. -.IP -\fIrescan\fR is only valid for session mode. +In session mode, if sid is also passed in rescan the session. If no sid has +been passed in rescan all running sessions. + +In node mode, rescan a session running through the target, portal, iface +tuple passed in. .TP \fB\-s\fR, \fB\-\-stats\fR Display session statistics. -.IP -This option is only valid for session mode. .TP \fB\-S\fR, \fB\-\-show\fR diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c index 5de181f..d37a37b 100644 --- a/usr/iscsiadm.c +++ b/usr/iscsiadm.c @@ -102,7 +102,7 @@ static void usage(int status) printf("\ iscsiadm -m discovery [ -dhV ] [ -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 ] ] \ +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] ] \ [ [ -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,13 +322,10 @@ logout_by_startup(idbm_t *db, char *mode) return sysfs_for_each_session(&mgmt, &num_found, __logout_by_startup); } -static int -logout_portal(void *data, char *targetname, int tpgt, char *address, - int port, int sid, char *iface) +static int match_valid_session(node_rec_t *rec, char *targetname, int tpgt, + char *address, int port, int sid, char *iface) { - node_rec_t tmprec, *rec = data; iscsi_provider_t *p; - int rc; p = get_transport_by_sid(sid); if (!p) @@ -344,7 +341,26 @@ logout_portal(void *data, char *targetname, int tpgt, char *address, if (strlen(rec->iface.name) && strcmp(rec->iface.name, iface)) return 0; - if (rec->conn[0].port!= -1 && port != rec->conn[0].port) + if (rec->conn[0].port != -1 && port != rec->conn[0].port) + return 0; + + return 1; +} + +static int +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; + int rc; + + p = get_transport_by_sid(sid); + if (!p) + return 0; + + if (!match_valid_session(rec, targetname, tpgt, address, port, sid, + iface)) return 0; printf("Logout session [%s [%d] [%s]:%d %s]\n", iface, sid, address, @@ -908,11 +924,18 @@ static int print_sessions(int info_level) return 0; } -static int rescan_session(void *data, char *targetname, int tpgt, char *address, - int port, int sid, char *iface) +static int rescan_portal(void *data, char *targetname, int tpgt, char *address, + int port, int sid, char *iface) { int host_no, err; + if (!match_valid_session(data, targetname, tpgt, address, port, sid, + iface)) + return 0; + + printf("Rescanning session [%s [%d] [%s]:%d %s]\n", iface, sid, address, + port, targetname); + host_no = get_host_no_from_sid(sid, &err); if (err) { log_error("Could not rescan session sid %d.", sid); @@ -923,33 +946,28 @@ static int rescan_session(void *data, char *targetname, int tpgt, char *address, return 0; } -static int rescan_sessions(void) -{ - int num_found = 0; - - sysfs_for_each_session(NULL, &num_found, rescan_session); - if (num_found <= 0) - return -ENODEV; - else - return 0; -} - static int -session_stats(int sid) +session_stats(void *data, char *targetname, int tpgt, char *address, + int port, int sid, char *iface) { int rc, i; iscsiadm_req_t req; iscsiadm_rsp_t rsp; + if (!match_valid_session(data, targetname, tpgt, address, port, sid, + iface)) + return 0; + memset(&req, 0, sizeof(req)); req.command = MGMT_IPC_SESSION_STATS; req.u.session.sid = sid; rc = do_iscsid(&ipc_fd, &req, &rsp); if (rc) - return rc; + return EIO; - printf("[%02d]\n", sid); + printf("Stats for session [%s [%d] [%s]:%d %s]\n", iface, sid, address, + port, targetname); printf( "iSCSI SNMP:\n" "\ttxdata_octets: %lld\n" @@ -1073,10 +1091,11 @@ static void catch_sigint( int signo ) { exit(1); } +/* TODO cleanup arguments */ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout, - int do_show, int info_level, char *targetname, - char *ip, int port, char *iface, char *name, - char *value) + int do_show, int do_rescan, int do_stats, + int info_level, char *targetname, char *ip, int port, + char *iface, char *name, char *value) { int rc = 0; node_rec_t rec; @@ -1110,6 +1129,20 @@ static int exec_node_op(idbm_t *db, int op, int do_login, int do_logout, goto out; } + if (do_rescan) { + if (for_each_portal(db, targetname, ip, port, iface, + rescan_portal)) + rc = -1; + goto out; + } + + if (do_stats) { + if (for_each_portal(db, targetname, ip, port, iface, + session_stats)) + rc = -1; + goto out; + } + if (do_login && do_logout) { log_error("either login or logout at the time allowed!"); rc = -1; @@ -1453,7 +1486,7 @@ main(int argc, char **argv) } } } else if (mode == MODE_NODE) { - if ((rc = verify_mode_params(argc, argv, "PdmlSonvupTIUL", + if ((rc = verify_mode_params(argc, argv, "RsPdmlSonvupTIUL", 0))) { log_error("node mode: option '-%c' is not " "allowed/supported", rc); @@ -1472,8 +1505,8 @@ main(int argc, char **argv) } rc = exec_node_op(db, op, do_login, do_logout, do_show, - info_level, targetname, ip, port, iface, - name, value); + do_rescan, do_stats, info_level, targetname, + ip, port, iface, name, value); goto out; } else if (mode == MODE_SESSION) { if ((rc = verify_mode_params(argc, argv, "PiRdrmusonuSv", 1))) { @@ -1486,23 +1519,6 @@ main(int argc, char **argv) char session[64]; int tmp_sid, tpgt; - if (do_rescan) { - rc = rescan_session(NULL, NULL, 0, NULL, 0, - sid, NULL); - goto out; - } - - if (do_stats) { - if ((rc = session_stats(sid)) > 0) { - iscsid_handle_error(rc); - log_error("can not get statistics for " - "session with SID %d (%d)", - sid, rc); - rc = -1; - } - goto out; - } - snprintf(session, 63, "session%d", sid); session[63] = '\0'; @@ -1536,9 +1552,10 @@ main(int argc, char **argv) } /* drop down to node ops */ - rc = exec_node_op(db, op, do_login, do_logout, - do_show, info_level, targetname, ip, - port, iface, name, value); + rc = exec_node_op(db, op, do_login, do_logout, do_show, + do_rescan, do_stats, info_level, + targetname, ip, port, iface, name, + value); free_iface: free(iface); free_address: @@ -1547,20 +1564,11 @@ free_target: free(targetname); goto out; } else { - if (do_logout) { - log_error("--logout requires target id"); - rc = -1; - goto out; - } - - if (do_stats) { - log_error("--stats requires target id"); - rc = -1; - goto out; - } - - if (do_rescan) { - rc = rescan_sessions(); + if (do_logout || do_rescan || do_stats) { + rc = exec_node_op(db, op, do_login, do_logout, + do_show, do_rescan, do_stats, + info_level, NULL, + NULL, -1, NULL, name, value); goto out; } |