From 6e979154c9c51dedd54c91e46106e495a65ced43 Mon Sep 17 00:00:00 2001 From: Chris Leech Date: Wed, 2 Jan 2013 14:45:05 -0800 Subject: [PATCH 58/58] 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 4d030a8..e0488ad 100644 --- a/usr/transport.c +++ b/usr/transport.c @@ -83,6 +83,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 388e4b1..d4d9ec7 100644 --- a/usr/transport.h +++ b/usr/transport.h @@ -39,6 +39,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 f3074ee..d5d496a 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 29a4769..3ca4fb1 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.8.1.4