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
16 #include <linux/config.h>
17 #include <linux/linkage.h>
18 #include <linux/sched.h>
19 #include <asm/errno.h>
21 #include <linux/vserver/network.h>
22 #include <linux/vserver/switch.h>
23 #include <linux/vserver/debug.h>
27 vc_get_version(uint32_t id)
32 #include <linux/vserver/context_cmd.h>
33 #include <linux/vserver/cvirt_cmd.h>
34 #include <linux/vserver/limit_cmd.h>
35 #include <linux/vserver/network_cmd.h>
36 #include <linux/vserver/sched_cmd.h>
37 #include <linux/vserver/debug_cmd.h>
38 #include <linux/vserver/inode_cmd.h>
40 #include <linux/vserver/legacy.h>
41 #include <linux/vserver/namespace.h>
42 #include <linux/vserver/inode.h>
43 #include <linux/vserver/signal.h>
44 #include <linux/vserver/dlimit.h>
47 extern asmlinkage long
48 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
50 vxdprintk(VXD_CBIT(switch, 0),
51 "vc: VCMD_%02d_%d[%d], %d",
52 VC_CATEGORY(cmd), VC_COMMAND(cmd),
55 #ifdef CONFIG_VSERVER_LEGACY
56 if (!capable(CAP_CONTEXT) &&
57 /* dirty hack for capremove */
58 !(cmd==VCMD_new_s_context && id==-2))
61 if (!capable(CAP_CONTEXT))
66 case VCMD_get_version:
67 return vc_get_version(id);
69 case VCMD_dump_history:
70 #ifdef CONFIG_VSERVER_HISTORY
71 return vc_dump_history(id);
76 #ifdef CONFIG_VSERVER_LEGACY
77 case VCMD_new_s_context:
78 return vc_new_s_context(id, data);
80 #ifdef CONFIG_VSERVER_LEGACYNET
81 case VCMD_set_ipv4root:
82 return vc_set_ipv4root(id, data);
86 return vc_task_xid(id, data);
88 return vc_vx_info(id, data);
91 return vc_task_nid(id, data);
93 return vc_nx_info(id, data);
95 case VCMD_set_namespace:
96 return vc_set_namespace(id, data);
97 case VCMD_cleanup_namespace:
98 return vc_cleanup_namespace(id, data);
101 /* those are allowed while in setup too */
102 if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
103 !vx_flags(VXF_STATE_SETUP,0))
106 #ifdef CONFIG_VSERVER_LEGACY
108 case VCMD_set_cflags:
110 if (vx_check(0, VX_WATCH))
116 case VCMD_get_rlimit:
117 return vc_get_rlimit(id, data);
118 case VCMD_set_rlimit:
119 return vc_set_rlimit(id, data);
120 case VCMD_get_rlimit_mask:
121 return vc_get_rlimit_mask(id, data);
123 case VCMD_vx_get_vhi_name:
124 return vc_get_vhi_name(id, data);
125 case VCMD_vx_set_vhi_name:
126 return vc_set_vhi_name(id, data);
128 case VCMD_set_cflags:
129 return vc_set_cflags(id, data);
130 case VCMD_get_cflags:
131 return vc_get_cflags(id, data);
134 return vc_set_ccaps(id, data);
136 return vc_get_ccaps(id, data);
138 case VCMD_set_nflags:
139 return vc_set_nflags(id, data);
140 case VCMD_get_nflags:
141 return vc_get_nflags(id, data);
144 return vc_set_ncaps(id, data);
146 return vc_get_ncaps(id, data);
148 case VCMD_set_sched_v2:
149 return vc_set_sched_v2(id, data);
150 /* this is version 3 */
152 return vc_set_sched(id, data);
154 case VCMD_add_dlimit:
155 return vc_add_dlimit(id, data);
156 case VCMD_rem_dlimit:
157 return vc_rem_dlimit(id, data);
158 case VCMD_set_dlimit:
159 return vc_set_dlimit(id, data);
160 case VCMD_get_dlimit:
161 return vc_get_dlimit(id, data);
164 /* below here only with VX_ADMIN */
165 if (!vx_check(0, VX_ADMIN|VX_WATCH))
170 return vc_ctx_kill(id, data);
173 return vc_wait_exit(id, data);
175 case VCMD_create_context:
176 #ifdef CONFIG_VSERVER_LEGACY
177 return vc_ctx_create(id, data);
183 return vc_get_iattr(id, data);
185 return vc_set_iattr(id, data);
187 case VCMD_enter_namespace:
188 return vc_enter_namespace(id, data);
190 case VCMD_ctx_create:
191 #ifdef CONFIG_VSERVER_LEGACY
197 return vc_ctx_create(id, data);
198 case VCMD_ctx_migrate:
199 return vc_ctx_migrate(id, data);
201 case VCMD_net_create:
202 return vc_net_create(id, data);
203 case VCMD_net_migrate:
204 return vc_net_migrate(id, data);