2 * linux/kernel/vserver/legacy.c
4 * Virtual Server: Legacy Funtions
6 * Copyright (C) 2001-2003 Jacques Gelinas
7 * Copyright (C) 2003-2007 Herbert Pƶtzl
9 * V0.01 broken out from vcontext.c V0.05
10 * V0.02 updated to spaces *sigh*
14 #include <linux/sched.h>
15 #include <linux/vs_base.h>
16 #include <linux/vs_context.h>
17 #include <linux/vs_network.h>
18 #include <linux/vserver/legacy.h>
19 #include <linux/vserver/space.h>
20 // #include <linux/mnt_namespace.h>
22 #include <asm/errno.h>
23 #include <asm/uaccess.h>
26 extern int vx_set_init(struct vx_info *, struct task_struct *);
28 static int vx_set_initpid(struct vx_info *vxi, int pid)
30 struct task_struct *init;
32 init = find_task_by_real_pid(pid);
35 return vx_set_init(vxi, init);
38 int vc_new_s_context(uint32_t ctx, void __user *data)
41 struct vcmd_new_s_context_v1 vc_data;
42 struct vx_info *new_vxi;
44 if (copy_from_user(&vc_data, data, sizeof(vc_data)))
47 /* legacy hack, will be removed soon */
49 /* assign flags and initpid */
50 if (!current->vx_info)
53 if (vc_data.flags & VX_INFO_INIT)
54 ret = vx_set_initpid(current->vx_info, current->tgid);
56 /* We keep the same vx_id, but lower the capabilities */
57 current->vx_info->vx_bcaps &= (~vc_data.remove_cap);
58 ret = vx_current_xid();
59 current->vx_info->vx_flags |= vc_data.flags;
64 if (!vx_check(0, VS_ADMIN) || !capable(CAP_SYS_ADMIN)
65 /* might make sense in the future, or not ... */
66 || vx_flags(VX_INFO_PRIVATE, 0))
69 /* ugly hack for Spectator */
75 if (((ctx > MAX_S_CONTEXT) && (ctx != VX_DYNAMIC_ID)) ||
79 if ((ctx == VX_DYNAMIC_ID) || (ctx < MIN_D_CONTEXT))
80 new_vxi = lookup_or_create_vx_info(ctx);
82 new_vxi = lookup_vx_info(ctx);
88 if (!vx_info_flags(new_vxi, VXF_STATE_SETUP, 0) &&
89 vx_info_flags(new_vxi, VX_INFO_PRIVATE, 0))
92 ret = vx_migrate_task(current, new_vxi,
93 vx_info_flags(new_vxi, VXF_STATE_SETUP, 0));
94 new_vxi->vx_flags &= ~VXF_STATE_SETUP;
97 current->vx_info->vx_bcaps &= (~vc_data.remove_cap);
98 new_vxi->vx_flags |= vc_data.flags;
99 if (vc_data.flags & VX_INFO_INIT)
100 vx_set_initpid(new_vxi, current->tgid);
101 if (vc_data.flags & VX_INFO_NAMESPACE)
102 vx_set_space(new_vxi, CLONE_NEWNS|CLONE_FS);
103 if (vc_data.flags & VX_INFO_NPROC)
104 __rlim_set(&new_vxi->limit, RLIMIT_NPROC,
105 current->signal->rlim[RLIMIT_NPROC].rlim_max);
107 /* tweak some defaults for legacy */
108 new_vxi->vx_flags |= (VXF_HIDE_NETIF|VXF_INFO_INIT);
109 ret = new_vxi->vx_id;
112 put_vx_info(new_vxi);