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