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:
parent
61166a61c1
commit
092b90ae70
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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(¶m->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(¶ms);
|
||||
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,
|
||||
¶ms);
|
||||
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(¶m->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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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(¶ms);
|
||||
+ param = idbm_alloc_user_param(parameter, value);
|
||||
+ if (!param) {
|
||||
+ rc = ENOMEM;
|
||||
+ goto leave;
|
||||
+ }
|
||||
+ list_add_tail(¶ms, ¶m->list);
|
||||
+
|
||||
+ CHECK(idbm_for_each_iface(&nr_found, ¶ms, 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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
@ -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))
|
|
@ -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 "
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue