提交 d35c7b0e 编写于 作者: U Ulrich Drepper 提交者: Linus Torvalds

unified (weak) sys_pipe implementation

This replaces the duplicated arch-specific versions of "sys_pipe()" with
one unified implementation.  This removes almost 250 lines of duplicated
code.

It's marked __weak, so that *if* an architecture wants to override the
default implementation it can do so by simply having its own replacement
version, since many architectures use alternate calling conventions for
the 'pipe()' system call for legacy reasons (ie traditional UNIX
implementations often return the two file descriptors in registers)

I still haven't changed the cris version even though Linus says the BKL
isn't needed.  The arch maintainer can easily do it if there are really
no obstacles.
Signed-off-by: NUlrich Drepper <drepper@redhat.com>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 2ddcca36
...@@ -34,23 +34,6 @@ extern unsigned long do_mremap(unsigned long addr, unsigned long old_len, ...@@ -34,23 +34,6 @@ extern unsigned long do_mremap(unsigned long addr, unsigned long old_len,
unsigned long new_len, unsigned long flags, unsigned long new_len, unsigned long flags,
unsigned long new_addr); unsigned long new_addr);
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
inline long do_mmap2( inline long do_mmap2(
unsigned long addr, unsigned long len, unsigned long addr, unsigned long len,
......
...@@ -14,19 +14,6 @@ ...@@ -14,19 +14,6 @@
#include <asm/mman.h> #include <asm/mman.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
asmlinkage int sys_pipe(unsigned long __user *filedes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(filedes, fd, sizeof(fd)))
error = -EFAULT;
}
return error;
}
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, off_t offset) unsigned long fd, off_t offset)
......
...@@ -45,23 +45,6 @@ ...@@ -45,23 +45,6 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/dma.h> #include <asm/dma.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2 * sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
static inline long static inline long
do_mmap2(unsigned long addr, unsigned long len, do_mmap2(unsigned long addr, unsigned long len,
......
...@@ -28,23 +28,6 @@ ...@@ -28,23 +28,6 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage long sys_pipe(unsigned long __user * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff) unsigned long fd, unsigned long pgoff)
......
...@@ -27,23 +27,6 @@ ...@@ -27,23 +27,6 @@
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/unistd.h> #include <asm/unistd.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
static inline long do_mmap2( static inline long do_mmap2(
unsigned long addr, unsigned long len, unsigned long addr, unsigned long len,
......
...@@ -30,23 +30,6 @@ ...@@ -30,23 +30,6 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/unistd.h> #include <asm/unistd.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long __user * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
static inline long do_mmap2( static inline long do_mmap2(
unsigned long addr, unsigned long len, unsigned long addr, unsigned long len,
......
...@@ -28,23 +28,6 @@ ...@@ -28,23 +28,6 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/unistd.h> #include <asm/unistd.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
static inline long do_mmap2( static inline long do_mmap2(
unsigned long addr, unsigned long len, unsigned long addr, unsigned long len,
......
...@@ -28,23 +28,6 @@ ...@@ -28,23 +28,6 @@
#define MIN_MAP_ADDR PAGE_SIZE /* minimum fixed mmap address */ #define MIN_MAP_ADDR PAGE_SIZE /* minimum fixed mmap address */
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage long sys_pipe(unsigned long __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2 * sizeof(int)))
error = -EFAULT;
}
return error;
}
/* /*
* memory mapping syscall * memory mapping syscall
*/ */
......
...@@ -33,19 +33,6 @@ ...@@ -33,19 +33,6 @@
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/personality.h> #include <linux/personality.h>
int sys_pipe(int __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
static unsigned long get_unshared_area(unsigned long addr, unsigned long len) static unsigned long get_unshared_area(unsigned long addr, unsigned long len)
{ {
struct vm_area_struct *vma; struct vm_area_struct *vma;
......
...@@ -136,23 +136,6 @@ int sys_ipc(uint call, int first, unsigned long second, long third, ...@@ -136,23 +136,6 @@ int sys_ipc(uint call, int first, unsigned long second, long third,
return ret; return ret;
} }
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
int sys_pipe(int __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
static inline unsigned long do_mmap2(unsigned long addr, size_t len, static inline unsigned long do_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long off, int shift) unsigned long fd, unsigned long off, int shift)
......
...@@ -32,23 +32,6 @@ ...@@ -32,23 +32,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "entry.h" #include "entry.h"
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage long sys_pipe(unsigned long __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* common code for old and new mmaps */ /* common code for old and new mmaps */
static inline long do_mmap2( static inline long do_mmap2(
unsigned long addr, unsigned long len, unsigned long addr, unsigned long len,
......
...@@ -30,23 +30,6 @@ ...@@ -30,23 +30,6 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/unistd.h> #include <asm/unistd.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
/* /*
* Do a system call from kernel instead of calling sys_execve so we * Do a system call from kernel instead of calling sys_execve so we
* end up with proper pt_regs. * end up with proper pt_regs.
......
...@@ -73,23 +73,6 @@ long old_mmap(unsigned long addr, unsigned long len, ...@@ -73,23 +73,6 @@ long old_mmap(unsigned long addr, unsigned long len,
out: out:
return err; return err;
} }
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
long sys_pipe(unsigned long __user * fildes)
{
int fd[2];
long error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, sizeof(fd)))
error = -EFAULT;
}
return error;
}
long sys_uname(struct old_utsname __user * name) long sys_uname(struct old_utsname __user * name)
{ {
......
...@@ -132,23 +132,6 @@ sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth) ...@@ -132,23 +132,6 @@ sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth)
return ret; return ret;
} }
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix traditionally does this, though.
*/
int sys_pipe (int *fildes)
{
int fd[2];
int error;
error = do_pipe (fd);
if (!error) {
if (copy_to_user (fildes, fd, 2*sizeof (int)))
error = -EFAULT;
}
return error;
}
static inline unsigned long static inline unsigned long
do_mmap2 (unsigned long addr, size_t len, do_mmap2 (unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
......
...@@ -22,23 +22,6 @@ ...@@ -22,23 +22,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unistd.h> #include <asm/unistd.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long __user * fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff) unsigned long fd, unsigned long pgoff)
......
...@@ -17,23 +17,6 @@ ...@@ -17,23 +17,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/ia32.h> #include <asm/ia32.h>
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage long sys_pipe(int __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, 2*sizeof(int)))
error = -EFAULT;
}
return error;
}
asmlinkage long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, asmlinkage long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long off) unsigned long fd, unsigned long off)
{ {
......
...@@ -1075,6 +1075,23 @@ int do_pipe(int *fd) ...@@ -1075,6 +1075,23 @@ int do_pipe(int *fd)
return error; return error;
} }
/*
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though.
*/
asmlinkage long __weak sys_pipe(int __user *fildes)
{
int fd[2];
int error;
error = do_pipe(fd);
if (!error) {
if (copy_to_user(fildes, fd, sizeof(fd)))
error = -EFAULT;
}
return error;
}
/* /*
* pipefs should _never_ be mounted by userland - too much of security hassle, * pipefs should _never_ be mounted by userland - too much of security hassle,
* no real gain from having the whole whorehouse mounted. So we don't need * no real gain from having the whole whorehouse mounted. So we don't need
......
...@@ -30,7 +30,7 @@ asmlinkage int sys_fork(unsigned long p1, unsigned long p2, ...@@ -30,7 +30,7 @@ asmlinkage int sys_fork(unsigned long p1, unsigned long p2,
asmlinkage int sys_vfork(unsigned long p1, unsigned long p2, asmlinkage int sys_vfork(unsigned long p1, unsigned long p2,
unsigned long p3, unsigned long p4, unsigned long p5, unsigned long p3, unsigned long p4, unsigned long p5,
unsigned long p6, struct pt_regs *regs); unsigned long p6, struct pt_regs *regs);
asmlinkage int sys_pipe(int __user *fildes); asmlinkage long sys_pipe(int __user *fildes);
asmlinkage long sys_rt_sigaction(int sig, asmlinkage long sys_rt_sigaction(int sig,
const struct sigaction __user *act, const struct sigaction __user *act,
struct sigaction __user *oact, size_t sigsetsize); struct sigaction __user *oact, size_t sigsetsize);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册