diff options
| author | Stephen Rothwell <sfr@canb.auug.org.au> | 2006-11-02 22:07:24 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-11-03 12:27:59 -0800 | 
| 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);  extern int compat_printk(const char *fmt, ...);  extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); +asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, +		compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, +		const compat_ulong_t __user *new_nodes); +  #endif /* CONFIG_COMPAT */  #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,  	}  	return sys_move_pages(pid, nr_pages, pages, nodes, status, flags);  } + +asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, +			compat_ulong_t maxnode, +			const compat_ulong_t __user *old_nodes, +			const compat_ulong_t __user *new_nodes) +{ +	unsigned long __user *old = NULL; +	unsigned long __user *new = NULL; +	nodemask_t tmp_mask; +	unsigned long nr_bits; +	unsigned long size; + +	nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES); +	size = ALIGN(nr_bits, BITS_PER_LONG) / 8; +	if (old_nodes) { +		if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits)) +			return -EFAULT; +		old = compat_alloc_user_space(new_nodes ? size * 2 : size); +		if (new_nodes) +			new = old + size / sizeof(unsigned long); +		if (copy_to_user(old, nodes_addr(tmp_mask), size)) +			return -EFAULT; +	} +	if (new_nodes) { +		if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits)) +			return -EFAULT; +		if (new == NULL) +			new = compat_alloc_user_space(size); +		if (copy_to_user(new, nodes_addr(tmp_mask), size)) +			return -EFAULT; +	} +	return sys_migrate_pages(pid, nr_bits + 1, old, new); +}  #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);  cond_syscall(sys_mremap);  cond_syscall(sys_remap_file_pages);  cond_syscall(compat_sys_move_pages); +cond_syscall(compat_sys_migrate_pages);  /* block-layer dependent */  cond_syscall(sys_bdflush); | 
