2 * linux/kernel/vserver/switch.c
4 * Virtual Server: Syscall Switch
6 * Copyright (C) 2003-2005 Herbert Pƶtzl
9 * V0.02 added signal to context
10 * V0.03 added rlimit functions
11 * V0.04 added iattr, task/xid functions
12 * V0.05 added debug/history stuff
13 * V0.06 added compat32 layer
17 #include <linux/linkage.h>
18 #include <linux/sched.h>
19 #include <linux/compat.h>
20 #include <asm/errno.h>
22 #include <linux/vs_base.h>
23 #include <linux/vserver/network.h>
24 #include <linux/vserver/switch.h>
25 #include <linux/vserver/debug.h>
29 int vc_get_version(uint32_t id)
31 #ifdef CONFIG_VSERVER_LEGACY_VERSION
33 return VCI_LEGACY_VERSION;
38 #include <linux/vserver/context_cmd.h>
39 #include <linux/vserver/cvirt_cmd.h>
40 #include <linux/vserver/limit_cmd.h>
41 #include <linux/vserver/network_cmd.h>
42 #include <linux/vserver/sched_cmd.h>
43 #include <linux/vserver/debug_cmd.h>
44 #include <linux/vserver/inode_cmd.h>
45 #include <linux/vserver/dlimit_cmd.h>
46 #include <linux/vserver/signal_cmd.h>
47 #include <linux/vserver/namespace_cmd.h>
49 #include <linux/vserver/legacy.h>
50 #include <linux/vserver/inode.h>
51 #include <linux/vserver/dlimit.h>
55 #define __COMPAT(name, id, data, compat) \
56 (compat) ? name ## _x32 (id, data) : name (id, data)
58 #define __COMPAT(name, id, data, compat) \
64 long do_vserver(uint32_t cmd, uint32_t id, void __user *data, int compat)
66 vxdprintk(VXD_CBIT(switch, 0),
67 "vc: VCMD_%02d_%d[%d], %d,%p,%d",
68 VC_CATEGORY(cmd), VC_COMMAND(cmd),
69 VC_VERSION(cmd), id, data, compat);
71 #ifdef CONFIG_VSERVER_LEGACY
72 if (!capable(CAP_CONTEXT) &&
73 /* dirty hack for capremove */
74 !(cmd==VCMD_new_s_context && id==-2))
77 if (!capable(CAP_CONTEXT))
82 case VCMD_get_version:
83 return vc_get_version(id);
85 case VCMD_dump_history:
86 #ifdef CONFIG_VSERVER_HISTORY
87 return vc_dump_history(id);
92 #ifdef CONFIG_VSERVER_LEGACY
93 case VCMD_new_s_context:
94 return vc_new_s_context(id, data);
96 #ifdef CONFIG_VSERVER_LEGACYNET
97 case VCMD_set_ipv4root:
98 return vc_set_ipv4root(id, data);
102 return vc_task_xid(id, data);
104 return vc_vx_info(id, data);
107 return vc_task_nid(id, data);
109 return vc_nx_info(id, data);
111 case VCMD_set_namespace_v0:
112 return vc_set_namespace(-1, data);
113 case VCMD_set_namespace:
114 return vc_set_namespace(id, data);
117 /* those are allowed while in setup too */
118 if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
119 !vx_flags(VXF_STATE_SETUP,0))
122 #ifdef CONFIG_VSERVER_LEGACY
124 case VCMD_set_cflags:
126 if (vx_check(0, VX_WATCH))
132 #ifdef CONFIG_IA32_EMULATION
133 case VCMD_get_rlimit:
134 return __COMPAT(vc_get_rlimit, id, data, compat);
135 case VCMD_set_rlimit:
136 return __COMPAT(vc_set_rlimit, id, data, compat);
138 case VCMD_get_rlimit:
139 return vc_get_rlimit(id, data);
140 case VCMD_set_rlimit:
141 return vc_set_rlimit(id, data);
143 case VCMD_get_rlimit_mask:
144 return vc_get_rlimit_mask(id, data);
146 case VCMD_get_vhi_name:
147 return vc_get_vhi_name(id, data);
148 case VCMD_set_vhi_name:
149 return vc_set_vhi_name(id, data);
151 case VCMD_set_cflags:
152 return vc_set_cflags(id, data);
153 case VCMD_get_cflags:
154 return vc_get_cflags(id, data);
157 return vc_set_ccaps(id, data);
159 return vc_get_ccaps(id, data);
161 case VCMD_set_nflags:
162 return vc_set_nflags(id, data);
163 case VCMD_get_nflags:
164 return vc_get_nflags(id, data);
167 return vc_set_ncaps(id, data);
169 return vc_get_ncaps(id, data);
171 case VCMD_set_sched_v2:
172 return vc_set_sched_v2(id, data);
173 /* this is version 3 */
175 return vc_set_sched(id, data);
177 case VCMD_add_dlimit:
178 return __COMPAT(vc_add_dlimit, id, data, compat);
179 case VCMD_rem_dlimit:
180 return __COMPAT(vc_rem_dlimit, id, data, compat);
181 case VCMD_set_dlimit:
182 return __COMPAT(vc_set_dlimit, id, data, compat);
183 case VCMD_get_dlimit:
184 return __COMPAT(vc_get_dlimit, id, data, compat);
187 /* below here only with VX_ADMIN */
188 if (!vx_check(0, VX_ADMIN|VX_WATCH))
193 return vc_ctx_kill(id, data);
196 return vc_wait_exit(id, data);
198 case VCMD_create_context:
199 #ifdef CONFIG_VSERVER_LEGACY
200 return vc_ctx_create(id, NULL);
206 return __COMPAT(vc_get_iattr, id, data, compat);
208 return __COMPAT(vc_set_iattr, id, data, compat);
210 case VCMD_enter_namespace:
211 return vc_enter_namespace(id, data);
213 case VCMD_ctx_create_v0:
214 #ifdef CONFIG_VSERVER_LEGACY
220 return vc_ctx_create(id, NULL);
221 case VCMD_ctx_create:
222 return vc_ctx_create(id, data);
223 case VCMD_ctx_migrate_v0:
224 return vc_ctx_migrate(id, NULL);
225 case VCMD_ctx_migrate:
226 return vc_ctx_migrate(id, data);
228 case VCMD_net_create_v0:
229 return vc_net_create(id, NULL);
230 case VCMD_net_create:
231 return vc_net_create(id, data);
232 case VCMD_net_migrate:
233 return vc_net_migrate(id, data);
235 return vc_net_add(id, data);
236 case VCMD_net_remove:
237 return vc_net_remove(id, data);
244 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
246 long ret = do_vserver(cmd, id, data, 0);
248 vxdprintk(VXD_CBIT(switch, 1),
249 "vc: VCMD_%02d_%d[%d] = %08lx(%ld)",
250 VC_CATEGORY(cmd), VC_COMMAND(cmd),
251 VC_VERSION(cmd), ret, ret);
258 sys32_vserver(uint32_t cmd, uint32_t id, void __user *data)
260 long ret = do_vserver(cmd, id, data, 1);
262 vxdprintk(VXD_CBIT(switch, 1),
263 "vc: VCMD_%02d_%d[%d] = %08lx(%ld)",
264 VC_CATEGORY(cmd), VC_COMMAND(cmd),
265 VC_VERSION(cmd), ret, ret);
269 #endif /* CONFIG_COMPAT */