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>
39 #include <linux/vserver/legacy.h>
40 #include <linux/vserver/namespace.h>
41 #include <linux/vserver/inode.h>
42 #include <linux/vserver/signal.h>
43 #include <linux/vserver/dlimit.h>
46 extern asmlinkage long
47 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
49 vxdprintk(VXD_CBIT(switch, 0),
50 "vc: VCMD_%02d_%d[%d], %d",
51 VC_CATEGORY(cmd), VC_COMMAND(cmd),
54 #ifdef CONFIG_VSERVER_LEGACY
55 if (!capable(CAP_CONTEXT) &&
56 /* dirty hack for capremove */
57 !(cmd==VCMD_new_s_context && id==-2))
60 if (!capable(CAP_CONTEXT))
65 case VCMD_get_version:
66 return vc_get_version(id);
68 case VCMD_dump_history:
69 #ifdef CONFIG_VSERVER_HISTORY
70 return vc_dump_history(id);
75 #ifdef CONFIG_VSERVER_LEGACY
76 case VCMD_new_s_context:
77 return vc_new_s_context(id, data);
78 case VCMD_set_ipv4root:
79 return vc_set_ipv4root(id, data);
83 return vc_task_xid(id, data);
85 return vc_vx_info(id, data);
88 return vc_task_nid(id, data);
90 return vc_nx_info(id, data);
92 case VCMD_set_namespace:
93 return vc_set_namespace(id, data);
94 case VCMD_cleanup_namespace:
95 return vc_cleanup_namespace(id, data);
98 /* those are allowed while in setup too */
99 if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
100 !vx_flags(VXF_STATE_SETUP,0))
103 #ifdef CONFIG_VSERVER_LEGACY
105 case VCMD_set_cflags:
107 if (vx_check(0, VX_WATCH))
113 case VCMD_get_rlimit:
114 return vc_get_rlimit(id, data);
115 case VCMD_set_rlimit:
116 return vc_set_rlimit(id, data);
117 case VCMD_get_rlimit_mask:
118 return vc_get_rlimit_mask(id, data);
120 case VCMD_vx_get_vhi_name:
121 return vc_get_vhi_name(id, data);
122 case VCMD_vx_set_vhi_name:
123 return vc_set_vhi_name(id, data);
125 case VCMD_set_cflags:
126 return vc_set_cflags(id, data);
127 case VCMD_get_cflags:
128 return vc_get_cflags(id, data);
131 return vc_set_ccaps(id, data);
133 return vc_get_ccaps(id, data);
135 case VCMD_set_nflags:
136 return vc_set_nflags(id, data);
137 case VCMD_get_nflags:
138 return vc_get_nflags(id, data);
141 return vc_set_ncaps(id, data);
143 return vc_get_ncaps(id, data);
145 case VCMD_set_sched_v2:
146 return vc_set_sched_v2(id, data);
147 /* this is version 3 */
149 return vc_set_sched(id, data);
151 case VCMD_add_dlimit:
152 return vc_add_dlimit(id, data);
153 case VCMD_rem_dlimit:
154 return vc_rem_dlimit(id, data);
155 case VCMD_set_dlimit:
156 return vc_set_dlimit(id, data);
157 case VCMD_get_dlimit:
158 return vc_get_dlimit(id, data);
161 /* below here only with VX_ADMIN */
162 if (!vx_check(0, VX_ADMIN|VX_WATCH))
167 return vc_ctx_kill(id, data);
170 return vc_wait_exit(id, data);
172 case VCMD_create_context:
173 #ifdef CONFIG_VSERVER_LEGACY
174 return vc_ctx_create(id, data);
180 return vc_get_iattr(id, data);
182 return vc_set_iattr(id, data);
184 case VCMD_enter_namespace:
185 return vc_enter_namespace(id, data);
187 case VCMD_ctx_create:
188 #ifdef CONFIG_VSERVER_LEGACY
194 return vc_ctx_create(id, data);
195 case VCMD_ctx_migrate:
196 return vc_ctx_migrate(id, data);
198 case VCMD_net_create:
199 return vc_net_create(id, data);
200 case VCMD_net_migrate:
201 return vc_net_migrate(id, data);