Commit 3fd593979802f81ff6452596ac61e3840f917589
Committed by
Linus Torvalds
1 parent
1f6f61649d
Exists in
master
and in
20 other branches
[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>
Showing 3 changed files with 38 additions and 0 deletions Side-by-side Diff
include/linux/compat.h
... | ... | @@ -230,6 +230,10 @@ |
230 | 230 | extern int compat_printk(const char *fmt, ...); |
231 | 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 | 237 | #endif /* CONFIG_COMPAT */ |
234 | 238 | #endif /* _LINUX_COMPAT_H */ |
kernel/compat.c
... | ... | @@ -982,5 +982,38 @@ |
982 | 982 | } |
983 | 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 | 1018 | #endif |
kernel/sys_ni.c