]> git.ipfire.org Git - people/ms/ipfire-3.x.git/commitdiff
iscsi-initiator-utils: Various improvements.
authorStefan Schantl <stefan.schantl@ipfire.org>
Sat, 26 Jan 2013 19:33:46 +0000 (20:33 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Jan 2013 20:21:48 +0000 (21:21 +0100)
* 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.

31 files changed:
iscsi-initiator-utils/iscsi-initiator-utils.nm
iscsi-initiator-utils/iscsi_mark_root_nodes [new file with mode: 0644]
iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0051-update-initscripts-and-docs.patch [moved from iscsi-initiator-utils/patches/iscsi-initiator-utils-update-initscripts-and-docs.patch with 70% similarity]
iscsi-initiator-utils/patches/0052-use-var-for-config.patch [moved from iscsi-initiator-utils/patches/iscsi-initiator-utils-use-var-for-config.patch with 70% similarity]
iscsi-initiator-utils/patches/0054-add-libiscsi.patch [moved from iscsi-initiator-utils/patches/iscsi-initiator-utils-add-libiscsi.patch with 93% similarity]
iscsi-initiator-utils/patches/0055-dont-use-static.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch [new file with mode: 0644]
iscsi-initiator-utils/patches/iscsi-initiator-utils-disable-isns-for-lib.patch [deleted file]
iscsi-initiator-utils/patches/iscsi-initiator-utils-dont-use-static.patch [deleted file]
iscsi-initiator-utils/patches/iscsi-initiator-utils-fix-lib-sysfs-init.patch [deleted file]
iscsi-initiator-utils/patches/iscsi-initiator-utils-only-root-use.patch [deleted file]
iscsi-initiator-utils/patches/iscsi-initiator-utils-uip-mgmt.patch [deleted file]
iscsi-initiator-utils/systemd/iscsi.service [new file with mode: 0644]
iscsi-initiator-utils/systemd/iscsid.service [new file with mode: 0644]
iscsi-initiator-utils/systemd/iscsid.socket [new file with mode: 0644]

index 7049a9c86fb41c89f4e811393342165634834180..dbcfe0264eca45b64c0fe8f97e3fcd588c4523b2 100644 (file)
@@ -4,8 +4,9 @@
 ###############################################################################
 
 name       = iscsi-initiator-utils
-version    = 6.2.0.872
-release    = 3
+rel_ver    = 873
+version    = 6.2.0.%{rel_ver}
+release    = 1
 
 groups     = System/Daemons
 url        = http://www.open-iscsi.org/
@@ -19,8 +20,9 @@ description
        Protocol networks.
 end
 
-source_dl  =
-sources    = open-iscsi-2.0-872-rc4-bnx2i.tar.gz
+thisapp = open-iscsi-2.0-%{rel_ver}
+
+source_dl  = http://www.open-iscsi.org/bits/
 
 build
        requires
@@ -28,14 +30,8 @@ build
                python-devel
        end
 
-       DIR_APP = %{DIR_SRC}/open-iscsi-2.0-872-rc4-bnx2i
-
-       prepare_cmds
-               cd libiscsi && sed -e "s/^all.*/all: lib tests/" -i Makefile
-       end
-
        build
-               cd %{DIR_APP}/utils/open-isns && ./configure
+               cd %{DIR_APP}/utils/open-isns && ./configure --with-security=no
                cd %{DIR_APP}/utils/open-isns && make
                cd %{DIR_APP} && make -C utils/sysdeps
                cd %{DIR_APP} && make -C utils/fwparam_ibft
@@ -68,11 +64,15 @@ build
 
                install -p -m 755 libiscsi/build/lib.linux-*/libiscsimodule.so \
                        %{BUILDROOT}%{python_sitelib}
+
+               install -p -m 755 %{DIR_SOURCE}/iscsi_mark_root_nodes %{BUILDROOT}%{prefix}/lib/
        end
 end
 
 packages
        package %{name}
+               prerequires += systemd-units
+
                requires
                        libiscsi = %{thisver}
                end
@@ -85,6 +85,28 @@ packages
                        if [ ! -f "%{sysconfdir}/iscsi/initiatorname.iscsi" ]; then
                                echo "InitiatorName=$(iscsi-iname)" > %{sysconfdir}/iscsi/initiatorname.iscsi
                        fi
+
+                       systemctl daemon-reload >/dev/null 2>&1 || :
+                       systemctl --no-reload enable iscsid.socket >/dev/null 2>&1 || :
+               end
+
+               script preun
+                       systemctl --no-reload disable iscsid.socket >/dev/null 2>&1 || :
+                       systemctl --no-reload disable iscsid.service >/dev/null 2>&1 || :
+                       systemctl --no-reload disable iscsi.service >/dev/null 2>&1 || :
+                       systemctl stop iscsi.service >/dev/null 2>&1 || :
+                       systemctl stop iscsid.socket >/dev/null 2>&1 || :
+                       systemctl stop iscsid.service >/dev/null 2>&1 || :
+               end
+
+               script postun
+                       systemctl daemon-reload >/dev/null 2>&1 || :
+               end
+
+               script postup
+                       systemctl daemon-reload >/dev/null 2>&1 || :
+                       systemctl try-restart iscsi.service >/dev/null 2>&1 || :
+                       systemctl try-restart iscsid.service >/dev/null 2>&1 || :
                end
        end
 
diff --git a/iscsi-initiator-utils/iscsi_mark_root_nodes b/iscsi-initiator-utils/iscsi_mark_root_nodes
new file mode 100644 (file)
index 0000000..c68475c
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch b/iscsi-initiator-utils/patches/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch
new file mode 100644 (file)
index 0000000..eabacbb
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch b/iscsi-initiator-utils/patches/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch
new file mode 100644 (file)
index 0000000..844babf
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch b/iscsi-initiator-utils/patches/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch
new file mode 100644 (file)
index 0000000..c80ff3a
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch b/iscsi-initiator-utils/patches/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch
new file mode 100644 (file)
index 0000000..5de8d3e
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch b/iscsi-initiator-utils/patches/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch
new file mode 100644 (file)
index 0000000..4a95ac1
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch b/iscsi-initiator-utils/patches/0006-Update-README-for-removal-of-DBM-requirement.patch
new file mode 100644 (file)
index 0000000..3fb2408
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch b/iscsi-initiator-utils/patches/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch
new file mode 100644 (file)
index 0000000..53ade5f
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch b/iscsi-initiator-utils/patches/0008-iscsid-implement-systemd-compatible-socket-activatio.patch
new file mode 100644 (file)
index 0000000..2e4715c
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch b/iscsi-initiator-utils/patches/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch
new file mode 100644 (file)
index 0000000..a177796
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch b/iscsi-initiator-utils/patches/0031-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch
new file mode 100644 (file)
index 0000000..358b50c
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch b/iscsi-initiator-utils/patches/0032-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch
new file mode 100644 (file)
index 0000000..be06f26
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch b/iscsi-initiator-utils/patches/0033-iscsiadm-param-parsing-for-advanced-node-creation.patch
new file mode 100644 (file)
index 0000000..6ab8f35
--- /dev/null
@@ -0,0 +1,337 @@
+From a41a27cd9b910191a616706c4f473259909bc45d Mon Sep 17 00:00:00 2001
+From: Chris Leech <cleech@redhat.com>
+Date: Tue, 18 Dec 2012 11:27:00 -0800
+Subject: iscsiadm: --param parsing for advanced node creation
+
+Share parse_param and apply_param code from iscsistart, allow using multiple
+--param options to set arbitrary fields in node mode.
+
+Signed-off-by: Chris Leech <cleech@redhat.com>
+---
+ usr/Makefile      |  2 +-
+ usr/iscsi_param.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ usr/iscsi_param.h |  7 ++++
+ usr/iscsiadm.c    | 16 ++++++++--
+ usr/iscsistart.c  | 91 ++--------------------------------------------------
+ 5 files changed, 120 insertions(+), 91 deletions(-)
+ create mode 100644 usr/iscsi_param.c
+ create mode 100644 usr/iscsi_param.h
+
+diff --git a/usr/Makefile b/usr/Makefile
+index 673b7f1..1506111 100644
+--- a/usr/Makefile
++++ b/usr/Makefile
+@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o)
+ ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \
+       sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \
+       iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \
+-      initiator_common.o iscsi_err.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
++      initiator_common.o iscsi_err.o iscsi_param.o $(IPC_OBJ)  $(SYSDEPS_SRCS)
+ # core initiator files
+ INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o
+diff --git a/usr/iscsi_param.c b/usr/iscsi_param.c
+new file mode 100644
+index 0000000..c075e8f
+--- /dev/null
++++ b/usr/iscsi_param.c
+@@ -0,0 +1,95 @@
++#include <string.h>
++#include "log.h"
++#include "config.h"
++#include "idbm.h"
++#include "list.h"
++#include "iface.h"
++#include "idbm_fields.h"
++#include "iscsi_err.h"
++
++int apply_params(struct list_head *user_params, struct node_rec *rec)
++{
++      struct user_param *param;
++      int rc;
++
++      /* Must init this so we can check if user overrode them */
++      rec->session.initial_login_retry_max = -1;
++      rec->conn[0].timeo.noop_out_interval = -1;
++      rec->conn[0].timeo.noop_out_timeout = -1;
++
++      list_for_each_entry(param, user_params, list) {
++              /*
++               * user may not have passed in all params that were set by
++               * ibft/iscsi_boot, so clear out values that might conflict
++               * with user overrides
++               */
++              if (!strcmp(param->name, IFACE_NETNAME)) {
++                      /* overriding netname so MAC will be for old netdev */
++                      memset(rec->iface.hwaddress, 0,
++                              sizeof(rec->iface.hwaddress));
++              } else if (!strcmp(param->name, IFACE_HWADDR)) {
++                      /* overriding MAC so netdev will be for old MAC */
++                      memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
++              } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
++                      /*
++                       * switching drivers so all old binding info is no
++                       * longer valid. Old values were either for offload
++                       * and we are switching to software or the reverse,
++                       * or switching types of cards (bnx2i to cxgb3i).
++                       */
++                      memset(&rec->iface, 0, sizeof(rec->iface));
++                      iface_setup_defaults(&rec->iface);
++              }
++      }
++
++      rc = idbm_node_set_rec_from_param(user_params, rec, 0);
++      if (rc)
++              return rc;
++
++      /*
++       * For root boot we could not change this in older versions so
++       * if user did not override then use the defaults.
++       *
++       * Increase to account for boot using static setup.
++       */
++      if (rec->session.initial_login_retry_max == -1)
++              rec->session.initial_login_retry_max = 30;
++      /* we used to not be able to answer so turn off */
++      if (rec->conn[0].timeo.noop_out_interval == -1)
++              rec->conn[0].timeo.noop_out_interval = 0;
++      if (rec->conn[0].timeo.noop_out_timeout == -1)
++              rec->conn[0].timeo.noop_out_timeout = 0;
++
++      return 0;
++}
++
++int parse_param(struct list_head *user_params, char *param_str)
++{
++      struct user_param *param;
++      char *name, *value;
++
++      name = param_str;
++
++      value = strchr(param_str, '=');
++      if (!value) {
++              log_error("Invalid --param %s. Missing value.", param_str);
++              return ISCSI_ERR_INVAL;
++      }
++      *value = '\0';
++
++      value++;
++      if (!strlen(value)) {
++              log_error("Invalid --param %s. Missing value.", param_str);
++              return ISCSI_ERR_INVAL;
++      }
++
++      param = idbm_alloc_user_param(name, value);
++      if (!param) {
++              log_error("Could not allocate memory for param.");
++              return ISCSI_ERR_NOMEM;
++      }
++
++      list_add(&param->list, user_params);
++      return 0;
++}
++
+diff --git a/usr/iscsi_param.h b/usr/iscsi_param.h
+new file mode 100644
+index 0000000..8b7956c
+--- /dev/null
++++ b/usr/iscsi_param.h
+@@ -0,0 +1,7 @@
++#ifndef ISCSI_PARAM_H
++#define ISCSI_PARAM_H
++
++extern int parse_param(struct list_head *user_params, char *param_str);
++extern int apply_params(struct list_head *user_params, struct node_rec *rec);
++
++#endif
+diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
+index 323d0a8..ef866ae 100644
+--- a/usr/iscsiadm.c
++++ b/usr/iscsiadm.c
+@@ -53,6 +53,7 @@
+ #include "iscsi_err.h"
+ #include "iscsi_ipc.h"
+ #include "iscsi_timer.h"
++#include "iscsi_param.h"
+ static char program_name[] = "iscsiadm";
+ static char config_file[TARGET_NAME_MAXLEN];
+@@ -112,6 +113,7 @@ static struct option const long_options[] =
+       {"count", required_argument, NULL, 'c'},
+       {"interval", required_argument, NULL, 'i'},
+       {"newroot", required_argument, NULL, 0},
++      {"param", required_argument, NULL, 0},
+       {NULL, 0, NULL, 0},
+ };
+ static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u";
+@@ -127,7 +129,7 @@ iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p
+ [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\
+ iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\
+ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \
+-[ [ -o  operation  ] [ -n name ] [ -v value ] ]\n\
++[ [ -o  operation  ] [ -n name ] [ -v value ] ] [ --param=NAME=VALUE ]\n\
+ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\
+ iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\
+ iscsiadm -m fw [ -l ]\n\
+@@ -2430,9 +2432,11 @@ main(int argc, char **argv)
+       uint32_t host_no = -1;
+       struct user_param *param;
+       struct list_head params;
++      struct list_head user_params;
+       INIT_LIST_HEAD(&params);
+       INIT_LIST_HEAD(&ifaces);
++      INIT_LIST_HEAD(&user_params);
+       /* do not allow ctrl-c for now... */
+       memset(&sa_old, 0, sizeof(struct sigaction));
+       memset(&sa_new, 0, sizeof(struct sigaction));
+@@ -2455,8 +2459,14 @@ main(int argc, char **argv)
+               case 0:
+                       if (long_options[longindex].flag != 0)
+                               break;
+-                      if (!strcmp(long_options[longindex].name, "newroot"))
++                      if (!strcmp(long_options[longindex].name, "newroot")) {
+                               newroot = optarg;
++                              break;
++                      }
++                      if (!strcmp(long_options[longindex].name, "param")) {
++                              parse_param(&user_params, optarg);
++                              break;
++                      }
+                       break;
+               case 'k':
+                       killiscsid = atoi(optarg);
+@@ -2748,6 +2758,8 @@ main(int argc, char **argv)
+                       goto out;
+               }
++              apply_params(&user_params, rec);
++
+               rc = exec_node_op(op, do_login, do_logout, do_show,
+                                 do_rescan, do_stats, info_level, rec,
+                                 &params);
+diff --git a/usr/iscsistart.c b/usr/iscsistart.c
+index 6924d49..85be35b 100644
+--- a/usr/iscsistart.c
++++ b/usr/iscsistart.c
+@@ -50,6 +50,7 @@
+ #include "iscsid_req.h"
+ #include "iscsi_err.h"
+ #include "iface.h"
++#include "iscsi_param.h"
+ /* global config info */
+ /* initiator needs initiator name/alias */
+@@ -131,99 +132,13 @@ static int stop_event_loop(void)
+       return rc;
+ }
+-static int apply_params(struct node_rec *rec)
+-{
+-      struct user_param *param;
+-      int rc;
+-
+-      /* Must init this so we can check if user overrode them */
+-      rec->session.initial_login_retry_max = -1;
+-      rec->conn[0].timeo.noop_out_interval = -1;
+-      rec->conn[0].timeo.noop_out_timeout = -1;
+-
+-      list_for_each_entry(param, &user_params, list) {
+-              /*
+-               * user may not have passed in all params that were set by
+-               * ibft/iscsi_boot, so clear out values that might conflict
+-               * with user overrides
+-               */
+-              if (!strcmp(param->name, IFACE_NETNAME)) {
+-                      /* overriding netname so MAC will be for old netdev */
+-                      memset(rec->iface.hwaddress, 0,
+-                              sizeof(rec->iface.hwaddress));
+-              } else if (!strcmp(param->name, IFACE_HWADDR)) {
+-                      /* overriding MAC so netdev will be for old MAC */
+-                      memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev));
+-              } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) {
+-                      /*
+-                       * switching drivers so all old binding info is no
+-                       * longer valid. Old values were either for offload
+-                       * and we are switching to software or the reverse,
+-                       * or switching types of cards (bnx2i to cxgb3i).
+-                       */
+-                      memset(&rec->iface, 0, sizeof(rec->iface));
+-                      iface_setup_defaults(&rec->iface);
+-              }
+-      }
+-
+-      rc = idbm_node_set_rec_from_param(&user_params, rec, 0);
+-      if (rc)
+-              return rc;
+-
+-      /*
+-       * For root boot we could not change this in older versions so
+-       * if user did not override then use the defaults.
+-       *
+-       * Increase to account for boot using static setup.
+-       */
+-      if (rec->session.initial_login_retry_max == -1)
+-              rec->session.initial_login_retry_max = 30;
+-      /* we used to not be able to answer so turn off */
+-      if (rec->conn[0].timeo.noop_out_interval == -1)
+-              rec->conn[0].timeo.noop_out_interval = 0;
+-      if (rec->conn[0].timeo.noop_out_timeout == -1)
+-              rec->conn[0].timeo.noop_out_timeout = 0;
+-
+-      return 0;
+-}
+-
+-static int parse_param(char *param_str)
+-{
+-      struct user_param *param;
+-      char *name, *value;
+-
+-      name = param_str;
+-
+-      value = strchr(param_str, '=');
+-      if (!value) {
+-              log_error("Invalid --param %s. Missing value.", param_str);
+-              return ISCSI_ERR_INVAL;
+-      }
+-      *value = '\0';
+-
+-      value++;
+-      if (!strlen(value)) {
+-              log_error("Invalid --param %s. Missing value.", param_str);
+-              return ISCSI_ERR_INVAL;
+-      }
+-
+-      param = idbm_alloc_user_param(name, value);
+-      if (!param) {
+-              log_error("Could not allocate memory for param.");
+-              return ISCSI_ERR_NOMEM;
+-      }
+-
+-      list_add(&param->list, &user_params);
+-      return 0;
+-}
+-
+ static int login_session(struct node_rec *rec)
+ {
+       iscsiadm_req_t req;
+       iscsiadm_rsp_t rsp;
+       int rc, retries = 0;
+-      rc = apply_params(rec);
++      rc = apply_params(&user_params, rec);
+       if (rc)
+               return rc;
+@@ -426,7 +341,7 @@ int main(int argc, char *argv[])
+                       fw_free_targets(&targets);
+                       exit(0);
+               case 'P':
+-                      err = parse_param(optarg);
++                      err = parse_param(&user_params, optarg);
+                       if (err)
+                               exit(err);
+                       break;
+-- 
+1.7.11.7
+
similarity index 70%
rename from iscsi-initiator-utils/patches/iscsi-initiator-utils-update-initscripts-and-docs.patch
rename to iscsi-initiator-utils/patches/0051-update-initscripts-and-docs.patch
index eb8003f29ce9fdb3296be37a8d168c026118b90e..e2d4cdc941214dffd5cd0ebfc6459156fcea8e9d 100644 (file)
@@ -1,6 +1,52 @@
-diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-bnx2i.diff/etc/iscsid.conf
---- open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf       2010-07-11 03:45:50.000000000 -0500
-+++ open-iscsi-2.0-872-rc3-bnx2i.diff/etc/iscsid.conf  2010-07-11 03:57:57.000000000 -0500
+From c255c2cd43afeaefa428237a3200f02fb238d89e Mon Sep 17 00:00:00 2001
+From: Chris Leech <cleech@redhat.com>
+Date: Mon, 19 Nov 2012 16:37:13 -0800
+Subject: update initscripts and docs
+
+---
+ README          |  9 +++------
+ etc/iscsid.conf | 23 +++++++++++------------
+ usr/idbm.c      |  4 ++++
+ 3 files changed, 18 insertions(+), 18 deletions(-)
+
+diff --git a/README b/README
+index ec22098..2a8319a 100644
+--- a/README
++++ b/README
+@@ -74,11 +74,6 @@ the cache sync command will fail.
+ - iscsiadm's -P 3 option will not print out scsi devices.
+ - iscsid will not automatically online devices.
+-You need to enable "Cryptographic API" under "Cryptographic options" in the
+-kernel config. And you must enable "CRC32c CRC algorithm" even if
+-you do not use header or data digests. They are the kernel options,
+-CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively.
+-
+ By default the kernel's iSCSI modules will be used. Running:
+       make
+@@ -997,7 +992,7 @@ Red Hat or Fedora:
+ -----------------
+ To start open-iscsi in Red Hat/Fedora you can do:
+-      service open-iscsi start
++      service iscsi start
+ To get open-iscsi to automatically start at run time you may have to
+ run:
+@@ -1205,6 +1200,8 @@ iscsid will only perform rediscovery when it gets a SCN from the server.
+ #   linux-isns (SLES's iSNS server) where it sometimes does not send SCN
+ #   events in the proper format, so they may not get handled.
++To set the startup value, so that nodes are not logged into automatically
++use the value "manual".
+ Example:
+ --------
+diff --git a/etc/iscsid.conf b/etc/iscsid.conf
+index ef76dc0..ac1d231 100644
+--- a/etc/iscsid.conf
++++ b/etc/iscsid.conf
 @@ -17,10 +17,10 @@
  # maintainers.
  #
@@ -23,9 +69,9 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-b
 +# To manually startup the session set to "manual". The default is automatic.
 +node.startup = automatic
  
- # *************
-@@ -255,29 +255,26 @@ node.conn[0].iscsi.MaxXmitDataSegmentLen
+ # For "automatic" startup nodes, setting this to "Yes" will try logins on each
+ # available iface until one succeeds, and then stop.  The default "No" will try
+@@ -259,28 +259,27 @@ node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
  discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
  
  # To allow the targets to control the setting of the digest checking,
@@ -34,71 +80,38 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/etc/iscsid.conf open-iscsi-2.0-872-rc3-b
 +# the following lines (Data digests are not supported.):
  #node.conn[0].iscsi.HeaderDigest = CRC32C,None
 -#node.conn[0].iscsi.DataDigest = CRC32C,None
++
  #
  # To allow the targets to control the setting of the digest checking,
  # with the initiator requesting a preference of disabling the checking,
 -# uncomment one or both of the following lines:
-+# uncomment the following lines:
++# uncomment the following line:
  #node.conn[0].iscsi.HeaderDigest = None,CRC32C
 -#node.conn[0].iscsi.DataDigest = None,CRC32C
  #
  # To enable CRC32C digest checking for the header and/or data part of
 -# iSCSI PDUs, uncomment one or both of the following lines:
-+# iSCSI PDUs, uncomment the following lines:
++# iSCSI PDUs, uncomment the following line:
  #node.conn[0].iscsi.HeaderDigest = CRC32C
 -#node.conn[0].iscsi.DataDigest = CRC32C
  #
  # To disable digest checking for the header and/or data part of
 -# iSCSI PDUs, uncomment one or both of the following lines:
-+# iSCSI PDUs, uncomment the following lines:
++# iSCSI PDUs, uncomment the following line:
  #node.conn[0].iscsi.HeaderDigest = None
 -#node.conn[0].iscsi.DataDigest = None
  #
  # The default is to never use DataDigests or HeaderDigests.
  #
--
 +node.conn[0].iscsi.HeaderDigest = None
  
- #************
- # Workarounds
-diff -aurp open-iscsi-2.0-872-rc3-bnx2i/README open-iscsi-2.0-872-rc3-bnx2i.diff/README
---- open-iscsi-2.0-872-rc3-bnx2i/README        2010-07-11 03:45:50.000000000 -0500
-+++ open-iscsi-2.0-872-rc3-bnx2i.diff/README   2010-07-11 03:57:57.000000000 -0500
-@@ -74,11 +74,6 @@ the cache sync command will fail.
- - iscsiadm's -P 3 option will not print out scsi devices.
- - iscsid will not automatically online devices.
--You need to enable "Cryptographic API" under "Cryptographic options" in the
--kernel config. And you must enable "CRC32c CRC algorithm" even if
--you do not use header or data digests. They are the kernel options,
--CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively.
--
- By default the kernel source found at
- /lib/modules/`uname -a`/build
- will be used to compile the open-iscsi modules. To specify a different
-@@ -907,7 +902,7 @@ Red Hat or Fedora:
- -----------------
- To start open-iscsi in Red Hat/Fedora you can do:
--      service open-iscsi start
-+      service iscsi start
- To get open-iscsi to automatically start at run time you may have to
- run:
-@@ -1115,6 +1110,8 @@ iscsid will only perform rediscovery whe
- #   linux-isns (SLES's iSNS server) where it sometimes does not send SCN
- #   events in the proper format, so they may not get handled.
-+To set the startup value, so that nodes are not logged into automatically
-+use the value "manual".
- Example:
- --------
-Only in open-iscsi-2.0-872-rc3-bnx2i.diff/: README.orig
-diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c
---- open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c    2010-07-11 03:45:50.000000000 -0500
-+++ open-iscsi-2.0-872-rc3-bnx2i.diff/usr/idbm.c       2010-07-11 03:57:57.000000000 -0500
-@@ -346,9 +346,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo
+ # For multipath configurations, you may want more than one session to be
+ # created on each iface record.  If node.session.nr_sessions is greater
+diff --git a/usr/idbm.c b/usr/idbm.c
+index 4d30aa9..a1d7d37 100644
+--- a/usr/idbm.c
++++ b/usr/idbm.c
+@@ -399,9 +399,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
                                 IDBM_SHOW, "None", "CRC32C", "CRC32C,None",
                                 "None,CRC32C", num, 1);
                sprintf(key, CONN_DATA_DIGEST, i);
@@ -112,3 +125,6 @@ diff -aurp open-iscsi-2.0-872-rc3-bnx2i/usr/idbm.c open-iscsi-2.0-872-rc3-bnx2i.
                sprintf(key, CONN_IFMARKER, i);
                __recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW,
                                "No", "Yes", num, 1);
+-- 
+1.7.11.7
+
similarity index 70%
rename from iscsi-initiator-utils/patches/iscsi-initiator-utils-use-var-for-config.patch
rename to iscsi-initiator-utils/patches/0052-use-var-for-config.patch
index 6ed53e5816589d2eeb891e509d047928cfd97125..1a76c11f49220984ede93df2f3afc12c7edd86f6 100644 (file)
@@ -1,65 +1,40 @@
-diff -aurp open-iscsi-2.0-872-rc3-bnx2i/doc/iscsiadm.8 open-iscsi-2.0-872-rc3-bnx2i.diff/doc/iscsiadm.8
---- open-iscsi-2.0-872-rc3-bnx2i/doc/iscsiadm.8        2010-07-11 03:45:50.000000000 -0500
-+++ open-iscsi-2.0-872-rc3-bnx2i.diff/doc/iscsiadm.8   2010-07-11 04:00:35.000000000 -0500
-@@ -51,7 +51,7 @@ display help text and exit
- .TP
- \fB\-I\fR, \fB\-\-interface\fI[iface]\fR
- The interface argument specifies the iSCSI interface to use for the operation.
--iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware
-+iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware
- iSCSI (qla4xxx) the iface config must have the hardware address
- (iface.hwaddress = port's MAC address)
- and the driver/transport_name (iface.transport_name). The iface's name is
-@@ -128,7 +128,7 @@ If no other options are specified: for \
- of their respective records are displayed; for \fIsession\fR, all active
- sessions and connections are displayed; for \fIfw\fR, all boot firmware
- values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and
--for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed.
-+for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed.
- .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.
- .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.
- 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).
+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]
+ 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.
+ Configuration is contained in directories for:
+@@ -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
+
similarity index 93%
rename from iscsi-initiator-utils/patches/iscsi-initiator-utils-add-libiscsi.patch
rename to iscsi-initiator-utils/patches/0054-add-libiscsi.patch
index 4cc7db8715203feccf4f233580f43448fdce7fd0..359ef30fc34fa3f16e9a7c5e99996dd2d9cc2f8f 100644 (file)
@@ -1,8 +1,52 @@
+From ce1f29f2049320af18eeffd3aefccf840c442ce0 Mon Sep 17 00:00:00 2001
+From: Chris Leech <cleech@redhat.com>
+Date: Mon, 19 Nov 2012 16:43:15 -0800
+Subject: add libiscsi
+
+---
+ Makefile                                    |    2 +
+ libiscsi/Makefile                           |   61 ++
+ libiscsi/libiscsi.c                         |  620 +++++++++++
+ libiscsi/libiscsi.doxy                      | 1473 +++++++++++++++++++++++++++
+ libiscsi/libiscsi.h                         |  344 +++++++
+ libiscsi/pylibiscsi.c                       |  638 ++++++++++++
+ libiscsi/setup.py                           |    9 +
+ libiscsi/tests/test_discovery_firmware.c    |   53 +
+ libiscsi/tests/test_discovery_sendtargets.c |   60 ++
+ libiscsi/tests/test_get_auth.c              |   70 ++
+ libiscsi/tests/test_get_initiator_name.c    |   38 +
+ libiscsi/tests/test_get_network_config.c    |   45 +
+ libiscsi/tests/test_login.c                 |   52 +
+ libiscsi/tests/test_logout.c                |   51 +
+ libiscsi/tests/test_params.c                |  103 ++
+ libiscsi/tests/test_set_auth.c              |   58 ++
+ usr/Makefile                                |    2 +-
+ usr/discovery.c                             |    5 +
+ usr/idbm.c                                  |    6 +-
+ usr/idbm.h                                  |    3 +
+ usr/iscsi_ipc.h                             |    2 +
+ 21 files changed, 3691 insertions(+), 4 deletions(-)
+ create mode 100644 libiscsi/Makefile
+ create mode 100644 libiscsi/libiscsi.c
+ create mode 100644 libiscsi/libiscsi.doxy
+ create mode 100644 libiscsi/libiscsi.h
+ create mode 100644 libiscsi/pylibiscsi.c
+ create mode 100644 libiscsi/setup.py
+ create mode 100644 libiscsi/tests/test_discovery_firmware.c
+ create mode 100644 libiscsi/tests/test_discovery_sendtargets.c
+ create mode 100644 libiscsi/tests/test_get_auth.c
+ create mode 100644 libiscsi/tests/test_get_initiator_name.c
+ create mode 100644 libiscsi/tests/test_get_network_config.c
+ create mode 100644 libiscsi/tests/test_login.c
+ create mode 100644 libiscsi/tests/test_logout.c
+ create mode 100644 libiscsi/tests/test_params.c
+ create mode 100644 libiscsi/tests/test_set_auth.c
+
 diff --git a/Makefile b/Makefile
-index db460eb..a4d4ce0 100644
+index c5d9700..6dfbde3 100644
 --- a/Makefile
 +++ b/Makefile
-@@ -32,6 +32,7 @@ user: ;
+@@ -32,6 +32,7 @@ user: utils/open-isns/Makefile
        $(MAKE) -C utils/fwparam_ibft
        $(MAKE) -C usr
        $(MAKE) -C utils
@@ -10,7 +54,7 @@ index db460eb..a4d4ce0 100644
        @echo
        @echo "Compilation complete                 Output file"
        @echo "-----------------------------------  ----------------"
-@@ -53,6 +54,7 @@ kernel: force
+@@ -56,6 +57,7 @@ kernel: force
  force: ;
  
  clean:
@@ -20,16 +64,16 @@ index db460eb..a4d4ce0 100644
        $(MAKE) -C utils clean
 diff --git a/libiscsi/Makefile b/libiscsi/Makefile
 new file mode 100644
-index 0000000..4aeb44f
+index 0000000..317a7ec
 --- /dev/null
 +++ b/libiscsi/Makefile
-@@ -0,0 +1,62 @@
+@@ -0,0 +1,61 @@
 +# This Makefile will work only with GNU make.
 +
 +OSNAME=$(shell uname -s)
 +OPTFLAGS ?= -O2 -g
 +WARNFLAGS ?= -Wall -Wstrict-prototypes
-+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr -I../utils/open-isns \
++CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \
 +              -D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden
 +LIB = libiscsi.so.0
 +TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware
@@ -39,7 +83,7 @@ index 0000000..4aeb44f
 +
 +COMMON_SRCS = sysdeps.o
 +# sources shared between iscsid, iscsiadm and iscsistart
-+ISCSI_LIB_SRCS = session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o
++ISCSI_LIB_SRCS = netlink.o transport.o cxgbi.o be2iscsi.o iscsi_timer.o initiator_common.o iscsi_err.o session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o iser.o uip_mgmt_ipc.o
 +FW_PARAM_SRCS = fw_entry.o prom_lex.o prom_parse.tab.o fwparam_ppc.o fwparam_sysfs.o
 +
 +# sources shared with the userspace utils, note we build these separately
@@ -69,14 +113,13 @@ index 0000000..4aeb44f
 +      $(CC) $(CFLAGS) -c $< -o $@
 +
 +$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o
-+      $(CC) $(CFLAGS) -L../utils/open-isns -lisns -shared -Wl,-soname,$(LIB) $^ -o $@
++      $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@
 +      ln -s -f $(LIB) libiscsi.so
 +
 +$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB)
-+      $(CC) $(CFLAGS) -L../utils/open-isns -lisns -c $< -o $@
 +
-+html: libiscsi.h libiscsi.doxy
-+      doxygen libiscsi.doxy
++html: libiscsi.h
++#     doxygen libiscsi.doxy
 +
 +clean:
 +      rm -rf *.o common-objs usr-objs fw-objs libuip-objs libiscsi.so* \
@@ -88,10 +131,10 @@ index 0000000..4aeb44f
 +-include .depend ../usr/.depend
 diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c
 new file mode 100644
-index 0000000..a9eb0a6
+index 0000000..2a176e8
 --- /dev/null
 +++ b/libiscsi/libiscsi.c
-@@ -0,0 +1,563 @@
+@@ -0,0 +1,620 @@
 +/*
 + * iSCSI Administration library
 + *
@@ -131,9 +174,13 @@ index 0000000..a9eb0a6
 +#include "iscsi_proto.h"
 +#include "fw_context.h"
 +#include "iscsid_req.h"
++#include "iscsi_err.h"
 +
 +#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; }
 +
++/* UGLY, not thread safe :( */
++static int sysfs_initialized = 0;
++
 +struct libiscsi_context {
 +      char error_str[256];
 +      /* For get_parameter_helper() */
@@ -160,7 +207,10 @@ index 0000000..a9eb0a6
 +              return NULL;
 +
 +      log_init("libiscsi", 1024, libiscsi_log, context);
-+      sysfs_init();
++      if (!sysfs_initialized) {
++              sysfs_init();
++              sysfs_initialized = 1;
++      }
 +      increase_max_files();
 +      if (idbm_init(NULL)) {
 +              sysfs_cleanup();
@@ -181,6 +231,16 @@ index 0000000..a9eb0a6
 +      free(context);
 +}
 +
++static void free_iface_list(struct list_head *ifaces)
++{
++      struct iface_rec *iface, *tmp_iface;
++
++      list_for_each_entry_safe(iface, tmp_iface, ifaces, list) {
++              list_del(&iface->list);
++              free(iface);
++      }
++}
++
 +static void free_rec_list(struct list_head *rec_list)
 +{
 +      struct node_rec *rec, *tmp;
@@ -264,6 +324,8 @@ index 0000000..a9eb0a6
 +                      strlcpy((*found_nodes)[found].address,
 +                               rec->conn[0].address, NI_MAXHOST);
 +                      (*found_nodes)[found].port = rec->conn[0].port;
++                      strlcpy((*found_nodes)[found].iface,
++                               rec->iface.name, LIBISCSI_VALUE_MAXLEN);
 +                      found++;
 +              }
 +      }
@@ -276,69 +338,84 @@ index 0000000..a9eb0a6
 +int libiscsi_discover_firmware(struct libiscsi_context *context,
 +      int *nr_found, struct libiscsi_node **found_nodes)
 +{
-+      struct boot_context fw_entry;
-+      struct node_rec rec;
++      struct list_head targets, ifaces, rec_list;
++      discovery_rec_t drec;
 +      int rc = 0;
 +
-+      if (nr_found)
++      INIT_LIST_HEAD(&targets);
++      INIT_LIST_HEAD(&ifaces);
++      INIT_LIST_HEAD(&rec_list);
++
++      if (nr_found) {
 +              *nr_found = 0;
-+      if (found_nodes)
++      }
++
++      if (found_nodes) {
 +              *found_nodes = NULL;
++      }
 +
-+      memset(&fw_entry, 0, sizeof fw_entry);
-+      rc = fw_get_entry(&fw_entry);
++      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);
-+
-+      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;
-+
-+      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);
-+
-+      CHECK(idbm_add_node(&rec, NULL, 1 /* overwrite */))
++      CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets));
 +
-+      if (nr_found)
-+              *nr_found = 1;
++      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;
++      }
++
++      int node_count = 0;
++      struct list_head *pos;
++      list_for_each(pos, &rec_list) {
++              ++node_count;
++      }
 +
++      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;
++      }
++
++      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;
++
++      INIT_LIST_HEAD(&params);
++      param = idbm_alloc_user_param(parameter, value);
++      if (!param) {
++              rc = ENOMEM;
++              goto leave;
++      }
++      list_add_tail(&params, &param->list);
 +
-+      CHECK(idbm_for_each_iface(&nr_found, &set_param, idbm_node_set_param,
++      CHECK(idbm_for_each_iface(&nr_found, &params, idbm_node_set_param,
 +              (char *)node->name, node->tpgt,
 +              (char *)node->address, node->port))
 +      if (nr_found == 0) {
 +              strcpy(context->error_str, "No such node");
 +              rc = ENODEV;
 +      }
++      free(param->name);
++      free(param);
 +leave:
 +      return rc;
 +}
@@ -623,6 +713,11 @@ index 0000000..a9eb0a6
 +{
 +      struct boot_context fw_entry;
 +
++      if (!sysfs_initialized) {
++              sysfs_init();
++              sysfs_initialized = 1;
++      }
++
 +      memset(config, 0, sizeof *config);
 +      memset(&fw_entry, 0, sizeof fw_entry);
 +      if (fw_get_entry(&fw_entry))
@@ -645,6 +740,11 @@ index 0000000..a9eb0a6
 +{
 +      struct boot_context fw_entry;
 +
++      if (!sysfs_initialized) {
++              sysfs_init();
++              sysfs_initialized = 1;
++      }
++
 +      memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN);
 +      memset(&fw_entry, 0, sizeof fw_entry);
 +      if (fw_get_entry(&fw_entry))
@@ -2136,10 +2236,10 @@ index 0000000..663770f
 +SEARCHENGINE           = NO
 diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h
 new file mode 100644
-index 0000000..a7d05a5
+index 0000000..756590e
 --- /dev/null
 +++ b/libiscsi/libiscsi.h
-@@ -0,0 +1,343 @@
+@@ -0,0 +1,344 @@
 +/*
 + * iSCSI Administration library
 + *
@@ -2210,6 +2310,7 @@ index 0000000..a7d05a5
 +       get used anywhere, so we keep things simple and assume one connection */
 +    char address[NI_MAXHOST]             /** Portal hostname or IP-address. */;
 +    int port                             /** Portal port number. */;
++    char iface[LIBISCSI_VALUE_MAXLEN]    /** Interface to connect through. */;
 +};
 +
 +/** \brief libiscsi CHAP authentication information struct
@@ -2485,10 +2586,10 @@ index 0000000..a7d05a5
 +#endif
 diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c
 new file mode 100644
-index 0000000..454a26a
+index 0000000..4b09aa7
 --- /dev/null
 +++ b/libiscsi/pylibiscsi.c
-@@ -0,0 +1,624 @@
+@@ -0,0 +1,638 @@
 +/*
 + * iSCSI Administration library
 + *
@@ -2689,25 +2790,27 @@ index 0000000..454a26a
 +static int PyIscsiNode_init(PyObject *self, PyObject *args, PyObject *kwds)
 +{
 +      PyIscsiNode *node = (PyIscsiNode *)self;
-+      char *kwlist[] = {"name", "tpgt", "address", "port", NULL};
-+      const char *name = NULL, *address = NULL;
++      char *kwlist[] = {"name", "tpgt", "address", "port", "iface", NULL};
++      const char *name = NULL, *address = NULL, *iface = NULL;
 +      int tpgt = -1, port = 3260;
 +
-+      if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isi:node.__init__",
-+                                      kwlist, &name, &tpgt, &address, &port))
++      if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isis:node.__init__",
++                                       kwlist, &name, &tpgt, &address,
++                                       &port, &iface))
 +              return -1;
 +      if (address == NULL) {
 +              PyErr_SetString(PyExc_ValueError, "address not set");
 +              return -1;
 +      }
-+      if (check_string(name) || check_string(address))
++      if (check_string(name) || check_string(address) || check_string(iface))
 +              return -1;
 +
 +      strcpy(node->node.name, name);
 +      node->node.tpgt = tpgt;
 +      strcpy(node->node.address, address);
 +      node->node.port = port;
-+      
++      strcpy(node->node.iface, iface);
++
 +      return 0;
 +}
 +
@@ -2724,6 +2827,8 @@ index 0000000..454a26a
 +              return PyString_FromString(node->node.address);
 +      } else if (!strcmp(attr, "port")) {
 +              return PyInt_FromLong(node->node.port);
++      } else if (!strcmp(attr, "iface")) {
++              return PyString_FromString(node->node.iface);
 +      }
 +      return NULL;
 +}
@@ -2751,6 +2856,10 @@ index 0000000..454a26a
 +              if (!PyArg_Parse(value, "i", &i))
 +                      return -1;
 +              node->node.port = i;
++      } else if (!strcmp(attr, "iface")) {
++              if (!PyArg_Parse(value, "s", &str) || check_string(str))
++                      return -1;
++              strcpy(node->node.iface, str);
 +      }
 +
 +      return 0;
@@ -2778,6 +2887,10 @@ index 0000000..454a26a
 +      if (self->node.port > other->node.port)
 +              return -1;
 +
++      res = strcmp(self->node.iface, other->node.iface);
++      if (res)
++              return res;
++
 +      return 0;
 +}
 +
@@ -2931,6 +3044,8 @@ index 0000000..454a26a
 +              "address", "address"},
 +      {"port", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
 +              "port", "port"},
++      {"iface", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set,
++              "iface", "iface"},
 +      {NULL}
 +};
 +
@@ -3712,8 +3827,21 @@ index 0000000..a21f888
 +
 +      return rc;
 +}
+diff --git a/usr/Makefile b/usr/Makefile
+index 1506111..015f1b9 100644
+--- a/usr/Makefile
++++ b/usr/Makefile
+@@ -31,7 +31,7 @@ endif
+ OPTFLAGS ?= -O2 -g
+ WARNFLAGS ?= -Wall -Wstrict-prototypes
+ CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \
+-                              -D$(OSNAME) $(IPC_CFLAGS)
++                              -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE
+ PROGRAMS = iscsid iscsiadm iscsistart
+ # libc compat files
 diff --git a/usr/discovery.c b/usr/discovery.c
-index 381f825..2233de7 100644
+index afce6c0..0c93749 100644
 --- a/usr/discovery.c
 +++ b/usr/discovery.c
 @@ -36,6 +36,7 @@
@@ -3724,14 +3852,76 @@ index 381f825..2233de7 100644
  #include "log.h"
  #include "idbm.h"
  #include "iscsi_settings.h"
+@@ -50,9 +51,11 @@
+ #include "iscsi_timer.h"
+ #include "iscsi_err.h"
+ /* libisns includes */
++#ifdef ISNS_ENABLE
+ #include "isns.h"
+ #include "paths.h"
+ #include "message.h"
++#endif
+ #ifdef SLP_ENABLE
+ #include "iscsi-slp-discovery.h"
+@@ -98,6 +101,7 @@ static int request_initiator_name(void)
+       return 0;
+ }
++#ifdef ISNS_ENABLE
+ void discovery_isns_free_servername(void)
+ {
+       if (isns_config.ic_server_name)
+@@ -377,6 +381,7 @@ retry:
+       discovery_isns_free_servername();
+       return rc;
+ }
++#endif
+ int discovery_fw(void *data, struct iface_rec *iface,
+                struct list_head *rec_list)
+diff --git a/usr/idbm.c b/usr/idbm.c
+index 806d90e..c20f7d9 100644
+--- a/usr/idbm.c
++++ b/usr/idbm.c
+@@ -1335,9 +1335,9 @@ int idbm_print_all_discovery(int info_level)
+  * fn should return -1 if it skipped the rec, a ISCSI_ERR error code if
+  * the operation failed or 0 if fn was run successfully.
+  */
+-static int idbm_for_each_iface(int *found, void *data,
+-                              idbm_iface_op_fn *fn,
+-                              char *targetname, int tpgt, char *ip, int port)
++int idbm_for_each_iface(int *found, void *data,
++                      idbm_iface_op_fn *fn,
++                      char *targetname, int tpgt, char *ip, int port)
+ {
+       DIR *iface_dirfd;
+       struct dirent *iface_dent;
+diff --git a/usr/idbm.h b/usr/idbm.h
+index 5d81df7..f645561 100644
+--- a/usr/idbm.h
++++ b/usr/idbm.h
+@@ -101,6 +101,9 @@ struct rec_op_data {
+       node_rec_t *match_rec;
+       idbm_iface_op_fn *fn;
+ };
++extern int idbm_for_each_iface(int *found, void *data,
++                             idbm_iface_op_fn *fn,
++                             char *targetname, int tpgt, char *ip, int port);
+ extern int idbm_for_each_portal(int *found, void *data,
+                               idbm_portal_op_fn *fn, char *targetname);
+ extern int idbm_for_each_node(int *found, void *data,
 diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h
-index 74ef948..713914f 100644
+index db5f1f0..e0bf051 100644
 --- a/usr/iscsi_ipc.h
 +++ b/usr/iscsi_ipc.h
-@@ -111,4 +111,6 @@ struct iscsi_ipc {
-       int (*recv_pdu_end) (struct iscsi_conn *conn);
+@@ -147,4 +147,6 @@ struct iscsi_ipc {
+                           uint16_t chap_tbl_idx);
  };
  
 +struct iscsi_ipc *ipc;
 +
  #endif /* ISCSI_IPC_H */
+-- 
+1.7.11.7
+
diff --git a/iscsi-initiator-utils/patches/0055-dont-use-static.patch b/iscsi-initiator-utils/patches/0055-dont-use-static.patch
new file mode 100644 (file)
index 0000000..9e43b7b
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch b/iscsi-initiator-utils/patches/0056-remove-the-offload-boot-supported-ifdef.patch
new file mode 100644 (file)
index 0000000..a1ccdc7
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch b/iscsi-initiator-utils/patches/0057-iscsid-iscsiuio-ipc-interface.patch
new file mode 100644 (file)
index 0000000..2335aa3
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch b/iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch
new file mode 100644 (file)
index 0000000..2680f22
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch b/iscsi-initiator-utils/patches/0060-use-systemctl-to-start-iscsid.patch
new file mode 100644 (file)
index 0000000..dc62c32
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch b/iscsi-initiator-utils/patches/0061-resolve-565245-multilib-issues-caused-by-doxygen.patch
new file mode 100644 (file)
index 0000000..1f64d9c
--- /dev/null
@@ -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
+
diff --git a/iscsi-initiator-utils/patches/iscsi-initiator-utils-disable-isns-for-lib.patch b/iscsi-initiator-utils/patches/iscsi-initiator-utils-disable-isns-for-lib.patch
deleted file mode 100644 (file)
index 7f5acc5..0000000
+++ /dev/null
@@ -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
-
diff --git a/iscsi-initiator-utils/patches/iscsi-initiator-utils-dont-use-static.patch b/iscsi-initiator-utils/patches/iscsi-initiator-utils-dont-use-static.patch
deleted file mode 100644 (file)
index 763d784..0000000
+++ /dev/null
@@ -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)
diff --git a/iscsi-initiator-utils/patches/iscsi-initiator-utils-fix-lib-sysfs-init.patch b/iscsi-initiator-utils/patches/iscsi-initiator-utils-fix-lib-sysfs-init.patch
deleted file mode 100644 (file)
index 7b67f66..0000000
+++ /dev/null
@@ -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))
diff --git a/iscsi-initiator-utils/patches/iscsi-initiator-utils-only-root-use.patch b/iscsi-initiator-utils/patches/iscsi-initiator-utils-only-root-use.patch
deleted file mode 100644 (file)
index b442ba0..0000000
+++ /dev/null
@@ -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 "
diff --git a/iscsi-initiator-utils/patches/iscsi-initiator-utils-uip-mgmt.patch b/iscsi-initiator-utils/patches/iscsi-initiator-utils-uip-mgmt.patch
deleted file mode 100644 (file)
index cab3690..0000000
+++ /dev/null
@@ -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
-
diff --git a/iscsi-initiator-utils/systemd/iscsi.service b/iscsi-initiator-utils/systemd/iscsi.service
new file mode 100644 (file)
index 0000000..faacc03
--- /dev/null
@@ -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
diff --git a/iscsi-initiator-utils/systemd/iscsid.service b/iscsi-initiator-utils/systemd/iscsid.service
new file mode 100644 (file)
index 0000000..045fd34
--- /dev/null
@@ -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
diff --git a/iscsi-initiator-utils/systemd/iscsid.socket b/iscsi-initiator-utils/systemd/iscsid.socket
new file mode 100644 (file)
index 0000000..58a8d12
--- /dev/null
@@ -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