diff options
author | Christoph Hellwig <hch@lst.de> | 2010-03-10 18:21:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-12 18:52:32 -0500 |
commit | 5d0e52830e9ae09b872567f4aca3dfb5b5918079 (patch) | |
tree | 55a199575058da551ccc837ab35a1f4826a8c5b4 /fs | |
parent | 724ee626f38feaea215a11790e1a0cb5d83b0628 (diff) |
Add generic sys_old_select()
Add a generic implementation of the old select() syscall, which expects
its argument in a memory block and switch all architectures over to use
it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Reviewed-by: H. Peter Anvin <hpa@zytor.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: James Morris <jmorris@namei.org>
Acked-by: Andreas Schwab <schwab@linux-m68k.org>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Acked-by: David Howells <dhowells@redhat.com>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/compat.c | 18 | ||||
-rw-r--r-- | fs/select.c | 17 |
2 files changed, 35 insertions, 0 deletions
diff --git a/fs/compat.c b/fs/compat.c index 00d90c2e66f0..030602d453b7 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -1795,6 +1795,24 @@ asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, | |||
1795 | return ret; | 1795 | return ret; |
1796 | } | 1796 | } |
1797 | 1797 | ||
1798 | struct compat_sel_arg_struct { | ||
1799 | compat_ulong_t n; | ||
1800 | compat_uptr_t inp; | ||
1801 | compat_uptr_t outp; | ||
1802 | compat_uptr_t exp; | ||
1803 | compat_uptr_t tvp; | ||
1804 | }; | ||
1805 | |||
1806 | asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg) | ||
1807 | { | ||
1808 | struct compat_sel_arg_struct a; | ||
1809 | |||
1810 | if (copy_from_user(&a, arg, sizeof(a))) | ||
1811 | return -EFAULT; | ||
1812 | return compat_sys_select(a.n, compat_ptr(a.inp), compat_ptr(a.outp), | ||
1813 | compat_ptr(a.exp), compat_ptr(a.tvp)); | ||
1814 | } | ||
1815 | |||
1798 | #ifdef HAVE_SET_RESTORE_SIGMASK | 1816 | #ifdef HAVE_SET_RESTORE_SIGMASK |
1799 | static long do_compat_pselect(int n, compat_ulong_t __user *inp, | 1817 | static long do_compat_pselect(int n, compat_ulong_t __user *inp, |
1800 | compat_ulong_t __user *outp, compat_ulong_t __user *exp, | 1818 | compat_ulong_t __user *outp, compat_ulong_t __user *exp, |
diff --git a/fs/select.c b/fs/select.c index 73715e90030f..500a669f7790 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -691,6 +691,23 @@ SYSCALL_DEFINE6(pselect6, int, n, fd_set __user *, inp, fd_set __user *, outp, | |||
691 | } | 691 | } |
692 | #endif /* HAVE_SET_RESTORE_SIGMASK */ | 692 | #endif /* HAVE_SET_RESTORE_SIGMASK */ |
693 | 693 | ||
694 | #ifdef __ARCH_WANT_SYS_OLD_SELECT | ||
695 | struct sel_arg_struct { | ||
696 | unsigned long n; | ||
697 | fd_set __user *inp, *outp, *exp; | ||
698 | struct timeval __user *tvp; | ||
699 | }; | ||
700 | |||
701 | SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg) | ||
702 | { | ||
703 | struct sel_arg_struct a; | ||
704 | |||
705 | if (copy_from_user(&a, arg, sizeof(a))) | ||
706 | return -EFAULT; | ||
707 | return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); | ||
708 | } | ||
709 | #endif | ||
710 | |||
694 | struct poll_list { | 711 | struct poll_list { |
695 | struct poll_list *next; | 712 | struct poll_list *next; |
696 | int len; | 713 | int len; |