VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / kernel / vserver / switch.c
1 /*
2  *  linux/kernel/vserver/switch.c
3  *
4  *  Virtual Server: Syscall Switch
5  *
6  *  Copyright (C) 2003-2004  Herbert Pƶtzl
7  *
8  *  V0.01  syscall switch
9  *  V0.02  added signal to context
10  *  V0.03  added rlimit functions
11  *  V0.04  added iattr, task/xid functions
12  *
13  */
14
15 #include <linux/config.h>
16 #include <linux/linkage.h>
17 #include <asm/errno.h>
18
19 #include <linux/vs_base.h>
20 #include <linux/vs_context.h>
21 #include <linux/vserver/switch.h>
22
23
24 static inline int
25 vc_get_version(uint32_t id)
26 {
27         return VCI_VERSION;
28 }
29
30
31 #include <linux/vserver/legacy.h>
32 #include <linux/vserver/context.h>
33 #include <linux/vserver/network.h>
34 #include <linux/vserver/namespace.h>
35 #include <linux/vserver/sched.h>
36 #include <linux/vserver/limit.h>
37 #include <linux/vserver/inode.h>
38 #include <linux/vserver/signal.h>
39 #include <linux/vserver/dlimit.h>
40
41
42 extern asmlinkage long
43 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
44 {
45
46         vxdprintk(VXD_CBIT(switch, 0),
47                 "vc: VCMD_%02d_%d[%d], %d",
48                 VC_CATEGORY(cmd), VC_COMMAND(cmd),
49                 VC_VERSION(cmd), id);
50
51         switch (cmd) {
52         case VCMD_get_version:
53                 return vc_get_version(id);
54
55 #ifdef  CONFIG_VSERVER_LEGACY           
56         case VCMD_new_s_context:
57                 return vc_new_s_context(id, data);
58         case VCMD_set_ipv4root:
59                 return vc_set_ipv4root(id, data);
60 #endif
61
62         case VCMD_task_xid:
63                 return vc_task_xid(id, data);
64         case VCMD_vx_info:
65                 return vc_vx_info(id, data);
66
67         case VCMD_task_nid:
68                 return vc_task_nid(id, data);
69         case VCMD_nx_info:
70                 return vc_nx_info(id, data);
71
72         case VCMD_set_namespace:
73                 return vc_set_namespace(id, data);
74         case VCMD_cleanup_namespace:
75                 return vc_cleanup_namespace(id, data);
76         }
77
78         /* those are allowed while in setup too */
79         if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
80                 !vx_flags(VXF_STATE_SETUP,0))
81                 return -EPERM;
82
83 #ifdef  CONFIG_VSERVER_LEGACY
84         switch (cmd) {
85         case VCMD_set_cflags:
86         case VCMD_set_ccaps:
87                 if (vx_check(0, VX_WATCH))
88                         return 0;
89         }
90 #endif
91
92         switch (cmd) {
93         case VCMD_get_rlimit:
94                 return vc_get_rlimit(id, data);
95         case VCMD_set_rlimit:
96                 return vc_set_rlimit(id, data);
97         case VCMD_get_rlimit_mask:
98                 return vc_get_rlimit_mask(id, data);
99                 
100         case VCMD_vx_get_vhi_name:
101                 return vc_get_vhi_name(id, data);
102         case VCMD_vx_set_vhi_name:
103                 return vc_set_vhi_name(id, data);
104
105         case VCMD_set_cflags:
106                 return vc_set_cflags(id, data);
107         case VCMD_get_cflags:
108                 return vc_get_cflags(id, data);
109
110         case VCMD_set_ccaps:
111                 return vc_set_ccaps(id, data);
112         case VCMD_get_ccaps:
113                 return vc_get_ccaps(id, data);
114
115         case VCMD_set_nflags:
116                 return vc_set_nflags(id, data);
117         case VCMD_get_nflags:
118                 return vc_get_nflags(id, data);
119
120         case VCMD_set_ncaps:
121                 return vc_set_ncaps(id, data);
122         case VCMD_get_ncaps:
123                 return vc_get_ncaps(id, data);
124
125         case VCMD_set_sched:
126                 return vc_set_sched(id, data);
127
128         case VCMD_add_dlimit:
129                 return vc_add_dlimit(id, data);
130         case VCMD_rem_dlimit:
131                 return vc_rem_dlimit(id, data);
132         case VCMD_set_dlimit:
133                 return vc_set_dlimit(id, data);
134         case VCMD_get_dlimit:
135                 return vc_get_dlimit(id, data);
136         }
137
138         /* below here only with VX_ADMIN */
139         if (!vx_check(0, VX_ADMIN|VX_WATCH))
140                 return -EPERM;
141
142         switch (cmd) {
143         case VCMD_ctx_kill:
144                 return vc_ctx_kill(id, data);
145
146 #ifdef  CONFIG_VSERVER_LEGACY           
147         case VCMD_create_context:
148                 return vc_ctx_create(id, data);
149 #endif
150
151         case VCMD_get_iattr:
152                 return vc_get_iattr(id, data);
153         case VCMD_set_iattr:
154                 return vc_set_iattr(id, data);
155
156         case VCMD_enter_namespace:
157                 return vc_enter_namespace(id, data);
158
159         case VCMD_ctx_create:
160 #ifdef  CONFIG_VSERVER_LEGACY           
161                 if (id == 1) {
162                         current->xid = 1;
163                         return 1;
164                 }
165 #endif
166                 return vc_ctx_create(id, data);
167         case VCMD_ctx_migrate:
168                 return vc_ctx_migrate(id, data);
169
170         case VCMD_net_create:
171                 return vc_net_create(id, data);
172         case VCMD_net_migrate:
173                 return vc_net_migrate(id, data);
174
175         }
176         return -ENOSYS;
177 }
178