Files linux-2.6.11.10-vs2.0-rc3.1/fs/freevxfs/.vxfs_super.c.swp and linux-2.6.11.10-vs2.0-rc3.2/fs/freevxfs/.vxfs_super.c.swp differ Files linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/.switch.h.swp and linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/.switch.h.swp differ diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/context.h linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/context.h --- linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/context.h 2005-05-25 10:08:12 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/context.h 2005-06-07 03:11:52 +0200 @@ -36,6 +36,8 @@ #define VXF_STATE_SETUP (1ULL<<32) #define VXF_STATE_INIT (1ULL<<33) +#define VXF_STATE_HELPER (1ULL<<36) + #define VXF_FORK_RSS (1ULL<<48) #define VXF_PROLIFIC (1ULL<<49) @@ -43,6 +45,8 @@ #define VXF_ONE_TIME (0x0003ULL<<32) +#define VXF_INIT_SET (VXF_STATE_SETUP|VXF_STATE_INIT) + /* context caps */ @@ -66,6 +70,9 @@ enum { VSC_STARTUP = 1, VSC_SHUTDOWN, + + VSC_NETUP, + VSC_NETDOWN, }; diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/context_cmd.h linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/context_cmd.h --- linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/context_cmd.h 2005-05-21 04:29:23 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/context_cmd.h 2005-06-07 03:03:45 +0200 @@ -27,7 +27,13 @@ extern int vc_vx_info(uint32_t, void __u /* context commands */ -#define VCMD_ctx_create VC_CMD(VPROC, 1, 0) +#define VCMD_ctx_create_v0 VC_CMD(VPROC, 1, 0) +#define VCMD_ctx_create VC_CMD(VPROC, 1, 1) + +struct vcmd_ctx_create { + uint64_t flagword; +}; + #define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 0) #ifdef __KERNEL__ diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/network.h linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/network.h --- linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/network.h 2005-05-25 10:08:26 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/network.h 2005-06-07 03:17:06 +0200 @@ -15,6 +15,10 @@ #define NXF_STATE_SETUP (1ULL<<32) +#define NXF_STATE_HELPER (1ULL<<36) + +#define NXF_INIT_SET (0) + #ifdef __KERNEL__ @@ -62,6 +66,8 @@ extern int nid_is_hashed(nid_t); extern int nx_migrate_task(struct task_struct *, struct nx_info *); +extern long vs_net_change(struct nx_info *, unsigned int); + struct in_ifaddr; struct net_device; diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/network_cmd.h linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/network_cmd.h --- linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/network_cmd.h 2005-05-25 10:10:52 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/network_cmd.h 2005-06-07 03:25:31 +0200 @@ -23,7 +23,13 @@ extern int vc_nx_info(uint32_t, void __u #endif /* __KERNEL__ */ -#define VCMD_net_create VC_CMD(VNET, 1, 0) +#define VCMD_net_create_v0 VC_CMD(VNET, 1, 0) +#define VCMD_net_create VC_CMD(VNET, 1, 1) + +struct vcmd_net_create { + uint64_t flagword; +}; + #define VCMD_net_migrate VC_CMD(NETMIG, 1, 0) #define VCMD_net_add VC_CMD(NETALT, 1, 0) diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/switch.h linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/switch.h --- linux-2.6.11.10-vs2.0-rc3.1/include/linux/vserver/switch.h 2005-05-21 04:29:23 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/include/linux/vserver/switch.h 2005-06-07 03:30:05 +0200 @@ -77,7 +77,7 @@ /* interface version */ -#define VCI_VERSION 0x00010025 +#define VCI_VERSION 0x00020001 /* query version */ diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/context.c linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/context.c --- linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/context.c 2005-05-30 23:42:47 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/context.c 2005-06-07 03:24:13 +0200 @@ -72,7 +72,7 @@ static struct vx_info *__alloc_vx_info(x vx_info_init_cvirt(&new->cvirt); vx_info_init_cacct(&new->cacct); - new->vx_flags = VXF_STATE_SETUP|VXF_STATE_INIT; + new->vx_flags = VXF_INIT_SET; new->vx_bcaps = CAP_INIT_EFF_SET; new->vx_ccaps = 0; @@ -647,15 +647,17 @@ int vc_vx_info(uint32_t id, void __user int vc_ctx_create(uint32_t xid, void __user *data) { + struct vcmd_ctx_create vc_data = { .flagword = VXF_INIT_SET }; struct vx_info *new_vxi; int ret; if (!capable(CAP_SYS_ADMIN)) return -EPERM; + if (data && copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; if ((xid > MAX_S_CONTEXT) && (xid != VX_DYNAMIC_ID)) return -EINVAL; - if (xid < 2) return -EINVAL; @@ -663,6 +665,9 @@ int vc_ctx_create(uint32_t xid, void __u if (IS_ERR(new_vxi)) return PTR_ERR(new_vxi); + /* initial flags */ + new_vxi->vx_flags = vc_data.flagword; + vs_state_change(new_vxi, VSC_STARTUP); ret = new_vxi->vx_id; vx_migrate_task(current, new_vxi); diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/helper.c linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/helper.c --- linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/helper.c 2005-06-06 20:01:31 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/helper.c 2005-06-07 03:31:31 +0200 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,7 @@ long vs_reboot(unsigned int cmd, void * { char id_buf[8], cmd_buf[16]; char uid_buf[16], pid_buf[16]; + int ret; char *argv[] = {vshelper_path, NULL, id_buf, 0}; char *envp[] = {"HOME=/", "TERM=linux", @@ -88,10 +90,12 @@ long vs_reboot(unsigned int cmd, void * return 0; } - if (do_vshelper(vshelper_path, argv, envp, 1)) - return -EPERM; - argv[1] = "mickey"; - return 0; +#ifndef CONFIG_VSERVER_LEGACY + ret = do_vshelper(vshelper_path, argv, envp, 1); +#else + ret = do_vshelper(vshelper_path, argv, envp, 0); +#endif + return (ret) ? -EPERM : 0; } @@ -110,6 +114,9 @@ long vs_state_change(struct vx_info *vxi char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", cmd_buf, 0}; + if (!vx_info_flags(vxi, VXF_STATE_HELPER, 0)) + return 0; + snprintf(id_buf, sizeof(id_buf)-1, "%d", vxi->vx_id); snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd); @@ -128,3 +135,40 @@ long vs_state_change(struct vx_info *vxi return 0; } + +/* + * argv [0] = vshelper_path; + * argv [1] = action: "netup", "netdown" + * argv [2] = context identifier + * + * envp [*] = type-specific parameters + */ + +long vs_net_change(struct nx_info *nxi, unsigned int cmd) +{ + char id_buf[8], cmd_buf[16]; + char *argv[] = {vshelper_path, NULL, id_buf, 0}; + char *envp[] = {"HOME=/", "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", cmd_buf, 0}; + + if (!nx_info_flags(nxi, NXF_STATE_HELPER, 0)) + return 0; + + snprintf(id_buf, sizeof(id_buf)-1, "%d", nxi->nx_id); + snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd); + + switch (cmd) { + case VSC_NETUP: + argv[1] = "netup"; + break; + case VSC_NETDOWN: + argv[1] = "netdown"; + break; + default: + return 0; + } + + do_vshelper(vshelper_path, argv, envp, 1); + return 0; +} + diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/network.c linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/network.c --- linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/network.c 2005-05-25 10:21:06 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/network.c 2005-06-07 03:22:42 +0200 @@ -45,6 +45,8 @@ static struct nx_info *__alloc_nx_info(n atomic_set(&new->nx_tasks, 0); new->nx_state = 0; + new->nx_flags = NXF_INIT_SET; + /* rest of init goes here */ vxdprintk(VXD_CBIT(nid, 0), @@ -74,6 +76,7 @@ static void __dealloc_nx_info(struct nx_ static void __shutdown_nx_info(struct nx_info *nxi) { nxi->nx_state |= NXS_SHUTDOWN; + vs_net_change(nxi, VSC_NETDOWN); } /* exported stuff */ @@ -530,15 +533,17 @@ int vc_nx_info(uint32_t id, void __user int vc_net_create(uint32_t nid, void __user *data) { + struct vcmd_net_create vc_data = { .flagword = NXF_INIT_SET }; struct nx_info *new_nxi; int ret; if (!capable(CAP_SYS_ADMIN)) return -EPERM; + if (data && copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; if ((nid > MAX_S_CONTEXT) && (nid != VX_DYNAMIC_ID)) return -EINVAL; - if (nid < 2) return -EINVAL; @@ -546,15 +551,10 @@ int vc_net_create(uint32_t nid, void __u if (IS_ERR(new_nxi)) return PTR_ERR(new_nxi); -/* - new_nxi = __loc_nx_info(nid, &ret); - if (!new_nxi) - return ret; - if (!(new_nxi->nx_flags & VXF_STATE_SETUP)) { - ret = -EEXIST; - goto out_put; - } -*/ + /* initial flags */ + new_nxi->nx_flags = vc_data.flagword; + + vs_net_change(new_nxi, VSC_NETUP); ret = new_nxi->nx_id; nx_migrate_task(current, new_nxi); /* if this fails, we might end up with a hashed nx_info */ diff -NurpP --minimal linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/switch.c linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/switch.c --- linux-2.6.11.10-vs2.0-rc3.1/kernel/vserver/switch.c 2005-05-21 04:29:23 +0200 +++ linux-2.6.11.10-vs2.0-rc3.2/kernel/vserver/switch.c 2005-06-07 03:28:14 +0200 @@ -186,7 +186,7 @@ long do_vserver(uint32_t cmd, uint32_t i case VCMD_create_context: #ifdef CONFIG_VSERVER_LEGACY - return vc_ctx_create(id, data); + return vc_ctx_create(id, NULL); #else return -ENOSYS; #endif @@ -199,17 +199,21 @@ long do_vserver(uint32_t cmd, uint32_t i case VCMD_enter_namespace: return vc_enter_namespace(id, data); - case VCMD_ctx_create: + case VCMD_ctx_create_v0: #ifdef CONFIG_VSERVER_LEGACY if (id == 1) { current->xid = 1; return 1; } #endif + return vc_ctx_create(id, NULL); + case VCMD_ctx_create: return vc_ctx_create(id, data); case VCMD_ctx_migrate: return vc_ctx_migrate(id, data); + case VCMD_net_create_v0: + return vc_net_create(id, NULL); case VCMD_net_create: return vc_net_create(id, data); case VCMD_net_migrate: