summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:29:33 +0000
committermnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2007-04-24 05:29:33 +0000
commit69455efa4b6d6fbebb3869b69c43e33b6dacbe9e (patch)
treea1a107f5cb66a98f68416cf113eaaa922e0753d1
parent8f841fc627cae91f653a31c3c1d6eac11e1518a0 (diff)
downloadopen-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--README8
-rw-r--r--doc/iscsiadm.813
-rw-r--r--usr/iscsiadm.c134
3 files changed, 83 insertions, 72 deletions
diff --git a/README b/README
index 546bd9c..6ae125a 100644
--- a/README
+++ b/README
@@ -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;
}