* 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/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/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/namespace.h>
#include <linux/vserver/inode.h>
-#include <linux/vserver/signal.h>
#include <linux/vserver/dlimit.h>
-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) &&
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 */
#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);
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 */