]> git.ipfire.org Git - people/amarx/ipfire-3.x.git/blobdiff - iscsi-initiator-utils/patches/0058-iscsiuio-IPC-newroot-command.patch
iscsi-initiator-utils: Various improvements.
[people/amarx/ipfire-3.x.git] / iscsi-initiator-utils / patches / 0058-iscsiuio-IPC-newroot-command.patch
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
+