X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Fswitch.c;h=88f164c81d77b5e2504a81ba9f10ccaaa0f0eeea;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=f13ee97a9de7be55bc009384781e08535b7e013b;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/kernel/vserver/switch.c b/kernel/vserver/switch.c index f13ee97a9..88f164c81 100644 --- a/kernel/vserver/switch.c +++ b/kernel/vserver/switch.c @@ -3,22 +3,24 @@ * * 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 * */ #include #include +#include #include -#include -#include +#include #include +#include static inline int @@ -27,13 +29,16 @@ vc_get_version(uint32_t id) return VCI_VERSION; } +#include +#include +#include +#include +#include +#include +#include #include -#include -#include #include -#include -#include #include #include #include @@ -42,19 +47,37 @@ vc_get_version(uint32_t id) extern asmlinkage long sys_vserver(uint32_t cmd, uint32_t id, void __user *data) { - vxdprintk(VXD_CBIT(switch, 0), "vc: VCMD_%02d_%d[%d], %d", 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 @@ -96,7 +119,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: @@ -122,6 +145,9 @@ 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); @@ -143,9 +169,14 @@ 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: +#ifdef CONFIG_VSERVER_LEGACY return vc_ctx_create(id, data); +#else + return -ENOSYS; #endif case VCMD_get_iattr: @@ -157,7 +188,7 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) 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;