X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Fswitch.c;h=f35bec27cf39a0af1dc7a1666c67594b2c99928b;hb=8e8ece46a861c84343256819eaec77e608ff9217;hp=88f164c81d77b5e2504a81ba9f10ccaaa0f0eeea;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/kernel/vserver/switch.c b/kernel/vserver/switch.c index 88f164c81..f35bec27c 100644 --- a/kernel/vserver/switch.c +++ b/kernel/vserver/switch.c @@ -10,12 +10,14 @@ * V0.03 added rlimit functions * V0.04 added iattr, task/xid functions * V0.05 added debug/history stuff + * V0.06 added compat32 layer * */ #include #include #include +#include #include #include @@ -23,8 +25,8 @@ #include -static inline int -vc_get_version(uint32_t id) +static inline +int vc_get_version(uint32_t id) { return VCI_VERSION; } @@ -36,21 +38,31 @@ vc_get_version(uint32_t id) #include #include #include +#include +#include #include #include #include -#include #include -extern asmlinkage long -sys_vserver(uint32_t cmd, uint32_t id, void __user *data) +#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 + + +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", + "vc: VCMD_%02d_%d[%d], %d,%p,%d", VC_CATEGORY(cmd), VC_COMMAND(cmd), - VC_VERSION(cmd), id); + VC_VERSION(cmd), id, data, compat); #ifdef CONFIG_VSERVER_LEGACY if (!capable(CAP_CONTEXT) && @@ -152,13 +164,13 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) return vc_set_sched(id, data); case VCMD_add_dlimit: - return vc_add_dlimit(id, data); + return __COMPAT(vc_add_dlimit, id, data, compat); case VCMD_rem_dlimit: - return vc_rem_dlimit(id, data); + return __COMPAT(vc_rem_dlimit, id, data, compat); case VCMD_set_dlimit: - return vc_set_dlimit(id, data); + return __COMPAT(vc_set_dlimit, id, data, compat); case VCMD_get_dlimit: - return vc_get_dlimit(id, data); + return __COMPAT(vc_get_dlimit, id, data, compat); } /* below here only with VX_ADMIN */ @@ -174,30 +186,34 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) case VCMD_create_context: #ifdef CONFIG_VSERVER_LEGACY - return vc_ctx_create(id, data); + 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: + 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: @@ -207,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 */