diff options
| author | Stephen Rothwell <sfr@canb.auug.org.au> | 2006-11-03 01:07:24 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-11-03 15:27:59 -0500 |
| commit | 3fd593979802f81ff6452596ac61e3840f917589 (patch) | |
| tree | 9ce40cdd152502426e5a7161f93a248f1da4d1fc | |
| parent | 1f6f61649d8c64d7a3a4d143405df9a7bdd4af10 (diff) | |
[PATCH] Create compat_sys_migrate_pages
This is needed on bigendian 64bit architectures.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Acked-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | include/linux/compat.h | 4 | ||||
| -rw-r--r-- | kernel/compat.c | 33 | ||||
| -rw-r--r-- | kernel/sys_ni.c | 1 |
3 files changed, 38 insertions, 0 deletions
diff --git a/include/linux/compat.h b/include/linux/compat.h index f1553196826f..80b17f440ec1 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -230,5 +230,9 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | |||
| 230 | extern int compat_printk(const char *fmt, ...); | 230 | extern int compat_printk(const char *fmt, ...); |
| 231 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | 231 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); |
| 232 | 232 | ||
| 233 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, | ||
| 234 | compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, | ||
| 235 | const compat_ulong_t __user *new_nodes); | ||
| 236 | |||
| 233 | #endif /* CONFIG_COMPAT */ | 237 | #endif /* CONFIG_COMPAT */ |
| 234 | #endif /* _LINUX_COMPAT_H */ | 238 | #endif /* _LINUX_COMPAT_H */ |
diff --git a/kernel/compat.c b/kernel/compat.c index d4898aad6cfa..6952dd057300 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
| @@ -982,4 +982,37 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages, | |||
| 982 | } | 982 | } |
| 983 | return sys_move_pages(pid, nr_pages, pages, nodes, status, flags); | 983 | return sys_move_pages(pid, nr_pages, pages, nodes, status, flags); |
| 984 | } | 984 | } |
| 985 | |||
| 986 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, | ||
| 987 | compat_ulong_t maxnode, | ||
| 988 | const compat_ulong_t __user *old_nodes, | ||
| 989 | const compat_ulong_t __user *new_nodes) | ||
| 990 | { | ||
| 991 | unsigned long __user *old = NULL; | ||
| 992 | unsigned long __user *new = NULL; | ||
| 993 | nodemask_t tmp_mask; | ||
| 994 | unsigned long nr_bits; | ||
| 995 | unsigned long size; | ||
| 996 | |||
| 997 | nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES); | ||
| 998 | size = ALIGN(nr_bits, BITS_PER_LONG) / 8; | ||
| 999 | if (old_nodes) { | ||
| 1000 | if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits)) | ||
| 1001 | return -EFAULT; | ||
| 1002 | old = compat_alloc_user_space(new_nodes ? size * 2 : size); | ||
| 1003 | if (new_nodes) | ||
| 1004 | new = old + size / sizeof(unsigned long); | ||
| 1005 | if (copy_to_user(old, nodes_addr(tmp_mask), size)) | ||
| 1006 | return -EFAULT; | ||
| 1007 | } | ||
| 1008 | if (new_nodes) { | ||
| 1009 | if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits)) | ||
| 1010 | return -EFAULT; | ||
| 1011 | if (new == NULL) | ||
| 1012 | new = compat_alloc_user_space(size); | ||
| 1013 | if (copy_to_user(new, nodes_addr(tmp_mask), size)) | ||
| 1014 | return -EFAULT; | ||
| 1015 | } | ||
| 1016 | return sys_migrate_pages(pid, nr_bits + 1, old, new); | ||
| 1017 | } | ||
| 985 | #endif | 1018 | #endif |
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 0e53314b14de..d7306d0f3dfc 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
| @@ -135,6 +135,7 @@ cond_syscall(sys_madvise); | |||
| 135 | cond_syscall(sys_mremap); | 135 | cond_syscall(sys_mremap); |
| 136 | cond_syscall(sys_remap_file_pages); | 136 | cond_syscall(sys_remap_file_pages); |
| 137 | cond_syscall(compat_sys_move_pages); | 137 | cond_syscall(compat_sys_move_pages); |
| 138 | cond_syscall(compat_sys_migrate_pages); | ||
| 138 | 139 | ||
| 139 | /* block-layer dependent */ | 140 | /* block-layer dependent */ |
| 140 | cond_syscall(sys_bdflush); | 141 | cond_syscall(sys_bdflush); |
