The definition of the third parameter is a pointer to an array of virtual
addresses which give us some trouble. The existing code calculated the
wrong address in the array since I used void to avoid having to specify a
type.
I now use the correct type "compat_uptr_t __user *" in the definition of
the function in kernel/compat.c.
However, I used __u32 in syscalls.h. Would have to include compat.h there
in order to provide the same definition which would generate an ugly
include situation.
On both ia64 and x86_64 compat_uptr_t is u32. So this works although
parameter declarations differ.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
int __user *status,
int flags);
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
- void __user *pages,
+ __u32 __user *pages,
const int __user *nodes,
int __user *status,
int flags);
#ifdef CONFIG_NUMA
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
- void __user *pages32,
+ compat_uptr_t __user *pages32,
const int __user *nodes,
int __user *status,
int flags)
for (i = 0; i < nr_pages; i++) {
compat_uptr_t p;
- if (get_user(p, (compat_uptr_t *)(pages32 + i)) ||
+ if (get_user(p, pages32 + i) ||
put_user(compat_ptr(p), pages + i))
return -EFAULT;
}