iscsi-initiator-utils: Various improvements.

* Update to latest stable upstream version.
* Add download URL.
* Update patchset which fixes a lot of bugs and
  provides socked based activation for systemd.
* Add services files for systemd.

Fixes #10289.
This commit is contained in:
Stefan Schantl 2013-01-26 20:33:46 +01:00 committed by Michael Tremer
parent 61166a61c1
commit 092b90ae70
31 changed files with 2421 additions and 764 deletions

View File

@ -4,8 +4,9 @@
###############################################################################
name = iscsi-initiator-utils
version = 6.2.0.872
release = 3
rel_ver = 873
version = 6.2.0.%{rel_ver}
release = 1
groups = System/Daemons
url = http://www.open-iscsi.org/
@ -19,8 +20,9 @@ description
Protocol networks.
end
source_dl =
sources = open-iscsi-2.0-872-rc4-bnx2i.tar.gz
thisapp = open-iscsi-2.0-%{rel_ver}
source_dl = http://www.open-iscsi.org/bits/
build
requires
@ -28,14 +30,8 @@ build
python-devel
end
DIR_APP = %{DIR_SRC}/open-iscsi-2.0-872-rc4-bnx2i
prepare_cmds
cd libiscsi && sed -e "s/^all.*/all: lib tests/" -i Makefile
end
build
cd %{DIR_APP}/utils/open-isns && ./configure
cd %{DIR_APP}/utils/open-isns && ./configure --with-security=no
cd %{DIR_APP}/utils/open-isns && make
cd %{DIR_APP} && make -C utils/sysdeps
cd %{DIR_APP} && make -C utils/fwparam_ibft
@ -68,11 +64,15 @@ build
install -p -m 755 libiscsi/build/lib.linux-*/libiscsimodule.so \
%{BUILDROOT}%{python_sitelib}
install -p -m 755 %{DIR_SOURCE}/iscsi_mark_root_nodes %{BUILDROOT}%{prefix}/lib/
end
end
packages
package %{name}
prerequires += systemd-units
requires
libiscsi = %{thisver}
end
@ -85,6 +85,28 @@ packages
if [ ! -f "%{sysconfdir}/iscsi/initiatorname.iscsi" ]; then
echo "InitiatorName=$(iscsi-iname)" > %{sysconfdir}/iscsi/initiatorname.iscsi
fi
systemctl daemon-reload >/dev/null 2>&1 || :
systemctl --no-reload enable iscsid.socket >/dev/null 2>&1 || :
end
script preun
systemctl --no-reload disable iscsid.socket >/dev/null 2>&1 || :
systemctl --no-reload disable iscsid.service >/dev/null 2>&1 || :
systemctl --no-reload disable iscsi.service >/dev/null 2>&1 || :
systemctl stop iscsi.service >/dev/null 2>&1 || :
systemctl stop iscsid.socket >/dev/null 2>&1 || :
systemctl stop iscsid.service >/dev/null 2>&1 || :
end
script postun
systemctl daemon-reload >/dev/null 2>&1 || :
end
script postup
systemctl daemon-reload >/dev/null 2>&1 || :
systemctl try-restart iscsi.service >/dev/null 2>&1 || :
systemctl try-restart iscsid.service >/dev/null 2>&1 || :
end
end

View File

@ -0,0 +1,14 @@
#!/bin/bash
ISCSIADM=/sbin/iscsiadm
SESSION_FILE=/run/initramfs/iscsi.sessions
if [ ! -f $SESSION_FILE ] ; then
exit 0
fi
while read t num i target; do
ip=${i%:*}
$ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot
done < $SESSION_FILE

View File

@ -0,0 +1,43 @@
From 71cd021b74a7094b5186a42bfe59a35e2fa66018 Mon Sep 17 00:00:00 2001
From: Mike Christie <michaelc@cs.wisc.edu>
Date: Wed, 5 Sep 2012 16:18:16 -0500
Subject: iscsid: fix iscsid segfault during qla4xxx login
If the kernel sends multiple ISCSI_KEVENT_CONN_LOGIN_STATE
events for the same login event iscsid will segault.
When we get a conn error we will set the r_stage to reopen, then when
session_conn_process_login handles the first login event we set the r_stage
to R_STAGE_NO_CHANGE. But then it looks like if we get a second login event
r_stage is no_change and session_conn_process_login will run again and
call mgmt_ipc_write_rsp on a bad qtask.
---
usr/initiator.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/usr/initiator.c b/usr/initiator.c
index 79ca32c..d475358 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -993,7 +993,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno,
exit(0);
} else if (pid > 0) {
reap_inc();
- if (qtask) {
+ if (qtask && qtask->mgmt_ipc_fd >= 0) {
close(qtask->mgmt_ipc_fd);
free(qtask);
}
@@ -1618,6 +1618,9 @@ static void session_conn_process_login(void *data)
if (state == ISCSI_CONN_STATE_FREE)
goto failed_login;
+ if (conn->state == ISCSI_CONN_STATE_LOGGED_IN)
+ return;
+
conn->state = ISCSI_CONN_STATE_LOGGED_IN;
/*
* ok we were in_login and now we got the notification that we are
--
1.7.11.7

View File

@ -0,0 +1,37 @@
From f0a8c95426d21413d9980d31740e193208e3280e Mon Sep 17 00:00:00 2001
From: Eddie Wai <eddie.wai@broadcom.com>
Date: Wed, 5 Sep 2012 14:14:20 -0700
Subject: ISCSISTART: Bring up the corresponding network interface for iboot
This is needed for the iSCSI offload boot.
Snip from M. Christie:
Note that we must bring up the interface before iface_setup_from_boot_context,
because we will want iscsi_sysfs_get_host_no_from_hwaddress to be able to match
a MAC to a iscsi host. For some bnx2i cards, the card has to be ifupd for the
iscsi interface to have a MAC. If it is not ifupd we have seen MACs with all
zeros or no iscsi_hosts on different cards.
Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
---
usr/iface.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/usr/iface.c b/usr/iface.c
index 3a9582e..4028e34 100644
--- a/usr/iface.c
+++ b/usr/iface.c
@@ -917,6 +917,10 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
transport_name))
t = iscsi_sysfs_get_transport_by_name(transport_name);
+ if (net_ifup_netdev(context->iface))
+ log_warning("Could not bring up netdev %s for boot",
+ context->iface);
+
hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac,
&rc);
if (rc) {
--
1.7.11.7

View File

@ -0,0 +1,35 @@
From d81fd4903cebb1d00aa48b0718d20e34b00dfde1 Mon Sep 17 00:00:00 2001
From: Mike Christie <michaelc@cs.wisc.edu>
Date: Wed, 26 Sep 2012 21:19:39 -0500
Subject: iscsi tools: fix compile error when OFFLOAD_BOOT_SUPPORT defined
Fix compile error when OFFLOAD_BOOT_SUPPORT is defined and fix
warning when it is defined.
---
usr/iface.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/usr/iface.c b/usr/iface.c
index 4028e34..4f81a76 100644
--- a/usr/iface.c
+++ b/usr/iface.c
@@ -894,7 +894,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
struct boot_context *context)
{
struct iscsi_transport *t = NULL;
- char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
uint32_t hostno;
if (strlen(context->initiatorname))
@@ -910,6 +909,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
} else if (strlen(context->iface)) {
/* this ifdef is only temp until distros and firmwares are updated */
#ifdef OFFLOAD_BOOT_SUPPORTED
+ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
+ int rc;
memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN);
/* make sure offload driver is loaded */
--
1.7.11.7

View File

@ -0,0 +1,32 @@
From 13d08e79090421fbf67fd727aada487ea23ecc2d Mon Sep 17 00:00:00 2001
From: Eddie Wai <eddie.wai@broadcom.com>
Date: Thu, 27 Sep 2012 13:57:12 -0700
Subject: ISCSID: Passing more net params from ibft to iface
Added the passing of the vlan_id, subnet_mask, and gateway attributes
from the ibft context to the iface struct for the connection request.
Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
---
usr/iface.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/usr/iface.c b/usr/iface.c
index 4f81a76..c86892e 100644
--- a/usr/iface.c
+++ b/usr/iface.c
@@ -962,6 +962,11 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
sizeof(iface->hwaddress));
strlcpy(iface->ipaddress, context->ipaddr,
sizeof(iface->ipaddress));
+ iface->vlan_id = atoi(context->vlan);
+ strlcpy(iface->subnet_mask, context->mask,
+ sizeof(iface->subnet_mask));
+ strlcpy(iface->gateway, context->gateway,
+ sizeof(iface->gateway));
log_debug(1, "iface " iface_fmt "\n", iface_str(iface));
return 1;
}
--
1.7.11.7

View File

@ -0,0 +1,62 @@
From 9dd181dcb1ca299cd82075b8e598fc57d87ee1c0 Mon Sep 17 00:00:00 2001
From: Jim Ramsay <jim_ramsay@dell.com>
Date: Wed, 3 Oct 2012 09:57:43 -0400
Subject: iscsi tools: Convert '-r' argument to an integer before checking if
it is a path
If there is a file in the CWD named '1' and you were trying to run
'iscsiadm -m session -r 1 ...', the command would fail with "1 is not a
directory".
Root cause: The code that parses the -r option's argument tries lstat(2)
first, falling back to atoi(3) only if lstat fails.
This change inverts the order of checks, first with strtol(3) to see if
the argument given is a positive integer, then falling back to lstat(2)
only if it is not.
Signed-off-by: Jim Ramsay <jim_ramsay@dell.com>
---
usr/iscsi_sysfs.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
index 123dde3..4015b35 100644
--- a/usr/iscsi_sysfs.c
+++ b/usr/iscsi_sysfs.c
@@ -740,7 +740,7 @@ int iscsi_sysfs_session_has_leadconn(uint32_t sid)
* /sys/devices/platform/hostH/sessionS/targetH:B:I
* /sys/devices/platform/hostH/sessionS
*
- * return the sid S. If just the sid is passed in it will be covnerted
+ * return the sid S. If just the sid is passed in it will be converted
* to a int.
*/
int iscsi_sysfs_get_sid_from_path(char *session)
@@ -748,15 +748,16 @@ int iscsi_sysfs_get_sid_from_path(char *session)
struct sysfs_device *dev_parent, *dev;
struct stat statb;
char devpath[PATH_SIZE];
+ char *end;
+ int sid;
+
+ sid = strtol(session, &end, 10);
+ if (sid > 0 && *session != '\0' && *end == '\0')
+ return sid;
if (lstat(session, &statb)) {
- log_debug(1, "Could not stat %s failed with %d",
- session, errno);
- if (index(session, '/')) {
- log_error("%s is an invalid session path\n", session);
- exit(1);
- }
- return atoi(session);
+ log_error("%s is an invalid session ID or path\n", session);
+ exit(1);
}
if (!S_ISDIR(statb.st_mode) && !S_ISLNK(statb.st_mode)) {
--
1.7.11.7

View File

@ -0,0 +1,49 @@
From 97db3db45c7e96888ea48a54ff19b7ff5d08cca6 Mon Sep 17 00:00:00 2001
From: Andy Grover <agrover@redhat.com>
Date: Wed, 24 Oct 2012 15:37:28 -0700
Subject: Update README for removal of DBM requirement
Removed in 093b1f4 (2006)
Signed-off-by: Andy Grover <agrover@redhat.com>
---
README | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/README b/README
index 7364b2d..ec22098 100644
--- a/README
+++ b/README
@@ -159,15 +159,20 @@ Usage: iscsid [OPTION]
5. Open-iSCSI Configuration Utility
===================================
-Open-iSCSI persistent configuration is implemented as a DBM database
-available on all Linux installations.
-
-The database contains two tables:
-
-- Discovery table (/etc/iscsi/send_targets);
-- Node table (/etc/iscsi/nodes).
-
-The regular place for iSCSI database files: /etc/iscsi/nodes
+Open-iSCSI persistent configuration is stored in a number of
+directories under a configuration root directory, using a flat-file
+format. This configuration root directory is /etc/iscsi by default,
+but may also commonly be in /var/lib/iscsi.
+
+Configuration is contained in directories for:
+
+- nodes
+- slp
+- isns
+- static
+- fw
+- send_targets
+- ifaces
The iscsiadm utility is a command-line tool to manage (update, delete,
insert, query) the persistent database.
--
1.7.11.7

View File

@ -0,0 +1,80 @@
From 2d086a831dc16d10729d6fce17bed3ade3efd16c Mon Sep 17 00:00:00 2001
From: Tomasz Torcz <tomek@pipebreaker.pl>
Date: Wed, 28 Nov 2012 13:37:06 +0100
Subject: iscsid,iscsiadm: fix abstract socket length in bind() call
For abstract sockets, the addrlen parameter should be the actual
length of socket's name. Otherwise socket gets padded with some
number of NULs.
---
usr/iscsid_req.c | 10 ++++++----
usr/mgmt_ipc.c | 9 +++++----
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
index 0902011..1c4678d 100644
--- a/usr/iscsid_req.c
+++ b/usr/iscsid_req.c
@@ -56,7 +56,7 @@ static void iscsid_startup(void)
static int iscsid_connect(int *fd, int start_iscsid)
{
- int nsec;
+ int nsec, addr_len;
struct sockaddr_un addr;
*fd = socket(AF_LOCAL, SOCK_STREAM, 0);
@@ -65,15 +65,17 @@ static int iscsid_connect(int *fd, int start_iscsid)
return ISCSI_ERR_ISCSID_NOTCONN;
}
+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
+
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
- strlen(ISCSIADM_NAMESPACE));
+ memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
+
/*
* Trying to connect with exponential backoff
*/
for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
- if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0)
+ if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0)
/* Connection established */
return ISCSI_SUCCESS;
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
index 5c39c2e..a1dafc9 100644
--- a/usr/mgmt_ipc.c
+++ b/usr/mgmt_ipc.c
@@ -43,7 +43,7 @@
int
mgmt_ipc_listen(void)
{
- int fd, err;
+ int fd, err, addr_len;
struct sockaddr_un addr;
fd = socket(AF_LOCAL, SOCK_STREAM, 0);
@@ -52,12 +52,13 @@ mgmt_ipc_listen(void)
return fd;
}
+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
+
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
- strlen(ISCSIADM_NAMESPACE));
+ memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
- if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) {
+ if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) {
log_error("Can not bind IPC socket");
close(fd);
return err;
--
1.7.11.7

View File

@ -0,0 +1,79 @@
From 5d0e19fcc1cea77a72647cf96c5d3d773e8ee277 Mon Sep 17 00:00:00 2001
From: Tomasz Torcz <tomek@pipebreaker.pl>
Date: Wed, 28 Nov 2012 13:37:07 +0100
Subject: iscsid: implement systemd-compatible socket activation
---
usr/mgmt_ipc.c | 29 +++++++++++++++++++++++++++++
usr/mgmt_ipc.h | 1 +
2 files changed, 30 insertions(+)
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
index a1dafc9..87bd346 100644
--- a/usr/mgmt_ipc.c
+++ b/usr/mgmt_ipc.c
@@ -39,6 +39,7 @@
#define PEERUSER_MAX 64
#define EXTMSG_MAX (64 * 1024)
+#define SD_SOCKET_FDS_START 3
int
mgmt_ipc_listen(void)
@@ -46,6 +47,12 @@ mgmt_ipc_listen(void)
int fd, err, addr_len;
struct sockaddr_un addr;
+ /* first check if we have fd handled by systemd */
+ fd = mgmt_ipc_systemd();
+ if (fd >= 0)
+ return fd;
+
+ /* manually establish a socket */
fd = socket(AF_LOCAL, SOCK_STREAM, 0);
if (fd < 0) {
log_error("Can not create IPC socket");
@@ -73,6 +80,28 @@ mgmt_ipc_listen(void)
return fd;
}
+int mgmt_ipc_systemd(void)
+{
+ const char *env;
+
+ env = getenv("LISTEN_PID");
+
+ if (!env || (strtoul(env, NULL, 10) != getpid()))
+ return -EINVAL;
+
+ env = getenv("LISTEN_FDS");
+
+ if (!env)
+ return -EINVAL;
+
+ if (strtoul(env, NULL, 10) != 1) {
+ log_error("Did not receive exactly one IPC socket from systemd");
+ return -EINVAL;
+ }
+
+ return SD_SOCKET_FDS_START;
+}
+
void
mgmt_ipc_close(int fd)
{
diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h
index 7d8ce72..55972ed 100644
--- a/usr/mgmt_ipc.h
+++ b/usr/mgmt_ipc.h
@@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *);
struct queue_task;
void mgmt_ipc_write_rsp(struct queue_task *qtask, int err);
int mgmt_ipc_listen(void);
+int mgmt_ipc_systemd(void);
void mgmt_ipc_close(int fd);
void mgmt_ipc_handle(int accept_fd);
--
1.7.11.7

View File

@ -0,0 +1,61 @@
From a7afdf46c3193eb102cc6ec2a3b61e8d36794437 Mon Sep 17 00:00:00 2001
From: Mike Christie <michaelc@cs.wisc.edu>
Date: Fri, 14 Dec 2012 12:40:27 -0600
Subject: iscsi tools: fix get_random_bytes error handling
Bug report from Rahul:
There seems to be a bug in function get_random_bytes(). I reported
this earlier as well but somehow it didn't appear here.
get_random_bytes(unsigned char *data, unsigned int length)
{
long r;
unsigned n;
int fd;
fd = open("/dev/urandom", O_RDONLY);
while (length > 0) {
if (!fd || read(fd, &r, sizeof(long)) != -1) <<<< the condition is
incorrect
---
usr/auth.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/usr/auth.c b/usr/auth.c
index c924545..4ff0425 100644
--- a/usr/auth.c
+++ b/usr/auth.c
@@ -189,24 +189,24 @@ get_random_bytes(unsigned char *data, unsigned int length)
long r;
unsigned n;
- int fd;
+ int fd, r_size = sizeof(r);
fd = open("/dev/urandom", O_RDONLY);
while (length > 0) {
- if (!fd || read(fd, &r, sizeof(long)) != -1)
+ if (fd == -1 || read(fd, &r, r_size) != r_size)
r = rand();
r = r ^ (r >> 8);
r = r ^ (r >> 4);
n = r & 0x7;
- if (!fd || read(fd, &r, sizeof(long)) != -1)
+ if (fd == -1 || read(fd, &r, r_size) != r_size)
r = rand();
r = r ^ (r >> 8);
r = r ^ (r >> 5);
n = (n << 3) | (r & 0x7);
- if (!fd || read(fd, &r, sizeof(long)) != -1)
+ if (fd == -1 || read(fd, &r, r_size) != r_size)
r = rand();
r = r ^ (r >> 8);
r = r ^ (r >> 5);
--
1.7.11.7

View File

@ -0,0 +1,61 @@
From b1799fe84ed94a19bba6bcd7284ce8b038be4ffe Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 10 Dec 2012 13:20:47 -0800
Subject: iscsid: add --initrd option to set run from initrd hint for systemd
See http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
Signed-off-by: Chris Leech <cleech@redhat.com>
---
usr/iscsid.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/usr/iscsid.c b/usr/iscsid.c
index b4bb65b..7d71085 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -61,6 +61,7 @@ static pid_t log_pid;
static gid_t gid;
static int daemonize = 1;
static int mgmt_ipc_fd;
+static int initrd = 0;
static struct option const long_options[] = {
{"config", required_argument, NULL, 'c'},
@@ -73,6 +74,7 @@ static struct option const long_options[] = {
{"pid", required_argument, NULL, 'p'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'},
+ {"initrd", no_argument, &initrd, 1},
{NULL, 0, NULL, 0},
};
@@ -95,6 +97,7 @@ Open-iSCSI initiator daemon.\n\
-p, --pid=pidfile use pid file (default " PID_FILE ").\n\
-h, --help display this help and exit\n\
-v, --version display version and exit\n\
+ --initrd run from initrd\n\
");
}
exit(status);
@@ -383,12 +386,17 @@ int main(int argc, char *argv[])
case 'h':
usage(0);
break;
+ case 0:
+ break;
default:
usage(1);
break;
}
}
+ if (initrd)
+ argv[0][0] = '@';
+
/* initialize logger */
log_pid = log_init(program_name, DEFAULT_AREA_SIZE,
daemonize ? log_do_log_daemon : log_do_log_std, NULL);
--
1.7.11.7

View File

@ -0,0 +1,157 @@
From ac3447ab680ef5319717fc6b85a4c5b22e652e5e Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Fri, 7 Dec 2012 17:01:42 -0800
Subject: iscsiadm, iscsid: newroot command to survive switch_root
When started from initramfs, iscsid needs to be able to chroot itself
to the runtime filesystem before the switch_root occurs. In the
initramfs "iscsiadm --newroot {root fs mount before switch}" should be
called before the switch_root.
Signed-off-by: Chris Leech <cleech@redhat.com>
---
usr/iscsiadm.c | 30 ++++++++++++++++++++++++++++++
usr/mgmt_ipc.c | 11 +++++++++++
usr/mgmt_ipc.h | 6 +++++-
3 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index 8f9de05..323d0a8 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -111,6 +111,7 @@ static struct option const long_options[] =
{"packetsize", required_argument, NULL, 'b'},
{"count", required_argument, NULL, 'c'},
{"interval", required_argument, NULL, 'i'},
+ {"newroot", required_argument, NULL, 0},
{NULL, 0, NULL, 0},
};
static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
@@ -131,6 +132,7 @@ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid
iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
iscsiadm -m fw [ -l ]\n\
iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]\n\
+iscsiadm --newroot switch_root_path\n\
iscsiadm -k priority\n");
}
exit(status);
@@ -251,6 +253,22 @@ static void kill_iscsid(int priority)
}
}
+static void do_newroot(char *newroot)
+{
+ iscsiadm_req_t req;
+ iscsiadm_rsp_t rsp;
+ int rc;
+
+ memset(&req, 0, sizeof(req));
+ req.command = MGMT_IPC_NEWROOT;
+ strncpy(req.u.newroot.path, newroot, PATH_MAX);
+ rc = iscsid_exec_req(&req, &rsp, 0);
+ if (rc) {
+ iscsi_err_print_msg(rc);
+ log_error("Could not send NEWROOT command");
+ }
+}
+
/*
* TODO: we can display how the ifaces are related to node records.
* And we can add a scsi_host mode which would display how
@@ -2397,6 +2415,7 @@ main(int argc, char **argv)
{
char *ip = NULL, *name = NULL, *value = NULL;
char *targetname = NULL, *group_session_mgmt_mode = NULL;
+ char *newroot = NULL;
int ch, longindex, mode=-1, port=-1, do_login=0, do_rescan=0;
int rc=0, sid=-1, op=OP_NOOP, type=-1, do_logout=0, do_stats=0;
int do_login_all=0, do_logout_all=0, info_level=-1, num_ifaces = 0;
@@ -2433,6 +2452,12 @@ main(int argc, char **argv)
while ((ch = getopt_long(argc, argv, short_options,
long_options, &longindex)) >= 0) {
switch (ch) {
+ case 0:
+ if (long_options[longindex].flag != 0)
+ break;
+ if (!strcmp(long_options[longindex].name, "newroot"))
+ newroot = optarg;
+ break;
case 'k':
killiscsid = atoi(optarg);
if (killiscsid < 0) {
@@ -2579,6 +2604,11 @@ main(int argc, char **argv)
goto free_ifaces;
}
+ if (newroot) {
+ do_newroot(newroot);
+ goto free_ifaces;
+ }
+
if (mode < 0)
usage(ISCSI_ERR_INVAL);
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
index 87bd346..5cb7143 100644
--- a/usr/mgmt_ipc.c
+++ b/usr/mgmt_ipc.c
@@ -226,6 +226,16 @@ mgmt_ipc_immediate_stop(queue_task_t *qtask)
}
static int
+mgmt_ipc_newroot(queue_task_t *qtask)
+{
+ char *newroot = qtask->req.u.newroot.path;
+ if (chdir(newroot) || chroot(".") || chdir("/"))
+ return ISCSI_ERR;
+ mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS);
+ return ISCSI_SUCCESS;
+}
+
+static int
mgmt_ipc_conn_remove(queue_task_t *qtask)
{
return ISCSI_ERR;
@@ -534,6 +544,7 @@ static mgmt_ipc_fn_t * mgmt_ipc_functions[__MGMT_IPC_MAX_COMMAND] = {
[MGMT_IPC_NOTIFY_DEL_NODE] = mgmt_ipc_notify_del_node,
[MGMT_IPC_NOTIFY_ADD_PORTAL] = mgmt_ipc_notify_add_portal,
[MGMT_IPC_NOTIFY_DEL_PORTAL] = mgmt_ipc_notify_del_portal,
+[MGMT_IPC_NEWROOT] = mgmt_ipc_newroot,
};
void mgmt_ipc_handle(int accept_fd)
diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h
index 55972ed..102ffff 100644
--- a/usr/mgmt_ipc.h
+++ b/usr/mgmt_ipc.h
@@ -22,6 +22,7 @@
#include "types.h"
#include "iscsi_if.h"
#include "config.h"
+#include "limits.h"
#define ISCSIADM_NAMESPACE "ISCSIADM_ABSTRACT_NAMESPACE"
#define PEERUSER_MAX 64
@@ -46,6 +47,7 @@ typedef enum iscsiadm_cmd {
MGMT_IPC_NOTIFY_DEL_NODE = 17,
MGMT_IPC_NOTIFY_ADD_PORTAL = 18,
MGMT_IPC_NOTIFY_DEL_PORTAL = 19,
+ MGMT_IPC_NEWROOT = 20,
__MGMT_IPC_MAX_COMMAND
} iscsiadm_cmd_e;
@@ -75,8 +77,10 @@ typedef struct iscsiadm_req {
int param;
/* TODO: make this variable len to support */
char value[IFNAMSIZ + 1];
-
} set_host_param;
+ struct ipc_msg_newroot {
+ char path[PATH_MAX + 1];
+ } newroot;
} u;
} iscsiadm_req_t;
--
1.7.11.7

View File

@ -0,0 +1,337 @@
From a41a27cd9b910191a616706c4f473259909bc45d Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Tue, 18 Dec 2012 11:27:00 -0800
Subject: iscsiadm: --param parsing for advanced node creation
Share parse_param and apply_param code from iscsistart, allow using multiple
--param options to set arbitrary fields in node mode.
Signed-off-by: Chris Leech <cleech@redhat.com>
---
usr/Makefile | 2 +-
usr/iscsi_param.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
usr/iscsi_param.h | 7 ++++
usr/iscsiadm.c | 16 ++++++++--
usr/iscsistart.c | 91 ++--------------------------------------------------
5 files changed, 120 insertions(+), 91 deletions(-)
create mode 100644 usr/iscsi_param.c
create mode 100644 usr/iscsi_param.h
diff --git a/usr/Makefile b/usr/Makefile
index 673b7f1..1506111 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
- initiator_common.o iscsi_err.o $(IPC_OBJ) $(SYSDEPS_SRCS)
+ initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ) $(SYSDEPS_SRCS)
# core initiator files
INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
diff --git a/usr/iscsi_param.c b/usr/iscsi_param.c
new file mode 100644
index 0000000..c075e8f
--- /dev/null
+++ b/usr/iscsi_param.c
@@ -0,0 +1,95 @@
+#include <string.h>
+#include "log.h"
+#include "config.h"
+#include "idbm.h"
+#include "list.h"
+#include "iface.h"
+#include "idbm_fields.h"
+#include "iscsi_err.h"
+
+int apply_params(struct list_head *user_params, struct node_rec *rec)
+{
+ struct user_param *param;
+ int rc;
+
+ /* Must init this so we can check if user overrode them */
+ rec->session.initial_login_retry_max = -1;
+ rec->conn[0].timeo.noop_out_interval = -1;
+ rec->conn[0].timeo.noop_out_timeout = -1;
+
+ list_for_each_entry(param, user_params, list) {
+ /*
+ * user may not have passed in all params that were set by
+ * ibft/iscsi_boot, so clear out values that might conflict
+ * with user overrides
+ */
+ if (!strcmp(param->name, IFACE_NETNAME)) {
+ /* overriding netname so MAC will be for old netdev */
+ memset(rec->iface.hwaddress, 0,
+ sizeof(rec->iface.hwaddress));
+ } else if (!strcmp(param->name, IFACE_HWADDR)) {
+ /* overriding MAC so netdev will be for old MAC */
+ memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
+ } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
+ /*
+ * switching drivers so all old binding info is no
+ * longer valid. Old values were either for offload
+ * and we are switching to software or the reverse,
+ * or switching types of cards (bnx2i to cxgb3i).
+ */
+ memset(&rec->iface, 0, sizeof(rec->iface));
+ iface_setup_defaults(&rec->iface);
+ }
+ }
+
+ rc = idbm_node_set_rec_from_param(user_params, rec, 0);
+ if (rc)
+ return rc;
+
+ /*
+ * For root boot we could not change this in older versions so
+ * if user did not override then use the defaults.
+ *
+ * Increase to account for boot using static setup.
+ */
+ if (rec->session.initial_login_retry_max == -1)
+ rec->session.initial_login_retry_max = 30;
+ /* we used to not be able to answer so turn off */
+ if (rec->conn[0].timeo.noop_out_interval == -1)
+ rec->conn[0].timeo.noop_out_interval = 0;
+ if (rec->conn[0].timeo.noop_out_timeout == -1)
+ rec->conn[0].timeo.noop_out_timeout = 0;
+
+ return 0;
+}
+
+int parse_param(struct list_head *user_params, char *param_str)
+{
+ struct user_param *param;
+ char *name, *value;
+
+ name = param_str;
+
+ value = strchr(param_str, '=');
+ if (!value) {
+ log_error("Invalid --param %s. Missing value.", param_str);
+ return ISCSI_ERR_INVAL;
+ }
+ *value = '\0';
+
+ value++;
+ if (!strlen(value)) {
+ log_error("Invalid --param %s. Missing value.", param_str);
+ return ISCSI_ERR_INVAL;
+ }
+
+ param = idbm_alloc_user_param(name, value);
+ if (!param) {
+ log_error("Could not allocate memory for param.");
+ return ISCSI_ERR_NOMEM;
+ }
+
+ list_add(&param->list, user_params);
+ return 0;
+}
+
diff --git a/usr/iscsi_param.h b/usr/iscsi_param.h
new file mode 100644
index 0000000..8b7956c
--- /dev/null
+++ b/usr/iscsi_param.h
@@ -0,0 +1,7 @@
+#ifndef ISCSI_PARAM_H
+#define ISCSI_PARAM_H
+
+extern int parse_param(struct list_head *user_params, char *param_str);
+extern int apply_params(struct list_head *user_params, struct node_rec *rec);
+
+#endif
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index 323d0a8..ef866ae 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -53,6 +53,7 @@
#include "iscsi_err.h"
#include "iscsi_ipc.h"
#include "iscsi_timer.h"
+#include "iscsi_param.h"
static char program_name[] = "iscsiadm";
static char config_file[TARGET_NAME_MAXLEN];
@@ -112,6 +113,7 @@ static struct option const long_options[] =
{"count", required_argument, NULL, 'c'},
{"interval", required_argument, NULL, 'i'},
{"newroot", required_argument, NULL, 0},
+ {"param", required_argument, NULL, 0},
{NULL, 0, NULL, 0},
};
static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
@@ -127,7 +129,7 @@ iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p
[ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\
iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\
iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \
-[ [ -o operation ] [ -n name ] [ -v value ] ]\n\
+[ [ -o operation ] [ -n name ] [ -v value ] ] [ --param=NAME=VALUE ]\n\
iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\
iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
iscsiadm -m fw [ -l ]\n\
@@ -2430,9 +2432,11 @@ main(int argc, char **argv)
uint32_t host_no = -1;
struct user_param *param;
struct list_head params;
+ struct list_head user_params;
INIT_LIST_HEAD(&params);
INIT_LIST_HEAD(&ifaces);
+ INIT_LIST_HEAD(&user_params);
/* do not allow ctrl-c for now... */
memset(&sa_old, 0, sizeof(struct sigaction));
memset(&sa_new, 0, sizeof(struct sigaction));
@@ -2455,8 +2459,14 @@ main(int argc, char **argv)
case 0:
if (long_options[longindex].flag != 0)
break;
- if (!strcmp(long_options[longindex].name, "newroot"))
+ if (!strcmp(long_options[longindex].name, "newroot")) {
newroot = optarg;
+ break;
+ }
+ if (!strcmp(long_options[longindex].name, "param")) {
+ parse_param(&user_params, optarg);
+ break;
+ }
break;
case 'k':
killiscsid = atoi(optarg);
@@ -2748,6 +2758,8 @@ main(int argc, char **argv)
goto out;
}
+ apply_params(&user_params, rec);
+
rc = exec_node_op(op, do_login, do_logout, do_show,
do_rescan, do_stats, info_level, rec,
&params);
diff --git a/usr/iscsistart.c b/usr/iscsistart.c
index 6924d49..85be35b 100644
--- a/usr/iscsistart.c
+++ b/usr/iscsistart.c
@@ -50,6 +50,7 @@
#include "iscsid_req.h"
#include "iscsi_err.h"
#include "iface.h"
+#include "iscsi_param.h"
/* global config info */
/* initiator needs initiator name/alias */
@@ -131,99 +132,13 @@ static int stop_event_loop(void)
return rc;
}
-static int apply_params(struct node_rec *rec)
-{
- struct user_param *param;
- int rc;
-
- /* Must init this so we can check if user overrode them */
- rec->session.initial_login_retry_max = -1;
- rec->conn[0].timeo.noop_out_interval = -1;
- rec->conn[0].timeo.noop_out_timeout = -1;
-
- list_for_each_entry(param, &user_params, list) {
- /*
- * user may not have passed in all params that were set by
- * ibft/iscsi_boot, so clear out values that might conflict
- * with user overrides
- */
- if (!strcmp(param->name, IFACE_NETNAME)) {
- /* overriding netname so MAC will be for old netdev */
- memset(rec->iface.hwaddress, 0,
- sizeof(rec->iface.hwaddress));
- } else if (!strcmp(param->name, IFACE_HWADDR)) {
- /* overriding MAC so netdev will be for old MAC */
- memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
- } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
- /*
- * switching drivers so all old binding info is no
- * longer valid. Old values were either for offload
- * and we are switching to software or the reverse,
- * or switching types of cards (bnx2i to cxgb3i).
- */
- memset(&rec->iface, 0, sizeof(rec->iface));
- iface_setup_defaults(&rec->iface);
- }
- }
-
- rc = idbm_node_set_rec_from_param(&user_params, rec, 0);
- if (rc)
- return rc;
-
- /*
- * For root boot we could not change this in older versions so
- * if user did not override then use the defaults.
- *
- * Increase to account for boot using static setup.
- */
- if (rec->session.initial_login_retry_max == -1)
- rec->session.initial_login_retry_max = 30;
- /* we used to not be able to answer so turn off */
- if (rec->conn[0].timeo.noop_out_interval == -1)
- rec->conn[0].timeo.noop_out_interval = 0;
- if (rec->conn[0].timeo.noop_out_timeout == -1)
- rec->conn[0].timeo.noop_out_timeout = 0;
-
- return 0;
-}
-
-static int parse_param(char *param_str)
-{
- struct user_param *param;
- char *name, *value;
-
- name = param_str;
-
- value = strchr(param_str, '=');
- if (!value) {
- log_error("Invalid --param %s. Missing value.", param_str);
- return ISCSI_ERR_INVAL;
- }
- *value = '\0';
-
- value++;
- if (!strlen(value)) {
- log_error("Invalid --param %s. Missing value.", param_str);
- return ISCSI_ERR_INVAL;
- }
-
- param = idbm_alloc_user_param(name, value);
- if (!param) {
- log_error("Could not allocate memory for param.");
- return ISCSI_ERR_NOMEM;
- }
-
- list_add(&param->list, &user_params);
- return 0;
-}
-
static int login_session(struct node_rec *rec)
{
iscsiadm_req_t req;
iscsiadm_rsp_t rsp;
int rc, retries = 0;
- rc = apply_params(rec);
+ rc = apply_params(&user_params, rec);
if (rc)
return rc;
@@ -426,7 +341,7 @@ int main(int argc, char *argv[])
fw_free_targets(&targets);
exit(0);
case 'P':
- err = parse_param(optarg);
+ err = parse_param(&user_params, optarg);
if (err)
exit(err);
break;
--
1.7.11.7

View File

@ -1,6 +1,52 @@
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-bnx2i.diff/etc/iscsid.conf
--- open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/etc/iscsid.conf 2010-07-11 03:57:57.000000000 -0500
From c255c2cd43afeaefa428237a3200f02fb238d89e Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 19 Nov 2012 16:37:13 -0800
Subject: update initscripts and docs
---
README | 9 +++------
etc/iscsid.conf | 23 +++++++++++------------
usr/idbm.c | 4 ++++
3 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/README b/README
index ec22098..2a8319a 100644
--- a/README
+++ b/README
@@ -74,11 +74,6 @@ the cache sync command will fail.
- iscsiadm's -P 3 option will not print out scsi devices.
- iscsid will not automatically online devices.
-You need to enable "Cryptographic API" under "Cryptographic options" in the
-kernel config. And you must enable "CRC32c CRC algorithm" even if
-you do not use header or data digests. They are the kernel options,
-CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively.
-
By default the kernel's iSCSI modules will be used. Running:
make
@@ -997,7 +992,7 @@ Red Hat or Fedora:
-----------------
To start open-iscsi in Red Hat/Fedora you can do:
- service open-iscsi start
+ service iscsi start
To get open-iscsi to automatically start at run time you may have to
run:
@@ -1205,6 +1200,8 @@ iscsid will only perform rediscovery when it gets a SCN from the server.
# linux-isns (SLES's iSNS server) where it sometimes does not send SCN
# events in the proper format, so they may not get handled.
+To set the startup value, so that nodes are not logged into automatically
+use the value "manual".
Example:
--------
diff --git a/etc/iscsid.conf b/etc/iscsid.conf
index ef76dc0..ac1d231 100644
--- a/etc/iscsid.conf
+++ b/etc/iscsid.conf
@@ -17,10 +17,10 @@
# maintainers.
#
@ -23,9 +69,9 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-b
+# To manually startup the session set to "manual". The default is automatic.
+node.startup = automatic
# *************
@@ -255,29 +255,26 @@ node.conn[0].iscsi.MaxXmitDataSegmentLen
# For "automatic" startup nodes, setting this to "Yes" will try logins on each
# available iface until one succeeds, and then stop. The default "No" will try
@@ -259,28 +259,27 @@ node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
# To allow the targets to control the setting of the digest checking,
@ -34,71 +80,38 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-b
+# the following lines (Data digests are not supported.):
#node.conn[0].iscsi.HeaderDigest = CRC32C,None
-#node.conn[0].iscsi.DataDigest = CRC32C,None
+
#
# To allow the targets to control the setting of the digest checking,
# with the initiator requesting a preference of disabling the checking,
-# uncomment one or both of the following lines:
+# uncomment the following lines:
+# uncomment the following line:
#node.conn[0].iscsi.HeaderDigest = None,CRC32C
-#node.conn[0].iscsi.DataDigest = None,CRC32C
#
# To enable CRC32C digest checking for the header and/or data part of
-# iSCSI PDUs, uncomment one or both of the following lines:
+# iSCSI PDUs, uncomment the following lines:
+# iSCSI PDUs, uncomment the following line:
#node.conn[0].iscsi.HeaderDigest = CRC32C
-#node.conn[0].iscsi.DataDigest = CRC32C
#
# To disable digest checking for the header and/or data part of
-# iSCSI PDUs, uncomment one or both of the following lines:
+# iSCSI PDUs, uncomment the following lines:
+# iSCSI PDUs, uncomment the following line:
#node.conn[0].iscsi.HeaderDigest = None
-#node.conn[0].iscsi.DataDigest = None
#
# The default is to never use DataDigests or HeaderDigests.
#
-
+node.conn[0].iscsi.HeaderDigest = None
#************
# Workarounds
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff/README
--- open-iscsi-2.0-872-rc3-bnx2i/README 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/README 2010-07-11 03:57:57.000000000 -0500
@@ -74,11 +74,6 @@ the cache sync command will fail.
- iscsiadm's -P 3 option will not print out scsi devices.
- iscsid will not automatically online devices.
-You need to enable "Cryptographic API" under "Cryptographic options" in the
-kernel config. And you must enable "CRC32c CRC algorithm" even if
-you do not use header or data digests. They are the kernel options,
-CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively.
-
By default the kernel source found at
/lib/modules/`uname -a`/build
will be used to compile the open-iscsi modules. To specify a different
@@ -907,7 +902,7 @@ Red Hat or Fedora:
-----------------
To start open-iscsi in Red Hat/Fedora you can do:
- service open-iscsi start
+ service iscsi start
To get open-iscsi to automatically start at run time you may have to
run:
@@ -1115,6 +1110,8 @@ iscsid will only perform rediscovery whe
# linux-isns (SLES's iSNS server) where it sometimes does not send SCN
# events in the proper format, so they may not get handled.
+To set the startup value, so that nodes are not logged into automatically
+use the value "manual".
Example:
--------
Only in open-iscsi-2.0-872-rc3-bnx2i.diff/: README.orig
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c
--- open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c 2010-07-11 03:57:57.000000000 -0500
@@ -346,9 +346,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo
# For multipath configurations, you may want more than one session to be
# created on each iface record. If node.session.nr_sessions is greater
diff --git a/usr/idbm.c b/usr/idbm.c
index 4d30aa9..a1d7d37 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -399,9 +399,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
IDBM_SHOW, "None", "CRC32C", "CRC32C,None",
"None,CRC32C", num, 1);
sprintf(key, CONN_DATA_DIGEST, i);
@ -112,3 +125,6 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.
sprintf(key, CONN_IFMARKER, i);
__recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW,
"No", "Yes", num, 1);
--
1.7.11.7

View File

@ -1,65 +1,40 @@
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/doc/iscsiadm.8 open-iscsi-2.0-872-rc3-bnx2i.diff/doc/iscsiadm.8
--- open-iscsi-2.0-872-rc3-bnx2i/doc/iscsiadm.8 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/doc/iscsiadm.8 2010-07-11 04:00:35.000000000 -0500
@@ -51,7 +51,7 @@ display help text and exit
.TP
\fB\-I\fR, \fB\-\-interface\fI[iface]\fR
The interface argument specifies the iSCSI interface to use for the operation.
-iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware
+iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware
iSCSI (qla4xxx) the iface config must have the hardware address
(iface.hwaddress = port's MAC address)
and the driver/transport_name (iface.transport_name). The iface's name is
@@ -128,7 +128,7 @@ If no other options are specified: for \
of their respective records are displayed; for \fIsession\fR, all active
sessions and connections are displayed; for \fIfw\fR, all boot firmware
values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and
-for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed.
+for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed.
From aaf2b26eae472e5fd596f9bd23f9bf5886b1eb98 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 19 Nov 2012 16:38:45 -0800
Subject: use var for config
---
README | 33 ++++++++++++++++-----------------
doc/iscsiadm.8 | 8 ++++----
usr/idbm.c | 6 +++---
usr/idbm.h | 15 +++++++++------
usr/iface.h | 4 +++-
5 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/README b/README
index 2a8319a..e5ae2c1 100644
--- a/README
+++ b/README
@@ -156,8 +156,7 @@ Usage: iscsid [OPTION]
.TP
\fB\-n\fR, \fB\-\-name=\fIname\fR
@@ -336,10 +336,10 @@ The configuration file read by \fBiscsid
The file containing the iSCSI InitiatorName and InitiatorAlias read by
\fBiscsid\fR and \fBiscsiadm\fR on startup.
.TP
-/etc/iscsi/nodes/
+/var/lib/iscsi/nodes/
This directory contains the nodes with their targets.
.TP
-/etc/iscsi/send_targets
+/var/lib/iscsi/send_targets
This directory contains the portals.
Open-iSCSI persistent configuration is stored in a number of
directories under a configuration root directory, using a flat-file
-format. This configuration root directory is /etc/iscsi by default,
-but may also commonly be in /var/lib/iscsi.
+format. This configuration root directory is /var/lib/iscsi by default.
.SH "SEE ALSO"
Only in open-iscsi-2.0-872-rc3-bnx2i.diff/doc: iscsiadm.8.orig
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff/README
--- open-iscsi-2.0-872-rc3-bnx2i/README 2010-07-11 03:58:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/README 2010-07-11 03:59:00.000000000 -0500
@@ -144,10 +144,10 @@ available on all Linux installations.
Configuration is contained in directories for:
The database contains two tables:
-- Discovery table (/etc/iscsi/send_targets);
-- Node table (/etc/iscsi/nodes).
+- Discovery table (/var/lib/iscsi/send_targets);
+- Node table (/var/lib/iscsi/nodes).
-The regular place for iSCSI database files: /etc/iscsi/nodes
+The regular place for iSCSI database files: /var/lib/iscsi/nodes
The iscsiadm utility is a command-line tool to manage (update, delete,
insert, query) the persistent database.
@@ -420,7 +420,7 @@ a scsi_host per HBA port).
@@ -444,7 +443,7 @@ a scsi_host per HBA port).
To manage both types of initiator stacks, iscsiadm uses the interface (iface)
structure. For each HBA port or for software iscsi for each network
device (ethX) or NIC, that you wish to bind sessions to you must create
-a iface config /etc/iscsi/ifaces.
+a iface config /var/lib/iscsi/ifaces.
Running:
Prep:
@@ -428,29 +428,29 @@ Running:
@@ -478,29 +477,29 @@ Running:
iface0 qla4xxx,00:c0:dd:08:63:e8,20.15.0.7,default,iqn.2005-06.com.redhat:madmax
iface1 qla4xxx,00:c0:dd:08:63:ea,20.15.0.9,default,iqn.2005-06.com.redhat:madmax
@ -94,8 +69,8 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
iface.transport_name = tcp
iface.hwaddress = 00:C0:DD:08:63:E7
@@ -499,7 +499,7 @@ iser iser,<empty>,<empty>,<empty>,<empty
cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,<empty>,<empty>,<empty>
@@ -550,7 +549,7 @@ cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,<empty>,<empty>,<empty>
qla4xxx.00:0e:1e:04:8b:2e qla4xxx,00:0e:1e:04:8b:2e,<empty>,<empty>,<empty>
-Will report iface configurations that are setup in /etc/iscsi/ifaces.
@ -103,16 +78,7 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
The format is:
iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname
@@ -515,7 +515,7 @@ default one in /etc/iscsi/initiatorname.
-To display these values in a more friendly run:
+To display these values in a more friendly way run:
iscsiadm -m iface -I cxgb3i.00:07:43:05:97:07
# BEGIN RECORD 2.0-871
@@ -553,7 +553,7 @@ need a seperate network connection to th
@@ -636,7 +635,7 @@ need a seperate network connection to the target for discovery purposes.
*This will be fixed in the next version of open-iscsi*
For compatibility reasons, when you run iscsiadm to do discovery, it
@ -121,7 +87,7 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
tcp for the iface.transport and it will bind the portals that are discovered
so that they will be logged in through those ifaces. This behavior can also
be overriden by passing in the interfaces you want to use. For the case
@@ -571,7 +571,7 @@ we do not bind a session to a iface, the
@@ -654,7 +653,7 @@ we do not bind a session to a iface, then you can use the special iface
iscsiadm -m discoverydb -t st -p ip:port -I default --discover -P 1
@ -130,7 +96,7 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
not pass anything into iscsiadm, running iscsiadm will do the default
behavior, where we allow the network subsystem to decide which
device to use.
@@ -613,13 +613,13 @@ To now log into targets it is the same a
@@ -696,7 +695,7 @@ To now log into targets it is the same as with sofware iscsi. See section
./iscsiadm -m discoverydb -t st -p 192.168.1.1:3260 --discover
@ -139,14 +105,16 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
ID [portal = 192.168.1.1:3260 and type = sendtargets. If found it
will perform discovery using the settings stored in the record.
If a record does not exist, it will be created using the iscsid.conf
discovery settings.
@@ -705,7 +704,7 @@ To now log into targets it is the same as with sofware iscsi. See section
The argument to -p may also be a hostname instead of an address.
./iscsiadm -m discoverydb -t st -p smoehost --discover
- For the ifaces, iscsiadm will first search /etc/iscsi/ifaces for
+ For the ifaces, iscsiadm will first search /var/lib/iscsi/ifaces for
interfaces using software iscsi. If any are found then nodes found
during discovery will be setup so that they can logged in through
those interfaces. To specify a specific iface, pass the
@@ -675,7 +675,7 @@ To now log into targets it is the same a
@@ -761,7 +760,7 @@ To now log into targets it is the same as with sofware iscsi. See section
This command will perform discovery, but not manipulate the node DB.
- SendTargets iSCSI Discovery with a specific interface. If you
@ -155,7 +123,7 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
then you can pass them in during discovery:
./iscsiadm -m discoverydb -t sendtargets -p 192.168.1.1:3260 \
@@ -982,8 +982,8 @@ where targetname is the name of the targ
@@ -1072,8 +1071,8 @@ where targetname is the name of the target and ip_address:port is the address
and port of the portal. tpgt, is the portal group tag of
the portal, and is not used in iscsiadm commands except for static
record creation. And iface name is the name of the iscsi interface
@ -166,7 +134,7 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
Default here is iscsi_tcp/tcp to be used over which ever NIC the
network layer decides is best.
@@ -1098,7 +1098,7 @@ If set, iscsid will perform discovery to
@@ -1188,7 +1187,7 @@ If set, iscsid will perform discovery to the address every
discovery.isns.discoveryd_poll_inval or
discovery.sendtargets.discoveryd_poll_inval seconds,
and it will log into any portals found from the discovery source using
@ -175,11 +143,46 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff
Note that for iSNS the poll_interval does not have to be set. If not set,
iscsid will only perform rediscovery when it gets a SCN from the server.
Only in open-iscsi-2.0-872-rc3-bnx2i.diff/: README.orig
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c
--- open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c 2010-07-11 03:58:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c 2010-07-11 03:59:00.000000000 -0500
@@ -2235,9 +2235,9 @@ free_info:
diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8
index 7c209f6..e94cca0 100644
--- a/doc/iscsiadm.8
+++ b/doc/iscsiadm.8
@@ -89,7 +89,7 @@ This option is only valid for ping submode.
.TP
\fB\-I\fR, \fB\-\-interface=\fI[iface]\fR
The interface argument specifies the iSCSI interface to use for the operation.
-iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware
+iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware
iSCSI (qla4xxx) the iface config must have the hardware address
(iface.hwaddress = port's MAC address)
and the driver/transport_name (iface.transport_name). The iface's name is
@@ -166,7 +166,7 @@ If no other options are specified: for \fIdiscoverydb\fR and \fInode\fR, all
of their respective records are displayed; for \fIsession\fR, all active
sessions and connections are displayed; for \fIfw\fR, all boot firmware
values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and
-for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed.
+for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed.
.TP
\fB\-n\fR, \fB\-\-name=\fIname\fR
@@ -535,10 +535,10 @@ The configuration file read by \fBiscsid\fR and \fBiscsiadm\fR on startup.
The file containing the iSCSI InitiatorName and InitiatorAlias read by
\fBiscsid\fR and \fBiscsiadm\fR on startup.
.TP
-/etc/iscsi/nodes/
+/var/lib/iscsi/nodes/
This directory contains the nodes with their targets.
.TP
-/etc/iscsi/send_targets
+/var/lib/iscsi/send_targets
This directory contains the portals.
.SH "SEE ALSO"
diff --git a/usr/idbm.c b/usr/idbm.c
index a1d7d37..806d90e 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -2472,9 +2472,9 @@ free_info:
int idbm_init(idbm_get_config_file_fn *fn)
{
/* make sure root db dir is there */
@ -192,13 +195,13 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.
errno);
return errno;
}
Only in open-iscsi-2.0-872-rc3-bnx2i.diff/usr: idbm.c.orig
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.h open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.h
--- open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.h 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.h 2010-07-11 03:59:00.000000000 -0500
@@ -27,12 +27,15 @@
#include "initiator.h"
diff --git a/usr/idbm.h b/usr/idbm.h
index 245f046..5d81df7 100644
--- a/usr/idbm.h
+++ b/usr/idbm.h
@@ -28,12 +28,15 @@
#include "config.h"
#include "list.h"
-#define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes"
-#define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp"
@ -218,9 +221,10 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.h open-iscsi-2.0-872-rc3-bnx2i.
#define ST_CONFIG_NAME "st_config"
#define ISNS_CONFIG_NAME "isns_config"
diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/iface.h open-iscsi-2.0-872-rc3-bnx2i.diff/usr/iface.h
--- open-iscsi-2.0-872-rc3-bnx2i/usr/iface.h 2010-07-11 03:45:50.000000000 -0500
+++ open-iscsi-2.0-872-rc3-bnx2i.diff/usr/iface.h 2010-07-11 03:59:00.000000000 -0500
diff --git a/usr/iface.h b/usr/iface.h
index 01f7074..f396918 100644
--- a/usr/iface.h
+++ b/usr/iface.h
@@ -20,7 +20,9 @@
#ifndef ISCSI_IFACE_H
#define ISCSI_IFACE_H
@ -232,3 +236,6 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/iface.h open-iscsi-2.0-872-rc3-bnx2i
struct iface_rec;
struct list_head;
--
1.7.11.7

View File

@ -1,8 +1,52 @@
From ce1f29f2049320af18eeffd3aefccf840c442ce0 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 19 Nov 2012 16:43:15 -0800
Subject: add libiscsi
---
Makefile | 2 +
libiscsi/Makefile | 61 ++
libiscsi/libiscsi.c | 620 +++++++++++
libiscsi/libiscsi.doxy | 1473 +++++++++++++++++++++++++++
libiscsi/libiscsi.h | 344 +++++++
libiscsi/pylibiscsi.c | 638 ++++++++++++
libiscsi/setup.py | 9 +
libiscsi/tests/test_discovery_firmware.c | 53 +
libiscsi/tests/test_discovery_sendtargets.c | 60 ++
libiscsi/tests/test_get_auth.c | 70 ++
libiscsi/tests/test_get_initiator_name.c | 38 +
libiscsi/tests/test_get_network_config.c | 45 +
libiscsi/tests/test_login.c | 52 +
libiscsi/tests/test_logout.c | 51 +
libiscsi/tests/test_params.c | 103 ++
libiscsi/tests/test_set_auth.c | 58 ++
usr/Makefile | 2 +-
usr/discovery.c | 5 +
usr/idbm.c | 6 +-
usr/idbm.h | 3 +
usr/iscsi_ipc.h | 2 +
21 files changed, 3691 insertions(+), 4 deletions(-)
create mode 100644 libiscsi/Makefile
create mode 100644 libiscsi/libiscsi.c
create mode 100644 libiscsi/libiscsi.doxy
create mode 100644 libiscsi/libiscsi.h
create mode 100644 libiscsi/pylibiscsi.c
create mode 100644 libiscsi/setup.py
create mode 100644 libiscsi/tests/test_discovery_firmware.c
create mode 100644 libiscsi/tests/test_discovery_sendtargets.c
create mode 100644 libiscsi/tests/test_get_auth.c
create mode 100644 libiscsi/tests/test_get_initiator_name.c
create mode 100644 libiscsi/tests/test_get_network_config.c
create mode 100644 libiscsi/tests/test_login.c
create mode 100644 libiscsi/tests/test_logout.c
create mode 100644 libiscsi/tests/test_params.c
create mode 100644 libiscsi/tests/test_set_auth.c
diff --git a/Makefile b/Makefile
index db460eb..a4d4ce0 100644
index c5d9700..6dfbde3 100644
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,7 @@ user: ;
@@ -32,6 +32,7 @@ user: utils/open-isns/Makefile
$(MAKE) -C utils/fwparam_ibft
$(MAKE) -C usr
$(MAKE) -C utils
@ -10,7 +54,7 @@ index db460eb..a4d4ce0 100644
@echo
@echo "Compilation complete Output file"
@echo "----------------------------------- ----------------"
@@ -53,6 +54,7 @@ kernel: force
@@ -56,6 +57,7 @@ kernel: force
force: ;
clean:
@ -20,16 +64,16 @@ index db460eb..a4d4ce0 100644
$(MAKE) -C utils clean
diff --git a/libiscsi/Makefile b/libiscsi/Makefile
new file mode 100644
index 0000000..4aeb44f
index 0000000..317a7ec
--- /dev/null
+++ b/libiscsi/Makefile
@@ -0,0 +1,62 @@
@@ -0,0 +1,61 @@
+# This Makefile will work only with GNU make.
+
+OSNAME=$(shell uname -s)
+OPTFLAGS ?= -O2 -g
+WARNFLAGS ?= -Wall -Wstrict-prototypes
+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr -I../utils/open-isns \
+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \
+ -D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden
+LIB = libiscsi.so.0
+TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware
@ -39,7 +83,7 @@ index 0000000..4aeb44f
+
+COMMON_SRCS = sysdeps.o
+# sources shared between iscsid, iscsiadm and iscsistart
+ISCSI_LIB_SRCS = session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o
+ISCSI_LIB_SRCS = netlink.o transport.o cxgbi.o be2iscsi.o iscsi_timer.o initiator_common.o iscsi_err.o session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o iser.o uip_mgmt_ipc.o
+FW_PARAM_SRCS = fw_entry.o prom_lex.o prom_parse.tab.o fwparam_ppc.o fwparam_sysfs.o
+
+# sources shared with the userspace utils, note we build these separately
@ -69,14 +113,13 @@ index 0000000..4aeb44f
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o
+ $(CC) $(CFLAGS) -L../utils/open-isns -lisns -shared -Wl,-soname,$(LIB) $^ -o $@
+ $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@
+ ln -s -f $(LIB) libiscsi.so
+
+$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB)
+ $(CC) $(CFLAGS) -L../utils/open-isns -lisns -c $< -o $@
+
+html: libiscsi.h libiscsi.doxy
+ doxygen libiscsi.doxy
+html: libiscsi.h
+# doxygen libiscsi.doxy
+
+clean:
+ rm -rf *.o common-objs usr-objs fw-objs libuip-objs libiscsi.so* \
@ -88,10 +131,10 @@ index 0000000..4aeb44f
+-include .depend ../usr/.depend
diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c
new file mode 100644
index 0000000..a9eb0a6
index 0000000..2a176e8
--- /dev/null
+++ b/libiscsi/libiscsi.c
@@ -0,0 +1,563 @@
@@ -0,0 +1,620 @@
+/*
+ * iSCSI Administration library
+ *
@ -131,9 +174,13 @@ index 0000000..a9eb0a6
+#include "iscsi_proto.h"
+#include "fw_context.h"
+#include "iscsid_req.h"
+#include "iscsi_err.h"
+
+#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; }
+
+/* UGLY, not thread safe :( */
+static int sysfs_initialized = 0;
+
+struct libiscsi_context {
+ char error_str[256];
+ /* For get_parameter_helper() */
@ -160,7 +207,10 @@ index 0000000..a9eb0a6
+ return NULL;
+
+ log_init("libiscsi", 1024, libiscsi_log, context);
+ sysfs_init();
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
+ increase_max_files();
+ if (idbm_init(NULL)) {
+ sysfs_cleanup();
@ -181,6 +231,16 @@ index 0000000..a9eb0a6
+ free(context);
+}
+
+static void free_iface_list(struct list_head *ifaces)
+{
+ struct iface_rec *iface, *tmp_iface;
+
+ list_for_each_entry_safe(iface, tmp_iface, ifaces, list) {
+ list_del(&iface->list);
+ free(iface);
+ }
+}
+
+static void free_rec_list(struct list_head *rec_list)
+{
+ struct node_rec *rec, *tmp;
@ -264,6 +324,8 @@ index 0000000..a9eb0a6
+ strlcpy((*found_nodes)[found].address,
+ rec->conn[0].address, NI_MAXHOST);
+ (*found_nodes)[found].port = rec->conn[0].port;
+ strlcpy((*found_nodes)[found].iface,
+ rec->iface.name, LIBISCSI_VALUE_MAXLEN);
+ found++;
+ }
+ }
@ -276,69 +338,84 @@ index 0000000..a9eb0a6
+int libiscsi_discover_firmware(struct libiscsi_context *context,
+ int *nr_found, struct libiscsi_node **found_nodes)
+{
+ struct boot_context fw_entry;
+ struct node_rec rec;
+ struct list_head targets, ifaces, rec_list;
+ discovery_rec_t drec;
+ int rc = 0;
+
+ if (nr_found)
+ *nr_found = 0;
+ if (found_nodes)
+ *found_nodes = NULL;
+ INIT_LIST_HEAD(&targets);
+ INIT_LIST_HEAD(&ifaces);
+ INIT_LIST_HEAD(&rec_list);
+
+ memset(&fw_entry, 0, sizeof fw_entry);
+ rc = fw_get_entry(&fw_entry);
+ if (nr_found) {
+ *nr_found = 0;
+ }
+
+ if (found_nodes) {
+ *found_nodes = NULL;
+ }
+
+ rc = fw_get_targets(&targets);
+ if (rc) {
+ strcpy(context->error_str, "Could not read fw values.");
+ log_error("%s: Could not get list of targets from firmware "
+ "(err %d).\n", __func__, rc);
+ return rc;
+ }
+
+ memset(&rec, 0, sizeof rec);
+ idbm_node_setup_defaults(&rec);
+ CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets));
+
+ strlcpy(rec.name, fw_entry.targetname, TARGET_NAME_MAXLEN);
+ rec.tpgt = 1;
+ strlcpy(rec.conn[0].address, fw_entry.target_ipaddr, NI_MAXHOST);
+ rec.conn[0].port = fw_entry.target_port;
+ memset(&drec, 0, sizeof(drec));
+ drec.type = DISCOVERY_TYPE_FW;
+ rc = idbm_bind_ifaces_to_nodes(discovery_fw, &drec, &ifaces, &rec_list);
+ if (rc) {
+ log_error("%s: Could not determine target nodes from firmware "
+ "(err %d).\n", __func__, rc);
+ goto leave;
+ }
+
+ iface_setup_defaults(&rec.iface);
+ strncpy(rec.iface.iname, fw_entry.initiatorname,
+ sizeof(fw_entry.initiatorname));
+ strncpy(rec.session.auth.username, fw_entry.chap_name,
+ sizeof(fw_entry.chap_name));
+ strncpy((char *)rec.session.auth.password, fw_entry.chap_password,
+ sizeof(fw_entry.chap_password));
+ strncpy(rec.session.auth.username_in, fw_entry.chap_name_in,
+ sizeof(fw_entry.chap_name_in));
+ strncpy((char *)rec.session.auth.password_in,
+ fw_entry.chap_password_in,
+ sizeof(fw_entry.chap_password_in));
+ rec.session.auth.password_length =
+ strlen((char *)fw_entry.chap_password);
+ rec.session.auth.password_in_length =
+ strlen((char *)fw_entry.chap_password_in);
+ int node_count = 0;
+ struct list_head *pos;
+ list_for_each(pos, &rec_list) {
+ ++node_count;
+ }
+
+ CHECK(idbm_add_node(&rec, NULL, 1 /* overwrite */))
+ struct libiscsi_node* new_nodes;
+ /* allocate enough space for all the nodes */
+ new_nodes = calloc(node_count, sizeof *new_nodes);
+ if (new_nodes == NULL) {
+ rc = ENOMEM;
+ log_error("%s: %s.\n", __func__, strerror(ENOMEM));
+ goto leave;
+ }
+
+ if (nr_found)
+ *nr_found = 1;
+ struct node_rec *rec;
+ struct libiscsi_node *new_node = new_nodes;
+ /* in one loop, add nodes to idbm and create libiscsi_node entries */
+ list_for_each_entry(rec, &rec_list, list) {
+ CHECK(idbm_add_node(rec, NULL, 1 /* overwrite */));
+
+ strlcpy(new_node->name, rec->name, LIBISCSI_VALUE_MAXLEN);
+ new_node->tpgt = rec->tpgt;
+ strlcpy(new_node->address, rec->conn[0].address, NI_MAXHOST);
+ new_node->port = rec->conn[0].port;
+ strlcpy(new_node->iface, rec->iface.name, LIBISCSI_VALUE_MAXLEN);
+
+ ++new_node;
+ }
+
+ /* update output parameters */
+ if (nr_found) {
+ *nr_found = node_count;
+ }
+ if (found_nodes) {
+ *found_nodes = calloc(1, sizeof **found_nodes);
+ if (*found_nodes == NULL) {
+ snprintf(context->error_str,
+ sizeof(context->error_str), strerror(ENOMEM));
+ rc = ENOMEM;
+ goto leave;
+ }
+ strlcpy((*found_nodes)[0].name, rec.name,
+ LIBISCSI_VALUE_MAXLEN);
+ (*found_nodes)[0].tpgt = rec.tpgt;
+ strlcpy((*found_nodes)[0].address,
+ rec.conn[0].address, NI_MAXHOST);
+ (*found_nodes)[0].port = rec.conn[0].port;
+ *found_nodes = new_nodes;
+ }
+
+leave:
+ fw_free_targets(&targets);
+
+ free_iface_list(&ifaces);
+ free_rec_list(&rec_list);
+
+ return rc;
+}
+
@ -465,9 +542,14 @@ index 0000000..a9eb0a6
+
+int login_helper(void *data, node_rec_t *rec)
+{
+ char *iface = (char*)data;
+ if (strcmp(iface, rec->iface.name))
+ /* different iface, skip it */
+ return -1;
+
+ int rc = iscsid_req_by_rec(MGMT_IPC_SESSION_LOGIN, rec);
+ if (rc) {
+ iscsid_handle_error(rc);
+ iscsi_err_print_msg(rc);
+ rc = ENOTCONN;
+ }
+ return rc;
@ -478,7 +560,7 @@ index 0000000..a9eb0a6
+{
+ int nr_found = 0, rc;
+
+ CHECK(idbm_for_each_iface(&nr_found, NULL, login_helper,
+ CHECK(idbm_for_each_iface(&nr_found, (void*)node->iface, login_helper,
+ (char *)node->name, node->tpgt,
+ (char *)node->address, node->port))
+ if (nr_found == 0) {
@ -501,7 +583,7 @@ index 0000000..a9eb0a6
+
+ rc = iscsid_req_by_sid(MGMT_IPC_SESSION_LOGOUT, info->sid);
+ if (rc) {
+ iscsid_handle_error(rc);
+ iscsi_err_print_msg(rc);
+ rc = EIO;
+ }
+
@ -529,18 +611,26 @@ index 0000000..a9eb0a6
+ const char *parameter, const char *value)
+{
+ int nr_found = 0, rc;
+ struct db_set_param set_param = {
+ .name = (char *)parameter,
+ .value = (char *)value,
+ };
+ struct user_param *param;
+ struct list_head params;
+
+ CHECK(idbm_for_each_iface(&nr_found, &set_param, idbm_node_set_param,
+ INIT_LIST_HEAD(&params);
+ param = idbm_alloc_user_param(parameter, value);
+ if (!param) {
+ rc = ENOMEM;
+ goto leave;
+ }
+ list_add_tail(&params, &param->list);
+
+ CHECK(idbm_for_each_iface(&nr_found, &params, idbm_node_set_param,
+ (char *)node->name, node->tpgt,
+ (char *)node->address, node->port))
+ if (nr_found == 0) {
+ strcpy(context->error_str, "No such node");
+ rc = ENODEV;
+ }
+ free(param->name);
+ free(param);
+leave:
+ return rc;
+}
@ -623,6 +713,11 @@ index 0000000..a9eb0a6
+{
+ struct boot_context fw_entry;
+
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
+
+ memset(config, 0, sizeof *config);
+ memset(&fw_entry, 0, sizeof fw_entry);
+ if (fw_get_entry(&fw_entry))
@ -645,6 +740,11 @@ index 0000000..a9eb0a6
+{
+ struct boot_context fw_entry;
+
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
+
+ memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN);
+ memset(&fw_entry, 0, sizeof fw_entry);
+ if (fw_get_entry(&fw_entry))
@ -2136,10 +2236,10 @@ index 0000000..663770f
+SEARCHENGINE = NO
diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h
new file mode 100644
index 0000000..a7d05a5
index 0000000..756590e
--- /dev/null
+++ b/libiscsi/libiscsi.h
@@ -0,0 +1,343 @@
@@ -0,0 +1,344 @@
+/*
+ * iSCSI Administration library
+ *
@ -2210,6 +2310,7 @@ index 0000000..a7d05a5
+ get used anywhere, so we keep things simple and assume one connection */
+ char address[NI_MAXHOST] /** Portal hostname or IP-address. */;
+ int port /** Portal port number. */;
+ char iface[LIBISCSI_VALUE_MAXLEN] /** Interface to connect through. */;
+};
+
+/** \brief libiscsi CHAP authentication information struct
@ -2485,10 +2586,10 @@ index 0000000..a7d05a5
+#endif
diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c
new file mode 100644
index 0000000..454a26a
index 0000000..4b09aa7
--- /dev/null
+++ b/libiscsi/pylibiscsi.c
@@ -0,0 +1,624 @@
@@ -0,0 +1,638 @@
+/*
+ * iSCSI Administration library
+ *
@ -2689,25 +2790,27 @@ index 0000000..454a26a
+static int PyIscsiNode_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ PyIscsiNode *node = (PyIscsiNode *)self;
+ char *kwlist[] = {"name", "tpgt", "address", "port", NULL};
+ const char *name = NULL, *address = NULL;
+ char *kwlist[] = {"name", "tpgt", "address", "port", "iface", NULL};
+ const char *name = NULL, *address = NULL, *iface = NULL;
+ int tpgt = -1, port = 3260;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isi:node.__init__",
+ kwlist, &name, &tpgt, &address, &port))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isis:node.__init__",
+ kwlist, &name, &tpgt, &address,
+ &port, &iface))
+ return -1;
+ if (address == NULL) {
+ PyErr_SetString(PyExc_ValueError, "address not set");
+ return -1;
+ }
+ if (check_string(name) || check_string(address))
+ if (check_string(name) || check_string(address) || check_string(iface))
+ return -1;
+
+ strcpy(node->node.name, name);
+ node->node.tpgt = tpgt;
+ strcpy(node->node.address, address);
+ node->node.port = port;
+
+ strcpy(node->node.iface, iface);
+
+ return 0;
+}
+
@ -2724,6 +2827,8 @@ index 0000000..454a26a
+ return PyString_FromString(node->node.address);
+ } else if (!strcmp(attr, "port")) {
+ return PyInt_FromLong(node->node.port);
+ } else if (!strcmp(attr, "iface")) {
+ return PyString_FromString(node->node.iface);
+ }
+ return NULL;
+}
@ -2751,6 +2856,10 @@ index 0000000..454a26a
+ if (!PyArg_Parse(value, "i", &i))
+ return -1;
+ node->node.port = i;
+ } else if (!strcmp(attr, "iface")) {
+ if (!PyArg_Parse(value, "s", &str) || check_string(str))
+ return -1;
+ strcpy(node->node.iface, str);
+ }
+
+ return 0;
@ -2778,6 +2887,10 @@ index 0000000..454a26a
+ if (self->node.port > other->node.port)
+ return -1;
+
+ res = strcmp(self->node.iface, other->node.iface);
+ if (res)
+ return res;
+
+ return 0;
+}
+
@ -2931,6 +3044,8 @@ index 0000000..454a26a
+ "address", "address"},
+ {"port", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
+ "port", "port"},
+ {"iface", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
+ "iface", "iface"},
+ {NULL}
+};
+
@ -3712,8 +3827,21 @@ index 0000000..a21f888
+
+ return rc;
+}
diff --git a/usr/Makefile b/usr/Makefile
index 1506111..015f1b9 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -31,7 +31,7 @@ endif
OPTFLAGS ?= -O2 -g
WARNFLAGS ?= -Wall -Wstrict-prototypes
CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \
- -D$(OSNAME) $(IPC_CFLAGS)
+ -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE
PROGRAMS = iscsid iscsiadm iscsistart
# libc compat files
diff --git a/usr/discovery.c b/usr/discovery.c
index 381f825..2233de7 100644
index afce6c0..0c93749 100644
--- a/usr/discovery.c
+++ b/usr/discovery.c
@@ -36,6 +36,7 @@
@ -3724,14 +3852,76 @@ index 381f825..2233de7 100644
#include "log.h"
#include "idbm.h"
#include "iscsi_settings.h"
@@ -50,9 +51,11 @@
#include "iscsi_timer.h"
#include "iscsi_err.h"
/* libisns includes */
+#ifdef ISNS_ENABLE
#include "isns.h"
#include "paths.h"
#include "message.h"
+#endif
#ifdef SLP_ENABLE
#include "iscsi-slp-discovery.h"
@@ -98,6 +101,7 @@ static int request_initiator_name(void)
return 0;
}
+#ifdef ISNS_ENABLE
void discovery_isns_free_servername(void)
{
if (isns_config.ic_server_name)
@@ -377,6 +381,7 @@ retry:
discovery_isns_free_servername();
return rc;
}
+#endif
int discovery_fw(void *data, struct iface_rec *iface,
struct list_head *rec_list)
diff --git a/usr/idbm.c b/usr/idbm.c
index 806d90e..c20f7d9 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -1335,9 +1335,9 @@ int idbm_print_all_discovery(int info_level)
* fn should return -1 if it skipped the rec, a ISCSI_ERR error code if
* the operation failed or 0 if fn was run successfully.
*/
-static int idbm_for_each_iface(int *found, void *data,
- idbm_iface_op_fn *fn,
- char *targetname, int tpgt, char *ip, int port)
+int idbm_for_each_iface(int *found, void *data,
+ idbm_iface_op_fn *fn,
+ char *targetname, int tpgt, char *ip, int port)
{
DIR *iface_dirfd;
struct dirent *iface_dent;
diff --git a/usr/idbm.h b/usr/idbm.h
index 5d81df7..f645561 100644
--- a/usr/idbm.h
+++ b/usr/idbm.h
@@ -101,6 +101,9 @@ struct rec_op_data {
node_rec_t *match_rec;
idbm_iface_op_fn *fn;
};
+extern int idbm_for_each_iface(int *found, void *data,
+ idbm_iface_op_fn *fn,
+ char *targetname, int tpgt, char *ip, int port);
extern int idbm_for_each_portal(int *found, void *data,
idbm_portal_op_fn *fn, char *targetname);
extern int idbm_for_each_node(int *found, void *data,
diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h
index 74ef948..713914f 100644
index db5f1f0..e0bf051 100644
--- a/usr/iscsi_ipc.h
+++ b/usr/iscsi_ipc.h
@@ -111,4 +111,6 @@ struct iscsi_ipc {
int (*recv_pdu_end) (struct iscsi_conn *conn);
@@ -147,4 +147,6 @@ struct iscsi_ipc {
uint16_t chap_tbl_idx);
};
+struct iscsi_ipc *ipc;
+
#endif /* ISCSI_IPC_H */
--
1.7.11.7

View File

@ -0,0 +1,25 @@
From ff224a16d409c4b479b3ac1ff662093cb067e281 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 19 Nov 2012 17:04:29 -0800
Subject: dont use static
---
usr/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/usr/Makefile b/usr/Makefile
index 015f1b9..1669890 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -61,7 +61,7 @@ iscsiadm: $(ISCSI_LIB_SRCS) $(DISCOVERY_SRCS) iscsiadm.o session_mgmt.o
iscsistart: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \
iscsistart.o statics.o
- $(CC) $(CFLAGS) -static $^ -o $@
+ $(CC) $(CFLAGS) $^ -o $@
clean:
rm -f *.o $(PROGRAMS) .depend $(LIBSYS)
--
1.7.11.7

View File

@ -0,0 +1,45 @@
From aa58a042ec20575143c1a5c813c9552a286aeb0e Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 19 Nov 2012 17:09:24 -0800
Subject: remove the offload boot supported ifdef
---
usr/iface.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/usr/iface.c b/usr/iface.c
index c86892e..f5441c0 100644
--- a/usr/iface.c
+++ b/usr/iface.c
@@ -895,6 +895,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
{
struct iscsi_transport *t = NULL;
uint32_t hostno;
+ int rc;
if (strlen(context->initiatorname))
strlcpy(iface->iname, context->initiatorname,
@@ -907,10 +908,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
return 0;
}
} else if (strlen(context->iface)) {
-/* this ifdef is only temp until distros and firmwares are updated */
-#ifdef OFFLOAD_BOOT_SUPPORTED
char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
- int rc;
memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN);
/* make sure offload driver is loaded */
@@ -936,9 +934,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface,
}
strlcpy(iface->netdev, context->iface, sizeof(iface->netdev));
-#else
- return 0;
-#endif
} else
return 0;
--
1.7.11.7

View File

@ -0,0 +1,611 @@
From 59b5b828b2a763f47fb205aedf202990d64e748c Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 24 Dec 2012 13:37:53 -0800
Subject: iscsid iscsiuio ipc interface
---
include/iscsi_err.h | 2 +
usr/Makefile | 3 +-
usr/initiator.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++-
usr/initiator.h | 4 ++
usr/initiator_common.c | 34 +++++++++++++++
usr/iscsi_err.c | 1 +
usr/iscsid_req.c | 91 +++++++++++++++++++++++++++++++++++++--
usr/iscsid_req.h | 2 +
usr/transport.c | 2 +
usr/transport.h | 3 ++
usr/uip_mgmt_ipc.c | 41 ++++++++++++++++++
usr/uip_mgmt_ipc.h | 73 ++++++++++++++++++++++++++++++++
12 files changed, 364 insertions(+), 5 deletions(-)
create mode 100644 usr/uip_mgmt_ipc.c
create mode 100644 usr/uip_mgmt_ipc.h
diff --git a/include/iscsi_err.h b/include/iscsi_err.h
index aabea4e..1139133 100644
--- a/include/iscsi_err.h
+++ b/include/iscsi_err.h
@@ -62,6 +62,8 @@ enum {
ISCSI_ERR_OP_NOT_SUPP = 27,
/* device or resource in use */
ISCSI_ERR_BUSY = 28,
+ /* Operation failed, but retrying layer may succeed */
+ ISCSI_ERR_AGAIN = 29,
/* Always last. Indicates end of error code space */
ISCSI_MAX_ERR_VAL,
diff --git a/usr/Makefile b/usr/Makefile
index 1669890..5bf5f83 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -40,7 +40,8 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
- initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ) $(SYSDEPS_SRCS)
+ initiator_common.o iscsi_err.o iscsi_param.o uip_mgmt_ipc.o \
+ $(IPC_OBJ) $(SYSDEPS_SRCS)
# core initiator files
INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
diff --git a/usr/initiator.c b/usr/initiator.c
index d475358..597e0ff 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -45,6 +45,7 @@
#include "iscsi_sysfs.h"
#include "iscsi_settings.h"
#include "iface.h"
+#include "host.h"
#include "sysdeps.h"
#include "iscsi_err.h"
#include "kern_err_table.h"
@@ -557,6 +558,48 @@ static int iscsi_conn_connect(struct iscsi_conn *conn, queue_task_t *qtask)
return 0;
}
+static void iscsi_uio_poll_login_timedout(void *data)
+{
+ struct queue_task *qtask = data;
+ struct iscsi_conn *conn = qtask->conn;
+ iscsi_session_t *session = conn->session;
+
+ log_debug(3, "timeout waiting for UIO ...\n");
+ mgmt_ipc_write_rsp(qtask, ISCSI_ERR_TRANS_TIMEOUT);
+ conn_delete_timers(conn);
+ __session_destroy(session);
+}
+
+static int iscsi_sched_uio_poll(queue_task_t *qtask)
+{
+ struct iscsi_conn *conn = qtask->conn;
+ struct iscsi_session *session = conn->session;
+ struct iscsi_transport *t = session->t;
+ struct iscsi_ev_context *ev_context;
+
+ if (!t->template->set_net_config)
+ return 0;
+
+ ev_context = iscsi_ev_context_get(conn, 0);
+ if (!ev_context) {
+ /* while reopening the recv pool should be full */
+ log_error("BUG: __session_conn_reopen could "
+ "not get conn context for recv.");
+ return ENOMEM;
+ }
+
+ ev_context->data = qtask;
+ conn->state = ISCSI_CONN_STATE_XPT_WAIT;
+
+ iscsi_sched_ev_context(ev_context, conn, 0, EV_UIO_POLL);
+
+ log_debug(3, "Setting login UIO poll timer %p timeout %d",
+ &conn->login_timer, conn->login_timeout);
+ actor_timer(&conn->login_timer, conn->login_timeout * 1000,
+ iscsi_uio_poll_login_timedout, qtask);
+ return EAGAIN;
+}
+
static void
__session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
int redirected)
@@ -598,6 +641,11 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
if (!redirected)
session->reopen_cnt++;
+ /* uIP will needs to be re-triggered on the connection re-open */
+ if (iscsi_set_net_config(conn->session->t, conn->session,
+ &conn->session->nrec.iface) != 0)
+ goto queue_reopen;
+
if (iscsi_conn_connect(conn, qtask)) {
delay = ISCSI_CONN_ERR_REOPEN_DELAY;
goto queue_reopen;
@@ -1670,6 +1718,53 @@ failed_login:
}
+static void session_conn_uio_poll(void *data)
+{
+ struct iscsi_ev_context *ev_context = data;
+ iscsi_conn_t *conn = ev_context->conn;
+ struct iscsi_session *session = conn->session;
+ queue_task_t *qtask = ev_context->data;
+ int rc;
+
+ log_debug(4, "retrying uio poll");
+ rc = iscsi_set_net_config(session->t, session,
+ &conn->session->nrec.iface);
+ if (rc != 0) {
+ if (rc == ISCSI_ERR_AGAIN) {
+ ev_context->data = qtask;
+ iscsi_sched_ev_context(ev_context, conn, 2,
+ EV_UIO_POLL);
+ return;
+ } else {
+ log_error("session_conn_uio_poll() "
+ "connection failure [0x%x]", rc);
+ actor_delete(&conn->login_timer);
+ iscsi_login_eh(conn, qtask, ISCSI_ERR_INTERNAL);
+ iscsi_ev_context_put(ev_context);
+ return;
+ }
+ }
+
+ iscsi_ev_context_put(ev_context);
+ actor_delete(&conn->login_timer);
+ log_debug(4, "UIO ready trying connect");
+
+ /* uIP is ready try to connect */
+ if (gettimeofday(&conn->initial_connect_time, NULL))
+ log_error("Could not get initial connect time. If "
+ "login errors iscsid may give up the initial "
+ "login early. You should manually login.");
+
+ conn->state = ISCSI_CONN_STATE_XPT_WAIT;
+ if (iscsi_conn_connect(conn, qtask)) {
+ int delay = ISCSI_CONN_ERR_REOPEN_DELAY;
+
+ log_debug(4, "Waiting %u seconds before trying to reconnect.\n",
+ delay);
+ queue_delayed_reopen(qtask, delay);
+ }
+}
+
static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context,
struct iscsi_conn *conn, unsigned long tmo,
int event)
@@ -1711,6 +1806,11 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context,
ev_context);
actor_schedule(&ev_context->actor);
break;
+ case EV_UIO_POLL:
+ actor_new(&ev_context->actor, session_conn_uio_poll,
+ ev_context);
+ actor_schedule(&ev_context->actor);
+ break;
case EV_CONN_LOGOUT_TIMER:
actor_timer(&ev_context->actor, tmo * 1000,
iscsi_logout_timedout, ev_context);
@@ -1844,7 +1944,17 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask)
conn = &session->conn[0];
qtask->conn = conn;
- if (iscsi_host_set_net_params(&rec->iface, session)) {
+ rc = iscsi_host_set_net_params(&rec->iface, session);
+ if (rc == ISCSI_ERR_AGAIN) {
+ iscsi_sched_uio_poll(qtask);
+ /*
+ * Cannot block iscsid, so caller is going to internally
+ * retry the operation.
+ */
+ qtask->rsp.command = MGMT_IPC_SESSION_LOGIN;
+ qtask->rsp.err = ISCSI_SUCCESS;
+ return ISCSI_SUCCESS;
+ } else if (rc) {
__session_destroy(session);
return ISCSI_ERR_LOGIN;
}
@@ -2001,6 +2111,7 @@ iscsi_host_send_targets(queue_task_t *qtask, int host_no, int do_login,
struct sockaddr_storage *ss)
{
struct iscsi_transport *t;
+ int rc;
t = iscsi_sysfs_get_transport_by_hba(host_no);
if (!t) {
diff --git a/usr/initiator.h b/usr/initiator.h
index b45caab..d6dc02e 100644
--- a/usr/initiator.h
+++ b/usr/initiator.h
@@ -83,6 +83,7 @@ typedef enum iscsi_event_e {
EV_CONN_LOGOUT_TIMER,
EV_CONN_STOP,
EV_CONN_LOGIN,
+ EV_UIO_POLL,
} iscsi_event_e;
struct queue_task;
@@ -353,5 +354,8 @@ extern void iscsi_copy_operational_params(struct iscsi_conn *conn,
extern int iscsi_setup_authentication(struct iscsi_session *session,
struct iscsi_auth_config *auth_cfg);
extern int iscsi_setup_portal(struct iscsi_conn *conn, char *address, int port);
+extern int iscsi_set_net_config(struct iscsi_transport *t,
+ iscsi_session_t *session,
+ struct iface_rec *iface);
#endif /* INITIATOR_H */
diff --git a/usr/initiator_common.c b/usr/initiator_common.c
index ef6820c..eb72795 100644
--- a/usr/initiator_common.c
+++ b/usr/initiator_common.c
@@ -562,6 +562,36 @@ TODO handle this
return 0;
}
+int iscsi_set_net_config(struct iscsi_transport *t, iscsi_session_t *session,
+ struct iface_rec *iface)
+{
+ if (t->template->set_net_config) {
+ /* uip needs the netdev name */
+ struct host_info hinfo;
+ int hostno, rc;
+
+ /* this assumes that the netdev or hw address is going to be
+ set */
+ hostno = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc);
+ if (rc) {
+ log_debug(4, "Couldn't get host no.\n");
+ return rc;
+ }
+
+ /* uip needs the netdev name */
+ if (!strlen(iface->netdev)) {
+ memset(&hinfo, 0, sizeof(hinfo));
+ hinfo.host_no = hostno;
+ iscsi_sysfs_get_hostinfo_by_host_no(&hinfo);
+ strcpy(iface->netdev, hinfo.iface.netdev);
+ }
+
+ return t->template->set_net_config(t, iface, session);
+ }
+
+ return 0;
+}
+
int iscsi_host_set_net_params(struct iface_rec *iface,
struct iscsi_session *session)
{
@@ -600,6 +630,10 @@ int iscsi_host_set_net_params(struct iface_rec *iface,
log_warning("Could not brining up netdev %s. Try running "
"'ifup %s' first if login fails.", netdev, netdev);
+ rc = iscsi_set_net_config(t, session, iface);
+ if (rc != 0)
+ return rc;
+
rc = host_set_param(t, session->hostno,
ISCSI_HOST_PARAM_IPADDRESS,
iface->ipaddress, ISCSI_STRING);
diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c
index 4fe1c53..f9ba130 100644
--- a/usr/iscsi_err.c
+++ b/usr/iscsi_err.c
@@ -51,6 +51,7 @@ static char *iscsi_err_msgs[] = {
/* 26 */ "iSNS registration failed",
/* 27 */ "operation not supported",
/* 28 */ "device or resource in use",
+ /* 29 */ "Retryable failure",
};
char *iscsi_err_to_str(int err)
diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
index 1c4678d..a436194 100644
--- a/usr/iscsid_req.c
+++ b/usr/iscsid_req.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <fcntl.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -32,6 +33,7 @@
#include "iscsi_util.h"
#include "config.h"
#include "iscsi_err.h"
+#include "uip_mgmt_ipc.h"
static void iscsid_startup(void)
{
@@ -54,7 +56,7 @@ static void iscsid_startup(void)
#define MAXSLEEP 128
-static int iscsid_connect(int *fd, int start_iscsid)
+static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid)
{
int nsec, addr_len;
struct sockaddr_un addr;
@@ -65,11 +67,11 @@ static int iscsid_connect(int *fd, int start_iscsid)
return ISCSI_ERR_ISCSID_NOTCONN;
}
- addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1;
+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(unix_sock_name) + 1;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len);
+ memcpy((char *) &addr.sun_path + 1, unix_sock_name, addr_len);
/*
* Trying to connect with exponential backoff
@@ -98,6 +100,11 @@ static int iscsid_connect(int *fd, int start_iscsid)
return ISCSI_ERR_ISCSID_NOTCONN;
}
+static int iscsid_connect(int *fd, int start_iscsid)
+{
+ return ipc_connect(fd, ISCSIADM_NAMESPACE, start_iscsid);
+}
+
int iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid)
{
int err;
@@ -194,3 +201,81 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid)
return err;
return iscsid_req_wait(cmd, fd);
}
+
+static int uip_connect(int *fd)
+{
+ return ipc_connect(fd, ISCSID_UIP_NAMESPACE, 0);
+}
+
+int uip_broadcast(void *buf, size_t buf_len)
+{
+ int err;
+ int fd;
+ iscsid_uip_rsp_t rsp;
+ int flags;
+ int count;
+
+ err = uip_connect(&fd);
+ if (err) {
+ log_warning("uIP daemon is not up");
+ return err;
+ }
+
+ log_debug(3, "connected to uIP daemon");
+
+ /* Send the data to uIP */
+ if ((err = write(fd, buf, buf_len)) != buf_len) {
+ log_error("got write error (%d/%d), daemon died?",
+ err, errno);
+ close(fd);
+ return ISCSI_ERR_ISCSID_COMM_ERR;
+ }
+
+ log_debug(3, "send iface config to uIP daemon");
+
+ /* Set the socket to a non-blocking read, this way if there are
+ * problems waiting for uIP, iscsid can bailout early */
+ flags = fcntl(fd, F_GETFL, 0);
+ if (flags == -1)
+ flags = 0;
+ err = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ if(err != 0) {
+ log_error("could not set uip broadcast to non-blocking: %d",
+ errno);
+ close(fd);
+ return ISCSI_ERR;
+ }
+
+#define MAX_UIP_BROADCAST_READ_TRIES 3
+ for(count = 0; count < MAX_UIP_BROADCAST_READ_TRIES; count++) {
+ /* Wait for the response */
+ err = read(fd, &rsp, sizeof(rsp));
+ if (err == sizeof(rsp)) {
+ log_debug(3, "Broadcasted to uIP with length: %ld "
+ "cmd: 0x%x rsp: 0x%x\n", buf_len,
+ rsp.command, rsp.err);
+ err = 0;
+ break;
+ } else if((err == -1) && (errno == EAGAIN)) {
+ usleep(250000);
+ continue;
+ } else {
+ log_error("Could not read response (%d/%d), daemon died?",
+ err, errno);
+ err = ISCSI_ERR;
+ break;
+ }
+ }
+
+ if (count == MAX_UIP_BROADCAST_READ_TRIES) {
+ log_error("Could not broadcast to uIP after %d tries",
+ count);
+ err = ISCSI_ERR_AGAIN;
+ } else if (rsp.err != ISCISD_UIP_MGMT_IPC_DEVICE_UP) {
+ log_debug(3, "Device is not ready\n");
+ err = ISCSI_ERR_AGAIN;
+ }
+
+ close(fd);
+ return err;
+}
diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h
index 68f5256..4fff43d 100644
--- a/usr/iscsid_req.h
+++ b/usr/iscsid_req.h
@@ -33,4 +33,6 @@ extern int iscsid_req_by_rec(int cmd, struct node_rec *rec);
extern int iscsid_req_by_sid_async(int cmd, int sid, int *fd);
extern int iscsid_req_by_sid(int cmd, int sid);
+extern int uip_broadcast(void *buf, size_t buf_len);
+
#endif
diff --git a/usr/transport.c b/usr/transport.c
index e6e3dfc..10212af 100644
--- a/usr/transport.c
+++ b/usr/transport.c
@@ -35,6 +35,7 @@
#include "log.h"
#include "iscsi_util.h"
#include "iscsi_sysfs.h"
+#include "uip_mgmt_ipc.h"
#include "cxgbi.h"
#include "be2iscsi.h"
#include "iser.h"
@@ -79,6 +80,7 @@ struct iscsi_transport_template bnx2i = {
.ep_connect = ktransport_ep_connect,
.ep_poll = ktransport_ep_poll,
.ep_disconnect = ktransport_ep_disconnect,
+ .set_net_config = uip_broadcast_params,
};
struct iscsi_transport_template be2iscsi = {
diff --git a/usr/transport.h b/usr/transport.h
index 672561b..5dcf872 100644
--- a/usr/transport.h
+++ b/usr/transport.h
@@ -35,6 +35,9 @@ struct iscsi_transport_template {
int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms);
void (*ep_disconnect) (struct iscsi_conn *conn);
void (*create_conn) (struct iscsi_conn *conn);
+ int (*set_net_config) (struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session);
};
/* represents data path provider */
diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c
new file mode 100644
index 0000000..73b1632
--- /dev/null
+++ b/usr/uip_mgmt_ipc.c
@@ -0,0 +1,41 @@
+/*
+ * uIP iSCSI Daemon/Admin Management IPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * See the file COPYING included with this distribution for more details.
+ */
+
+#include <string.h>
+
+#include "log.h"
+#include "uip_mgmt_ipc.h"
+#include "iscsid_req.h"
+
+int uip_broadcast_params(struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session)
+{
+ struct iscsid_uip_broadcast broadcast;
+
+ log_debug(3, "broadcasting to uip\n");
+
+ memset(&broadcast, 0, sizeof(broadcast));
+
+ broadcast.header.command = ISCSID_UIP_IPC_GET_IFACE;
+ broadcast.header.payload_len = sizeof(*iface);
+
+ memcpy(&broadcast.u.iface_rec, iface, sizeof(*iface));
+
+ return uip_broadcast(&broadcast,
+ sizeof(iscsid_uip_broadcast_header_t) +
+ sizeof(*iface));
+}
diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h
new file mode 100644
index 0000000..3859688
--- /dev/null
+++ b/usr/uip_mgmt_ipc.h
@@ -0,0 +1,73 @@
+/*
+ * uIP iSCSI Daemon/Admin Management IPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * See the file COPYING included with this distribution for more details.
+ */
+#ifndef UIP_MGMT_IPC_H
+#define UIP_MGMT_IPC_H
+
+#include "types.h"
+#include "iscsi_if.h"
+#include "config.h"
+#include "mgmt_ipc.h"
+
+#include "initiator.h"
+#include "transport.h"
+
+#define ISCSID_UIP_NAMESPACE "ISCSID_UIP_ABSTRACT_NAMESPACE"
+
+typedef enum iscsid_uip_cmd {
+ ISCSID_UIP_IPC_UNKNOWN = 0,
+ ISCSID_UIP_IPC_GET_IFACE = 1,
+
+ __ISCSID_UIP_IPC_MAX_COMMAND
+} iscsid_uip_cmd_e;
+
+typedef struct iscsid_uip_broadcast_header {
+ iscsid_uip_cmd_e command;
+ uint32_t payload_len;
+} iscsid_uip_broadcast_header_t;
+
+/* IPC Request */
+typedef struct iscsid_uip_broadcast {
+ struct iscsid_uip_broadcast_header header;
+
+ union {
+ /* messages */
+ struct ipc_broadcast_iface_rec {
+ struct iface_rec rec;
+ } iface_rec;
+ } u;
+} iscsid_uip_broadcast_t;
+
+typedef enum iscsid_uip_mgmt_ipc_err {
+ ISCSID_UIP_MGMT_IPC_OK = 0,
+ ISCISD_UIP_MGMT_IPC_ERR = 1,
+ ISCISD_UIP_MGMT_IPC_ERR_NOT_FOUND = 2,
+ ISCISD_UIP_MGMT_IPC_ERR_NOMEM = 3,
+ ISCISD_UIP_MGMT_IPC_DEVICE_UP = 4,
+ ISCISD_UIP_MGMT_IPC_DEVICE_INITIALIZING = 5,
+} iscsid_uip_mgmt_ipc_err_e;
+
+/* IPC Response */
+typedef struct iscsid_uip_mgmt_rsp {
+ iscsid_uip_cmd_e command;
+ iscsid_uip_mgmt_ipc_err_e err;
+} iscsid_uip_rsp_t;
+
+extern int uip_broadcast_params(struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session);
+
+
+#endif /* UIP_MGMT_IPC_H */
--
1.7.11.7

View File

@ -0,0 +1,122 @@
From e74f511ba862195d909bba90091fd84bd7904914 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Wed, 2 Jan 2013 14:45:05 -0800
Subject: iscsiuio IPC newroot command
---
usr/mgmt_ipc.c | 11 +++++++++++
usr/transport.c | 1 +
usr/transport.h | 1 +
usr/uip_mgmt_ipc.c | 14 ++++++++++++++
usr/uip_mgmt_ipc.h | 5 +++++
5 files changed, 32 insertions(+)
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c
index 5cb7143..a8f8473 100644
--- a/usr/mgmt_ipc.c
+++ b/usr/mgmt_ipc.c
@@ -36,6 +36,7 @@
#include "sysdeps.h"
#include "iscsi_ipc.h"
#include "iscsi_err.h"
+#include "iscsi_sysfs.h"
#define PEERUSER_MAX 64
#define EXTMSG_MAX (64 * 1024)
@@ -229,8 +230,18 @@ static int
mgmt_ipc_newroot(queue_task_t *qtask)
{
char *newroot = qtask->req.u.newroot.path;
+ struct iscsi_transport *t;
+
if (chdir(newroot) || chroot(".") || chdir("/"))
return ISCSI_ERR;
+
+ /* if a registered transport has a separate userspace process,
+ * notify it of the root change as well */
+ list_for_each_entry(t, &transports, list) {
+ if (t->template->newroot)
+ t->template->newroot(t, newroot);
+ }
+
mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS);
return ISCSI_SUCCESS;
}
diff --git a/usr/transport.c b/usr/transport.c
index 10212af..02ad717 100644
--- a/usr/transport.c
+++ b/usr/transport.c
@@ -81,6 +81,7 @@ struct iscsi_transport_template bnx2i = {
.ep_poll = ktransport_ep_poll,
.ep_disconnect = ktransport_ep_disconnect,
.set_net_config = uip_broadcast_params,
+ .newroot = uip_broadcast_newroot,
};
struct iscsi_transport_template be2iscsi = {
diff --git a/usr/transport.h b/usr/transport.h
index 5dcf872..eb3a946 100644
--- a/usr/transport.h
+++ b/usr/transport.h
@@ -38,6 +38,7 @@ struct iscsi_transport_template {
int (*set_net_config) (struct iscsi_transport *t,
struct iface_rec *iface,
struct iscsi_session *session);
+ void (*newroot) (struct iscsi_transport *t, char *path);
};
/* represents data path provider */
diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c
index 73b1632..9fa5398 100644
--- a/usr/uip_mgmt_ipc.c
+++ b/usr/uip_mgmt_ipc.c
@@ -39,3 +39,17 @@ int uip_broadcast_params(struct iscsi_transport *t,
sizeof(iscsid_uip_broadcast_header_t) +
sizeof(*iface));
}
+
+int uip_broadcast_newroot(struct iscsi_transport *t, char *newroot)
+{
+ struct iscsid_uip_broadcast broadcast;
+
+ memset(&broadcast, 0, sizeof(broadcast));
+
+ broadcast.header.command = ISCSID_UIP_NEWROOT;
+ strncpy(broadcast.u.newroot.path, newroot, PATH_MAX);
+
+ return uip_broadcast(&broadcast,
+ sizeof(iscsid_uip_broadcast_header_t) +
+ PATH_MAX + 1);
+}
diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h
index 3859688..9de88c2 100644
--- a/usr/uip_mgmt_ipc.h
+++ b/usr/uip_mgmt_ipc.h
@@ -29,6 +29,7 @@
typedef enum iscsid_uip_cmd {
ISCSID_UIP_IPC_UNKNOWN = 0,
ISCSID_UIP_IPC_GET_IFACE = 1,
+ ISCSID_UIP_NEWROOT = 2,
__ISCSID_UIP_IPC_MAX_COMMAND
} iscsid_uip_cmd_e;
@@ -47,6 +48,9 @@ typedef struct iscsid_uip_broadcast {
struct ipc_broadcast_iface_rec {
struct iface_rec rec;
} iface_rec;
+ struct ipc_broadcast_newroot {
+ char path[PATH_MAX + 1];
+ } newroot;
} u;
} iscsid_uip_broadcast_t;
@@ -69,5 +73,6 @@ extern int uip_broadcast_params(struct iscsi_transport *t,
struct iface_rec *iface,
struct iscsi_session *session);
+extern int uip_broadcast_newroot(struct iscsi_transport *t, char *path);
#endif /* UIP_MGMT_IPC_H */
--
1.7.11.7

View File

@ -0,0 +1,25 @@
From c3d2b8f3de5b6161845304cf46982d2c5a9918b6 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Tue, 22 Jan 2013 15:04:14 -0800
Subject: use systemctl to start iscsid
---
etc/iscsid.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/etc/iscsid.conf b/etc/iscsid.conf
index ac1d231..5851fa5 100644
--- a/etc/iscsid.conf
+++ b/etc/iscsid.conf
@@ -17,7 +17,7 @@
# maintainers.
#
# Default for Fedora and RHEL. (uncomment to activate).
-iscsid.startup = /etc/rc.d/init.d/iscsid force-start
+iscsid.startup = /bin/systemctl start iscsid.service
#
# Default for upstream open-iscsi scripts (uncomment to activate).
# iscsid.startup = /sbin/iscsid
--
1.7.11.7

View File

@ -0,0 +1,39 @@
From bc4cf1487b4d6039de2a082c1786ac83ab148c88 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Tue, 22 Jan 2013 15:14:21 -0800
Subject: resolve 565245: multilib issues caused by doxygen
---
libiscsi/libiscsi.doxy | 2 +-
libiscsi/no_date_footer.html | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 libiscsi/no_date_footer.html
diff --git a/libiscsi/libiscsi.doxy b/libiscsi/libiscsi.doxy
index 663770f..7a5ff7f 100644
--- a/libiscsi/libiscsi.doxy
+++ b/libiscsi/libiscsi.doxy
@@ -765,7 +765,7 @@ HTML_HEADER =
# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
-HTML_FOOTER =
+HTML_FOOTER = no_date_footer.html
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
# style sheet that is used by each HTML page. It can be used to
diff --git a/libiscsi/no_date_footer.html b/libiscsi/no_date_footer.html
new file mode 100644
index 0000000..1e0c6c4
--- /dev/null
+++ b/libiscsi/no_date_footer.html
@@ -0,0 +1,6 @@
+<hr size="1"><address style="text-align: right;"><small>
+Generated for $projectname by <a href="http://www.doxygen.org/
+index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a>
+$doxygenversion</small></address>
+</body>
+</html>
--
1.7.11.7

View File

@ -1,74 +0,0 @@
diff --git a/libiscsi/Makefile b/libiscsi/Makefile
index 4aeb44f..a91d6b8 100644
--- a/libiscsi/Makefile
+++ b/libiscsi/Makefile
@@ -3,7 +3,7 @@
OSNAME=$(shell uname -s)
OPTFLAGS ?= -O2 -g
WARNFLAGS ?= -Wall -Wstrict-prototypes
-CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr -I../utils/open-isns \
+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \
-D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden
LIB = libiscsi.so.0
TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware
@@ -43,11 +43,10 @@ fw-objs/%.o: ../utils/fwparam_ibft/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o
- $(CC) $(CFLAGS) -L../utils/open-isns -lisns -shared -Wl,-soname,$(LIB) $^ -o $@
+ $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@
ln -s -f $(LIB) libiscsi.so
$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB)
- $(CC) $(CFLAGS) -L../utils/open-isns -lisns -c $< -o $@
html: libiscsi.h libiscsi.doxy
doxygen libiscsi.doxy
diff --git a/usr/Makefile b/usr/Makefile
index 8e505bf..13a60f9 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -31,7 +31,7 @@ endif
OPTFLAGS ?= -O2 -g
WARNFLAGS ?= -Wall -Wstrict-prototypes
CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \
- -D$(OSNAME) $(IPC_CFLAGS)
+ -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE
PROGRAMS = iscsid iscsiadm iscsistart
# libc compat files
diff --git a/usr/discovery.c b/usr/discovery.c
index 2233de7..02c6f25 100644
--- a/usr/discovery.c
+++ b/usr/discovery.c
@@ -45,9 +45,11 @@
#include "iscsid_req.h"
#include "iscsi_util.h"
/* libisns includes */
+#ifdef ISNS_ENABLE
#include "isns.h"
#include "paths.h"
#include "message.h"
+#endif
#ifdef SLP_ENABLE
#include "iscsi-slp-discovery.h"
@@ -94,6 +96,7 @@ static int request_initiator_name(void)
return 0;
}
+#ifdef ISNS_ENABLE
void discovery_isns_free_servername(void)
{
if (isns_config.ic_server_name)
@@ -367,6 +370,7 @@ retry:
discovery_isns_free_servername();
return rc;
}
+#endif
int discovery_fw(void *data, struct iface_rec *iface,
struct list_head *rec_list)
--
1.6.6.1

View File

@ -1,12 +0,0 @@
diff -aup open-iscsi-2.0-872-rc1-bnx2i/usr/Makefile open-iscsi-2.0-872-rc1-bnx2i.work/usr/Makefile
--- open-iscsi-2.0-872-rc1-bnx2i/usr/Makefile 2010-06-18 18:04:51.000000000 -0500
+++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/Makefile 2010-06-18 18:13:33.000000000 -0500
@@ -60,7 +60,7 @@ iscsiadm: $(ISCSI_LIB_SRCS) $(DISCOVERY_
iscsistart: $(IPC_OBJ) $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \
iscsistart.o statics.o
- $(CC) $(CFLAGS) -static $^ -o $@
+ $(CC) $(CFLAGS) $^ -o $@
clean:
rm -f *.o $(PROGRAMS) .depend $(LIBSYS)

View File

@ -1,49 +0,0 @@
diff -aurp open-iscsi-2.0-872-rc1-bnx2i/libiscsi/libiscsi.c open-iscsi-2.0-872-rc1-bnx2i.work/libiscsi/libiscsi.c
--- open-iscsi-2.0-872-rc1-bnx2i/libiscsi/libiscsi.c 2010-05-18 17:57:59.000000000 -0500
+++ open-iscsi-2.0-872-rc1-bnx2i.work/libiscsi/libiscsi.c 2010-05-18 17:58:43.000000000 -0500
@@ -40,6 +40,9 @@
#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; }
+/* UGLY, not thread safe :( */
+static int sysfs_initialized = 0;
+
struct libiscsi_context {
char error_str[256];
/* For get_parameter_helper() */
@@ -66,7 +69,10 @@ struct libiscsi_context *libiscsi_init(v
return NULL;
log_init("libiscsi", 1024, libiscsi_log, context);
- sysfs_init();
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
increase_max_files();
if (idbm_init(NULL)) {
sysfs_cleanup();
@@ -529,6 +535,11 @@ int libiscsi_get_firmware_network_config
{
struct boot_context fw_entry;
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
+
memset(config, 0, sizeof *config);
memset(&fw_entry, 0, sizeof fw_entry);
if (fw_get_entry(&fw_entry))
@@ -551,6 +562,11 @@ int libiscsi_get_firmware_initiator_name
{
struct boot_context fw_entry;
+ if (!sysfs_initialized) {
+ sysfs_init();
+ sysfs_initialized = 1;
+ }
+
memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN);
memset(&fw_entry, 0, sizeof fw_entry);
if (fw_get_entry(&fw_entry))

View File

@ -1,16 +0,0 @@
diff -up open-iscsi-2.0-870-rc1/usr/iscsiadm.c.error open-iscsi-2.0-870-rc1/usr/iscsiadm.c
--- open-iscsi-2.0-870-rc1/usr/iscsiadm.c.error 2008-09-30 10:20:15.000000000 +0200
+++ open-iscsi-2.0-870-rc1/usr/iscsiadm.c 2008-09-30 10:20:15.000000000 +0200
@@ -2141,6 +2141,12 @@ main(int argc, char **argv)
if (mode < 0)
usage(0);
+ if (getuid()) {
+ log_error("Must be run as root.");
+ rc = -1;
+ goto free_ifaces;
+ }
+
if (mode == MODE_FW) {
if ((rc = verify_mode_params(argc, argv, "ml", 0))) {
log_error("fw mode: option '-%c' is not "

View File

@ -1,385 +0,0 @@
diff --git a/usr/Makefile b/usr/Makefile
index e9d6bd1..8e505bf 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -42,7 +42,7 @@ ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o login.o log.o md5.o sha1.o iface.o \
iscsid_req.o $(SYSDEPS_SRCS)
# core initiator files
INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o \
- transport.o cxgb3i.o be2iscsi.o
+ transport.o cxgb3i.o be2iscsi.o uip_mgmt_ipc.o
# fw boot files
FW_BOOT_SRCS = $(wildcard ../utils/fwparam_ibft/*.o)
diff --git a/usr/initiator.c b/usr/initiator.c
index 1c9d8b6..8f7a383 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -45,6 +45,7 @@
#include "iscsi_sysfs.h"
#include "iscsi_settings.h"
#include "iface.h"
+#include "host.h"
#include "sysdeps.h"
#define ISCSI_CONN_ERR_REOPEN_DELAY 3
@@ -743,6 +744,38 @@ static int iscsi_conn_connect(struct iscsi_conn *conn, queue_task_t *qtask)
return 0;
}
+static int __set_net_config(struct iscsi_transport *t,
+ iscsi_session_t *session,
+ struct iface_rec *iface)
+{
+ if (t->template->set_net_config) {
+ /* uip needs the netdev name */
+ struct host_info hinfo;
+ int hostno, rc;
+
+ /* this assumes that the netdev or hw address is going to be
+ set */
+ hostno = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc);
+ if (rc) {
+ log_debug(4, "Couldn't get host no.\n");
+ return rc;
+ }
+
+ /* uip needs the netdev name */
+ if (!strlen(iface->netdev)) {
+ memset(&hinfo, 0, sizeof(hinfo));
+ hinfo.host_no = hostno;
+ iscsi_sysfs_get_hostinfo_by_host_no(&hinfo);
+ strcpy(iface->netdev, hinfo.iface.netdev);
+ }
+
+ return t->template->set_net_config(t, iface, session);
+ }
+
+ return 0;
+}
+
+
static void
__session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
int redirected)
@@ -784,6 +817,11 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop,
if (!redirected)
session->reopen_cnt++;
+ /* uIP will needs to be re-triggered on the connection re-open */
+ if (__set_net_config(conn->session->t, conn->session,
+ &conn->session->nrec.iface) != 0)
+ goto queue_reopen;
+
if (iscsi_conn_connect(conn, qtask)) {
delay = ISCSI_CONN_ERR_REOPEN_DELAY;
goto queue_reopen;
@@ -2130,6 +2168,10 @@ static int iface_set_param(struct iscsi_transport *t, struct iface_rec *iface,
return EINVAL;
}
+ rc = __set_net_config(t, session, iface);
+ if (rc != 0)
+ return rc;
+
rc = __iscsi_host_set_param(t, session->hostno,
ISCSI_HOST_PARAM_IPADDRESS,
iface->ipaddress, ISCSI_STRING);
diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c
index 5280a0a..6eb8b1d 100644
--- a/usr/iscsid_req.c
+++ b/usr/iscsid_req.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <fcntl.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -31,6 +32,7 @@
#include "mgmt_ipc.h"
#include "iscsi_util.h"
#include "config.h"
+#include "uip_mgmt_ipc.h"
static void iscsid_startup(void)
{
@@ -51,7 +53,8 @@ static void iscsid_startup(void)
#define MAXSLEEP 128
-static mgmt_ipc_err_e iscsid_connect(int *fd, int start_iscsid)
+static mgmt_ipc_err_e ipc_connect(int *fd, char *unix_sock_name,
+ int start_iscsid)
{
int nsec;
struct sockaddr_un addr;
@@ -64,8 +67,8 @@ static mgmt_ipc_err_e iscsid_connect(int *fd, int start_iscsid)
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
- strlen(ISCSIADM_NAMESPACE));
+ memcpy((char *) &addr.sun_path + 1, unix_sock_name,
+ strlen(unix_sock_name));
/*
* Trying to connect with exponential backoff
*/
@@ -93,6 +96,11 @@ static mgmt_ipc_err_e iscsid_connect(int *fd, int start_iscsid)
return MGMT_IPC_ERR_ISCSID_NOTCONN;
}
+static mgmt_ipc_err_e iscsid_connect(int *fd, int start_iscsid)
+{
+ return ipc_connect(fd, ISCSIADM_NAMESPACE, start_iscsid);
+}
+
mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid)
{
int err;
@@ -190,6 +198,72 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid)
return iscsid_req_wait(cmd, fd);
}
+static mgmt_ipc_err_e uip_connect(int *fd)
+{
+ return ipc_connect(fd, ISCSID_UIP_NAMESPACE, 0);
+}
+
+int uip_broadcast(void *buf, size_t buf_len)
+{
+ int err;
+ int fd;
+ iscsid_uip_rsp_t rsp;
+ int flags;
+ int count;
+
+ err = uip_connect(&fd);
+ if (err) {
+ log_warning("uIP daemon is not up");
+ return err;
+ }
+
+ /* Send the data to uIP */
+ if ((err = write(fd, buf, buf_len)) != buf_len) {
+ log_error("got write error (%d/%d), daemon died?",
+ err, errno);
+ close(fd);
+ return -EIO;
+ }
+
+ /* Set the socket to a non-blocking read, this way if there are
+ * problems waiting for uIP, iscsid can bailout early */
+ flags = fcntl(fd, F_GETFL, 0);
+ if (flags == -1)
+ flags = 0;
+ err = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ if(err != 0) {
+ log_error("could not set uip broadcast to non-blocking: %d",
+ errno);
+ close(fd);
+ return -EIO;
+ }
+
+#define MAX_UIP_BROADCAST_READ_TRIES 3
+ for(count = 0; count < MAX_UIP_BROADCAST_READ_TRIES; count++) {
+ /* Wait for the response */
+ err = read(fd, &rsp, sizeof(rsp));
+ if (err == sizeof(rsp)) {
+ log_debug(3, "Broadcasted to uIP with length: %ld\n",
+ buf_len);
+ break;
+ } else if((err == -1) && (errno == EAGAIN)) {
+ usleep(250000);
+ continue;
+ } else {
+ log_error("Could not read response (%d/%d), daemon died?",
+ err, errno);
+ break;
+ }
+ }
+
+ if(count == MAX_UIP_BROADCAST_READ_TRIES)
+ log_error("Could not broadcast to uIP");
+
+ close(fd);
+
+ return 0;
+}
+
void iscsid_handle_error(mgmt_ipc_err_e err)
{
static char *err_msgs[] = {
diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h
index 3bba2f4..e2cf1c3 100644
--- a/usr/iscsid_req.h
+++ b/usr/iscsid_req.h
@@ -34,4 +34,6 @@ extern int iscsid_req_by_rec(int cmd, struct node_rec *rec);
extern int iscsid_req_by_sid_async(int cmd, int sid, int *fd);
extern int iscsid_req_by_sid(int cmd, int sid);
+extern int uip_broadcast(void *buf, size_t buf_len);
+
#endif
diff --git a/usr/transport.c b/usr/transport.c
index c0789bb..aa0395c 100644
--- a/usr/transport.c
+++ b/usr/transport.c
@@ -25,6 +25,7 @@
#include "log.h"
#include "iscsi_util.h"
#include "iscsi_sysfs.h"
+#include "uip_mgmt_ipc.h"
#include "cxgb3i.h"
#include "be2iscsi.h"
@@ -58,6 +59,7 @@ struct iscsi_transport_template bnx2i = {
.ep_connect = ktransport_ep_connect,
.ep_poll = ktransport_ep_poll,
.ep_disconnect = ktransport_ep_disconnect,
+ .set_net_config = uip_broadcast_params,
};
struct iscsi_transport_template be2iscsi = {
diff --git a/usr/transport.h b/usr/transport.h
index 5ceedb3..2ec903c 100644
--- a/usr/transport.h
+++ b/usr/transport.h
@@ -35,6 +35,9 @@ struct iscsi_transport_template {
int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms);
void (*ep_disconnect) (struct iscsi_conn *conn);
void (*create_conn) (struct iscsi_conn *conn);
+ int (*set_net_config) (struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session);
};
/* represents data path provider */
diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c
new file mode 100644
index 0000000..73b1632
--- /dev/null
+++ b/usr/uip_mgmt_ipc.c
@@ -0,0 +1,41 @@
+/*
+ * uIP iSCSI Daemon/Admin Management IPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * See the file COPYING included with this distribution for more details.
+ */
+
+#include <string.h>
+
+#include "log.h"
+#include "uip_mgmt_ipc.h"
+#include "iscsid_req.h"
+
+int uip_broadcast_params(struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session)
+{
+ struct iscsid_uip_broadcast broadcast;
+
+ log_debug(3, "broadcasting to uip\n");
+
+ memset(&broadcast, 0, sizeof(broadcast));
+
+ broadcast.header.command = ISCSID_UIP_IPC_GET_IFACE;
+ broadcast.header.payload_len = sizeof(*iface);
+
+ memcpy(&broadcast.u.iface_rec, iface, sizeof(*iface));
+
+ return uip_broadcast(&broadcast,
+ sizeof(iscsid_uip_broadcast_header_t) +
+ sizeof(*iface));
+}
diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h
new file mode 100644
index 0000000..dd49c0b
--- /dev/null
+++ b/usr/uip_mgmt_ipc.h
@@ -0,0 +1,71 @@
+/*
+ * uIP iSCSI Daemon/Admin Management IPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * See the file COPYING included with this distribution for more details.
+ */
+#ifndef UIP_MGMT_IPC_H
+#define UIP_MGMT_IPC_H
+
+#include "types.h"
+#include "iscsi_if.h"
+#include "config.h"
+#include "mgmt_ipc.h"
+
+#include "initiator.h"
+#include "transport.h"
+
+#define ISCSID_UIP_NAMESPACE "ISCSID_UIP_ABSTRACT_NAMESPACE"
+
+typedef enum iscsid_uip_cmd {
+ ISCSID_UIP_IPC_UNKNOWN = 0,
+ ISCSID_UIP_IPC_GET_IFACE = 1,
+
+ __ISCSID_UIP_IPC_MAX_COMMAND
+} iscsid_uip_cmd_e;
+
+typedef struct iscsid_uip_broadcast_header {
+ iscsid_uip_cmd_e command;
+ uint32_t payload_len;
+} iscsid_uip_broadcast_header_t;
+
+/* IPC Request */
+typedef struct iscsid_uip_broadcast {
+ struct iscsid_uip_broadcast_header header;
+
+ union {
+ /* messages */
+ struct ipc_broadcast_iface_rec {
+ struct iface_rec rec;
+ } iface_rec;
+ } u;
+} iscsid_uip_broadcast_t;
+
+typedef enum iscsid_uip_mgmt_ipc_err {
+ ISCSID_UIP_MGMT_IPC_OK = 0,
+ ISCISD_UIP_MGMT_IPC_ERR = 1,
+ ISCISD_UIP_MGMT_IPC_ERR_NOT_FOUND = 2,
+ ISCISD_UIP_MGMT_IPC_ERR_NOMEM = 3,
+} iscsid_uip_mgmt_ipc_err_e;
+
+/* IPC Response */
+typedef struct iscsid_uip_mgmt_rsp {
+ iscsid_uip_cmd_e command;
+ iscsid_uip_mgmt_ipc_err_e err;
+} iscsid_uip_rsp_t;
+
+extern int uip_broadcast_params(struct iscsi_transport *t,
+ struct iface_rec *iface,
+ struct iscsi_session *session);
+
+
+#endif /* UIP_MGMT_IPC_H */
--
1.6.6.1

View File

@ -0,0 +1,19 @@
[Unit]
Description=Login and scanning of iSCSI devices
Documentation=man:iscsid(8) man:iscsiadm(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-remount-fs.service network.target iscsid.service
Before=remote-fs-pre.target
ConditionPathExists=/etc/iscsi/initiatorname.iscsi
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/lib/iscsi_mark_root_nodes
ExecStart=/sbin/iscsiadm -m node --loginall=automatic
ExecStop=/bin/sync
ExecStop=/sbin/iscsiadm -m node --logoutall=automatic
[Install]
WantedBy=sysinit.target

View File

@ -0,0 +1,16 @@
[Unit]
Description=Open-iSCSI
Documentation=man:iscsid(8) man:iscsiadm(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=network.target
Before=remote-fs-pre.target
[Service]
Type=forking
PIDFile=/var/run/iscsid.pid
ExecStart=/usr/sbin/iscsid
ExecStop=/sbin/iscsiadm -k 0 2
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,9 @@
[Unit]
Description=Open-iSCSI iscsid Socket
Documentation=man:iscsid(8) man:iscsiadm(8)
[Socket]
ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE
[Install]
WantedBy=sockets.target