#include <linux/linkage.h>
#include <asm/errno.h>
+#include <linux/vs_base.h>
+#include <linux/vs_context.h>
#include <linux/vserver/switch.h>
-#include <linux/vinline.h>
static inline int
#include <linux/vserver/limit.h>
#include <linux/vserver/inode.h>
#include <linux/vserver/signal.h>
-
-
-extern unsigned int vx_debug_switch;
+#include <linux/vserver/dlimit.h>
extern asmlinkage long
sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
{
+ if (!capable(CAP_CONTEXT))
+ return -EPERM;
- if (vx_debug_switch)
- printk( "vc: VCMD_%02d_%d[%d], %d\n",
- VC_CATEGORY(cmd), VC_COMMAND(cmd),
- VC_VERSION(cmd), id);
+ vxdprintk(VXD_CBIT(switch, 0),
+ "vc: VCMD_%02d_%d[%d], %d",
+ VC_CATEGORY(cmd), VC_COMMAND(cmd),
+ VC_VERSION(cmd), id);
switch (cmd) {
case VCMD_get_version:
return vc_get_version(id);
-#ifdef CONFIG_VSERVER_LEGACY
+#ifdef CONFIG_VSERVER_LEGACY
case VCMD_new_s_context:
return vc_new_s_context(id, data);
case VCMD_set_ipv4root:
return vc_set_rlimit(id, data);
case VCMD_get_rlimit_mask:
return vc_get_rlimit_mask(id, data);
-
+
case VCMD_vx_get_vhi_name:
return vc_get_vhi_name(id, data);
case VCMD_vx_set_vhi_name:
case VCMD_get_ncaps:
return vc_get_ncaps(id, data);
+ case VCMD_set_sched_v2:
+ return vc_set_sched_v2(id, data);
+ /* this is version 3 */
case VCMD_set_sched:
return vc_set_sched(id, data);
+
+ case VCMD_add_dlimit:
+ return vc_add_dlimit(id, data);
+ case VCMD_rem_dlimit:
+ return vc_rem_dlimit(id, data);
+ case VCMD_set_dlimit:
+ return vc_set_dlimit(id, data);
+ case VCMD_get_dlimit:
+ return vc_get_dlimit(id, data);
}
/* below here only with VX_ADMIN */
case VCMD_ctx_kill:
return vc_ctx_kill(id, data);
-#ifdef CONFIG_VSERVER_LEGACY
+ case VCMD_wait_exit:
+ return vc_wait_exit(id, data);
+
+#ifdef CONFIG_VSERVER_LEGACY
case VCMD_create_context:
return vc_ctx_create(id, data);
#endif
return vc_enter_namespace(id, data);
case VCMD_ctx_create:
-#ifdef CONFIG_VSERVER_LEGACY
+#ifdef CONFIG_VSERVER_LEGACY
if (id == 1) {
current->xid = 1;
return 1;