Commit 3fd593979802f81ff6452596ac61e3840f917589

Authored by Stephen Rothwell
Committed by Linus Torvalds
1 parent 1f6f61649d

[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 */
... ... @@ -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
... ... @@ -135,6 +135,7 @@
135 135 cond_syscall(sys_mremap);
136 136 cond_syscall(sys_remap_file_pages);
137 137 cond_syscall(compat_sys_move_pages);
  138 +cond_syscall(compat_sys_migrate_pages);
138 139  
139 140 /* block-layer dependent */
140 141 cond_syscall(sys_bdflush);