summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Ramsay <jim_ramsay@dell.com>2011-06-03 09:21:22 -0400
committerMike Christie <michaelc@cs.wisc.edu>2011-07-07 16:39:13 -0500
commit2ec7d01db8193268ce5271d813875fb6684fced0 (patch)
treed0edc0cb90fa985beaea6595e5f1270773a336c8
parent8bd27eaa1d6e2db35c16c46f9619db833a24b136 (diff)
downloadopen-iscsi-2ec7d01db8193268ce5271d813875fb6684fced0.tar.gz
Add specific session information to session_rec_t
This is populated by iscsiadm in 'session' mode when the '-r' options is given, and passed along in the session_rec_t. It limits the operation of exec_node_op to only the specific session specified by the user. This is a prerequisite for "multiple sessions per iface recond". Signed-off-by: Jim Ramsay <jim_ramsay@dell.com>
-rw-r--r--usr/config.h2
-rw-r--r--usr/idbm.c5
-rw-r--r--usr/initiator.c3
-rw-r--r--usr/iscsi_util.c18
-rw-r--r--usr/iscsi_util.h5
-rw-r--r--usr/iscsiadm.c19
6 files changed, 38 insertions, 14 deletions
diff --git a/usr/config.h b/usr/config.h
index 5cb4d56..dcc862d 100644
--- a/usr/config.h
+++ b/usr/config.h
@@ -193,6 +193,8 @@ typedef struct session_rec {
struct iscsi_session_timeout_config timeo;
struct iscsi_error_timeout_config err_timeo;
struct iscsi_session_operational_config iscsi;
+ struct session_info *info;
+ unsigned sid;
} session_rec_t;
#define ISCSI_TRANSPORT_NAME_MAXLEN 16
diff --git a/usr/idbm.c b/usr/idbm.c
index a73b410..4965819 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -2412,6 +2412,8 @@ void idbm_node_setup_defaults(node_rec_t *rec)
rec->session.err_timeo.tgt_reset_timeout = DEF_TGT_RESET_TIMEO;
rec->session.err_timeo.host_reset_timeout = DEF_HOST_RESET_TIMEO;
rec->session.timeo.replacement_timeout = DEF_REPLACEMENT_TIMEO;
+ rec->session.info = NULL;
+ rec->session.sid = 0;
idbm_setup_session_defaults(&rec->session.iscsi);
for (i=0; i<ISCSI_CONN_MAX; i++) {
@@ -2439,7 +2441,8 @@ idbm_find_rec_in_list(struct list_head *rec_list, char *targetname, char *addr,
struct node_rec *rec;
list_for_each_entry(rec, rec_list, list) {
- if (__iscsi_match_session(rec, targetname, addr, port, iface))
+ if (__iscsi_match_session(rec, targetname, addr, port, iface,
+ MATCH_ANY_SID))
return rec;
}
diff --git a/usr/initiator.c b/usr/initiator.c
index 5eb05b5..c004406 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -1611,7 +1611,8 @@ static iscsi_session_t* session_find_by_rec(node_rec_t *rec)
if (__iscsi_match_session(rec, session->nrec.name,
session->nrec.conn[0].address,
session->nrec.conn[0].port,
- &session->nrec.iface))
+ &session->nrec.iface,
+ MATCH_ANY_SID))
return session;
}
}
diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c
index 4481294..a99db9f 100644
--- a/usr/iscsi_util.c
+++ b/usr/iscsi_util.c
@@ -33,6 +33,7 @@
#include "iscsi_settings.h"
#include "iface.h"
#include "session_info.h"
+#include "iscsi_util.h"
void daemon_init(void)
{
@@ -285,24 +286,28 @@ free_res1:
}
int __iscsi_match_session(node_rec_t *rec, char *targetname,
- char *address, int port, struct iface_rec *iface)
+ char *address, int port, struct iface_rec *iface,
+ unsigned sid)
{
if (!rec) {
log_debug(6, "no rec info to match\n");
return 1;
}
- log_debug(6, "match session [%s,%s,%d][%s %s,%s,%s]",
+ log_debug(6, "match session [%s,%s,%d][%s %s,%s,%s]:%u",
rec->name, rec->conn[0].address, rec->conn[0].port,
rec->iface.name, rec->iface.transport_name,
- rec->iface.hwaddress, rec->iface.ipaddress);
+ rec->iface.hwaddress, rec->iface.ipaddress,
+ rec->session.sid);
if (iface)
- log_debug(6, "to [%s,%s,%d][%s %s,%s,%s]",
+ log_debug(6, "to [%s,%s,%d][%s %s,%s,%s]:%u",
targetname, address, port, iface->name,
iface->transport_name, iface->hwaddress,
- iface->ipaddress);
+ iface->ipaddress, sid);
+ if (rec->session.sid && sid && rec->session.sid != sid)
+ return 0;
if (strlen(rec->name) && strcmp(rec->name, targetname))
return 0;
@@ -323,5 +328,6 @@ int iscsi_match_session(void *data, struct session_info *info)
{
return __iscsi_match_session(data, info->targetname,
info->persistent_address,
- info->persistent_port, &info->iface);
+ info->persistent_port, &info->iface,
+ info->sid);
}
diff --git a/usr/iscsi_util.h b/usr/iscsi_util.h
index 87b2bb2..9428867 100644
--- a/usr/iscsi_util.h
+++ b/usr/iscsi_util.h
@@ -16,7 +16,10 @@ extern char *str_to_ipport(char *str, int *port, int *tgpt);
extern int iscsi_match_session(void *data, struct session_info *info);
extern int __iscsi_match_session(struct node_rec *rec, char *targetname,
char *address, int port,
- struct iface_rec *iface);
+ struct iface_rec *iface,
+ unsigned sid);
+
+#define MATCH_ANY_SID 0
extern char *strstrip(char *s);
extern char *cfg_get_string_param(char *pathname, const char *key);
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index e3a6b81..937b99e 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -292,7 +292,12 @@ for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn)
{
int err, num_found = 0;
- err = iscsi_sysfs_for_each_session(rec, &num_found, fn);
+ if (rec && rec->session.info) {
+ num_found = 1;
+ err = fn(rec, rec->session.info);
+ } else {
+ err = iscsi_sysfs_for_each_session(rec, &num_found, fn);
+ }
if (err)
log_error("Could not execute operation on all sessions: %s",
iscsi_err_to_str(err));
@@ -465,7 +470,7 @@ static int rec_match_fn(void *data, node_rec_t *rec)
if (!__iscsi_match_session(op_data->match_rec, rec->name,
rec->conn[0].address, rec->conn[0].port,
- &rec->iface))
+ &rec->iface, rec->session.sid))
return -1;
return op_data->fn(op_data->data, rec);
}
@@ -850,7 +855,8 @@ static int delete_stale_rec(void *data, struct node_rec *rec)
new_rec->name,
new_rec->conn[0].address,
new_rec->conn[0].port,
- &new_rec->iface))
+ &new_rec->iface,
+ new_rec->session.sid))
return -1;
}
/* if there is a error we can continue on */
@@ -1239,9 +1245,10 @@ static int exec_node_op(int op, int do_login, int do_logout,
struct db_set_param set_param;
if (rec)
- log_debug(2, "%s: %s:%s node [%s,%s,%d]", __FUNCTION__,
+ log_debug(2, "%s: %s:%s node [%s,%s,%d] sid %u", __FUNCTION__,
rec->iface.transport_name, rec->iface.name,
- rec->name, rec->conn[0].address, rec->conn[0].port);
+ rec->name, rec->conn[0].address, rec->conn[0].port,
+ rec->session.sid);
if (op == OP_NEW) {
rc = add_static_recs(rec);
@@ -2144,6 +2151,8 @@ main(int argc, char **argv)
rc = ISCSI_ERR_NOMEM;
goto free_info;
}
+ rec->session.info = info;
+ rec->session.sid = sid;
/* drop down to node ops */
rc = exec_node_op(op, do_login, do_logout, do_show,