vserver 2.0-rc4
[linux-2.6.git] / kernel / vserver / switch.c
index 90fee14..f35bec2 100644 (file)
@@ -3,59 +3,93 @@
  *
  *  Virtual Server: Syscall Switch
  *
- *  Copyright (C) 2003-2004  Herbert Pötzl
+ *  Copyright (C) 2003-2005  Herbert Pötzl
  *
  *  V0.01  syscall switch
  *  V0.02  added signal to context
  *  V0.03  added rlimit functions
  *  V0.04  added iattr, task/xid functions
+ *  V0.05  added debug/history stuff
+ *  V0.06  added compat32 layer
  *
  */
 
 #include <linux/config.h>
 #include <linux/linkage.h>
+#include <linux/sched.h>
+#include <linux/compat.h>
 #include <asm/errno.h>
 
+#include <linux/vserver/network.h>
 #include <linux/vserver/switch.h>
-#include <linux/vinline.h>
+#include <linux/vserver/debug.h>
 
 
-static inline int
-vc_get_version(uint32_t id)
+static inline
+int vc_get_version(uint32_t id)
 {
        return VCI_VERSION;
 }
 
+#include <linux/vserver/context_cmd.h>
+#include <linux/vserver/cvirt_cmd.h>
+#include <linux/vserver/limit_cmd.h>
+#include <linux/vserver/network_cmd.h>
+#include <linux/vserver/sched_cmd.h>
+#include <linux/vserver/debug_cmd.h>
+#include <linux/vserver/inode_cmd.h>
+#include <linux/vserver/dlimit_cmd.h>
+#include <linux/vserver/signal_cmd.h>
 
 #include <linux/vserver/legacy.h>
-#include <linux/vserver/context.h>
-#include <linux/vserver/network.h>
 #include <linux/vserver/namespace.h>
-#include <linux/vserver/sched.h>
-#include <linux/vserver/limit.h>
 #include <linux/vserver/inode.h>
-#include <linux/vserver/signal.h>
+#include <linux/vserver/dlimit.h>
 
 
-extern unsigned int vx_debug_switch;
+#ifdef CONFIG_COMPAT
+#define        __COMPAT(name, id, data, compat)        \
+       (compat) ? name ## _x32 (id, data) : name (id, data)
+#else
+#define        __COMPAT(name, id, data, compat)        \
+       name (id, data)
+#endif
 
 
-extern asmlinkage long
-sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
+static inline
+long do_vserver(uint32_t cmd, uint32_t id, void __user *data, int compat)
 {
+       vxdprintk(VXD_CBIT(switch, 0),
+               "vc: VCMD_%02d_%d[%d], %d,%p,%d",
+               VC_CATEGORY(cmd), VC_COMMAND(cmd),
+               VC_VERSION(cmd), id, data, compat);
 
-       if (vx_debug_switch)
-               printk( "vc: VCMD_%02d_%d[%d], %d\n",
-                       VC_CATEGORY(cmd), VC_COMMAND(cmd),
-                       VC_VERSION(cmd), id);
+#ifdef CONFIG_VSERVER_LEGACY
+       if (!capable(CAP_CONTEXT) &&
+               /* dirty hack for capremove */
+               !(cmd==VCMD_new_s_context && id==-2))
+               return -EPERM;
+#else
+       if (!capable(CAP_CONTEXT))
+               return -EPERM;
+#endif
 
        switch (cmd) {
        case VCMD_get_version:
                return vc_get_version(id);
 
-#ifdef CONFIG_VSERVER_LEGACY           
+       case VCMD_dump_history:
+#ifdef CONFIG_VSERVER_HISTORY
+               return vc_dump_history(id);
+#else
+               return -ENOSYS;
+#endif
+
+#ifdef CONFIG_VSERVER_LEGACY
        case VCMD_new_s_context:
                return vc_new_s_context(id, data);
+#endif
+#ifdef CONFIG_VSERVER_LEGACYNET
        case VCMD_set_ipv4root:
                return vc_set_ipv4root(id, data);
 #endif
@@ -97,7 +131,7 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
                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:
@@ -123,8 +157,20 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
        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 __COMPAT(vc_add_dlimit, id, data, compat);
+       case VCMD_rem_dlimit:
+               return __COMPAT(vc_rem_dlimit, id, data, compat);
+       case VCMD_set_dlimit:
+               return __COMPAT(vc_set_dlimit, id, data, compat);
+       case VCMD_get_dlimit:
+               return __COMPAT(vc_get_dlimit, id, data, compat);
        }
 
        /* below here only with VX_ADMIN */
@@ -135,30 +181,39 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
        case VCMD_ctx_kill:
                return vc_ctx_kill(id, data);
 
-#ifdef CONFIG_VSERVER_LEGACY           
+       case VCMD_wait_exit:
+               return vc_wait_exit(id, data);
+
        case VCMD_create_context:
-               return vc_ctx_create(id, data);
+#ifdef CONFIG_VSERVER_LEGACY
+               return vc_ctx_create(id, NULL);
+#else
+               return -ENOSYS;
 #endif
 
        case VCMD_get_iattr:
-               return vc_get_iattr(id, data);
+               return __COMPAT(vc_get_iattr, id, data, compat);
        case VCMD_set_iattr:
-               return vc_set_iattr(id, data);
+               return __COMPAT(vc_set_iattr, id, data, compat);
 
        case VCMD_enter_namespace:
                return vc_enter_namespace(id, data);
 
-       case VCMD_ctx_create:
-#ifdef CONFIG_VSERVER_LEGACY           
+       case VCMD_ctx_create_v0:
+#ifdef CONFIG_VSERVER_LEGACY
                if (id == 1) {
                        current->xid = 1;
                        return 1;
                }
 #endif
+               return vc_ctx_create(id, NULL);
+       case VCMD_ctx_create:
                return vc_ctx_create(id, data);
        case VCMD_ctx_migrate:
                return vc_ctx_migrate(id, data);
 
+       case VCMD_net_create_v0:
+               return vc_net_create(id, NULL);
        case VCMD_net_create:
                return vc_net_create(id, data);
        case VCMD_net_migrate:
@@ -168,3 +223,18 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
        return -ENOSYS;
 }
 
+extern asmlinkage long
+sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
+{
+       return do_vserver(cmd, id, data, 0);
+}
+
+#ifdef CONFIG_COMPAT
+
+extern asmlinkage long
+sys32_vserver(uint32_t cmd, uint32_t id, void __user *data)
+{
+       return do_vserver(cmd, id, data, 1);
+}
+
+#endif /* CONFIG_COMPAT */