diff options
46 files changed, 109 insertions, 907 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 9a3334ae282..62619f25132 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -178,25 +178,18 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,  		unsigned long, prot, unsigned long, flags, unsigned long, fd,  		unsigned long, off)  { -	struct file *file = NULL; -	unsigned long ret = -EBADF; +	unsigned long ret = -EINVAL;  #if 0  	if (flags & (_MAP_HASSEMAPHORE | _MAP_INHERIT | _MAP_UNALIGNED))  		printk("%s: unimplemented OSF mmap flags %04lx\n",   			current->comm, flags);  #endif -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	down_write(¤t->mm->mmap_sem); -	ret = do_mmap(file, addr, len, prot, flags, off); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); +	if ((off + PAGE_ALIGN(len)) < off) +		goto out; +	if (off & ~PAGE_MASK) +		goto out; +	ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);   out:  	return ret;  } diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f0fe95b7085..2c1db77d784 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -416,12 +416,12 @@ sys_mmap2:  		tst	r5, #PGOFF_MASK  		moveq	r5, r5, lsr #PAGE_SHIFT - 12  		streq	r5, [sp, #4] -		beq	do_mmap2 +		beq	sys_mmap_pgoff  		mov	r0, #-EINVAL  		mov	pc, lr  #else  		str	r5, [sp, #4] -		b	do_mmap2 +		b	sys_mmap_pgoff  #endif  ENDPROC(sys_mmap2) diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index 3b897444a9b..ae4027bd01b 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c @@ -28,34 +28,6 @@  #include <linux/ipc.h>  #include <linux/uaccess.h> -/* common code for old and new mmaps */ -inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	int error = -EINVAL; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	error = -EBADF; -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  struct mmap_arg_struct {  	unsigned long addr;  	unsigned long len; @@ -77,7 +49,7 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);  out:  	return error;  } diff --git a/arch/avr32/include/asm/syscalls.h b/arch/avr32/include/asm/syscalls.h index 483d666c27c..66a19726663 100644 --- a/arch/avr32/include/asm/syscalls.h +++ b/arch/avr32/include/asm/syscalls.h @@ -29,10 +29,6 @@ asmlinkage int sys_sigaltstack(const stack_t __user *, stack_t __user *,  			       struct pt_regs *);  asmlinkage int sys_rt_sigreturn(struct pt_regs *); -/* kernel/sys_avr32.c */ -asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long, -			  unsigned long, unsigned long, off_t); -  /* mm/cache.c */  asmlinkage int sys_cacheflush(int, void __user *, size_t); diff --git a/arch/avr32/kernel/sys_avr32.c b/arch/avr32/kernel/sys_avr32.c index 5d2daeaf356..459349b5ed5 100644 --- a/arch/avr32/kernel/sys_avr32.c +++ b/arch/avr32/kernel/sys_avr32.c @@ -5,39 +5,8 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#include <linux/errno.h> -#include <linux/fs.h> -#include <linux/file.h> -#include <linux/mm.h>  #include <linux/unistd.h> -#include <asm/mman.h> -#include <asm/uaccess.h> -#include <asm/syscalls.h> - -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -			  unsigned long prot, unsigned long flags, -			  unsigned long fd, off_t offset) -{ -	int error = -EBADF; -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			return error; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, offset); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -	return error; -} -  int kernel_execve(const char *file, char **argv, char **envp)  {  	register long scno asm("r8") = __NR_execve; diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index f7244cd02fb..0447a3e2ba6 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S @@ -61,7 +61,7 @@ __sys_execve:  __sys_mmap2:  	pushm	lr  	st.w	--sp, ARG6 -	call	sys_mmap2 +	call	sys_mmap_pgoff  	sub	sp, -4  	popm	pc diff --git a/arch/blackfin/kernel/sys_bfin.c b/arch/blackfin/kernel/sys_bfin.c index afcef129d4e..2e7f8e10bf8 100644 --- a/arch/blackfin/kernel/sys_bfin.c +++ b/arch/blackfin/kernel/sys_bfin.c @@ -22,39 +22,6 @@  #include <asm/cacheflush.h>  #include <asm/dma.h> -/* common code for old and new mmaps */ -static inline long -do_mmap2(unsigned long addr, unsigned long len, -	 unsigned long prot, unsigned long flags, -	 unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); - out: -	return error; -} - -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -			  unsigned long prot, unsigned long flags, -			  unsigned long fd, unsigned long pgoff) -{ -	return do_mmap2(addr, len, prot, flags, fd, pgoff); -} -  asmlinkage void *sys_sram_alloc(size_t size, unsigned long flags)  {  	return sram_alloc_with_lsl(size, flags); diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index a50637a8b9b..f3f8bb46b51 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S @@ -1422,7 +1422,7 @@ ENTRY(_sys_call_table)  	.long _sys_ni_syscall	/* streams2 */  	.long _sys_vfork		/* 190 */  	.long _sys_getrlimit -	.long _sys_mmap2 +	.long _sys_mmap_pgoff  	.long _sys_truncate64  	.long _sys_ftruncate64  	.long _sys_stat64	/* 195 */ diff --git a/arch/cris/kernel/sys_cris.c b/arch/cris/kernel/sys_cris.c index 2ad962c7e88..c2bbb1ac98a 100644 --- a/arch/cris/kernel/sys_cris.c +++ b/arch/cris/kernel/sys_cris.c @@ -26,31 +26,6 @@  #include <asm/uaccess.h>  #include <asm/segment.h> -/* common code for old and new mmaps */ -static inline long -do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, -        unsigned long flags, unsigned long fd, unsigned long pgoff) -{ -        int error = -EBADF; -        struct file * file = NULL; - -        flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -        if (!(flags & MAP_ANONYMOUS)) { -                file = fget(fd); -                if (!file) -                        goto out; -        } - -        down_write(¤t->mm->mmap_sem); -        error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -        up_write(¤t->mm->mmap_sem); - -        if (file) -                fput(file); -out: -        return error; -} -  asmlinkage unsigned long old_mmap(unsigned long __user *args)  {          	unsigned long buffer[6]; @@ -63,7 +38,7 @@ asmlinkage unsigned long old_mmap(unsigned long __user *args)  	if (buffer[5] & ~PAGE_MASK) /* verify that offset is on page boundary */  		goto out; -	err = do_mmap2(buffer[0], buffer[1], buffer[2], buffer[3], +	err = sys_mmap_pgoff(buffer[0], buffer[1], buffer[2], buffer[3],                         buffer[4], buffer[5] >> PAGE_SHIFT);  out:  	return err; @@ -73,7 +48,8 @@ asmlinkage long  sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,            unsigned long flags, unsigned long fd, unsigned long pgoff)  { -        return do_mmap2(addr, len, prot, flags, fd, pgoff); +	/* bug(?): 8Kb pages here */ +        return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);  }  /* diff --git a/arch/frv/kernel/sys_frv.c b/arch/frv/kernel/sys_frv.c index 2b6b5289cdc..1d3d4c9e252 100644 --- a/arch/frv/kernel/sys_frv.c +++ b/arch/frv/kernel/sys_frv.c @@ -31,9 +31,6 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,  			  unsigned long prot, unsigned long flags,  			  unsigned long fd, unsigned long pgoff)  { -	int error = -EBADF; -	struct file * file = NULL; -  	/* As with sparc32, make sure the shift for mmap2 is constant  	   (12), no matter what PAGE_SIZE we have.... */ @@ -41,69 +38,10 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,  	   trying to map something we can't */  	if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1))  		return -EINVAL; -	pgoff >>= PAGE_SHIFT - 12; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} - -#if 0 /* DAVIDM - do we want this */ -struct mmap_arg_struct64 { -	__u32 addr; -	__u32 len; -	__u32 prot; -	__u32 flags; -	__u64 offset; /* 64 bits */ -	__u32 fd; -}; - -asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg) -{ -	int error = -EFAULT; -	struct file * file = NULL; -	struct mmap_arg_struct64 a; -	unsigned long pgoff; - -	if (copy_from_user(&a, arg, sizeof(a))) -		return -EFAULT; - -	if ((long)a.offset & ~PAGE_MASK) -		return -EINVAL; - -	pgoff = a.offset >> PAGE_SHIFT; -	if ((a.offset >> PAGE_SHIFT) != pgoff) -		return -EINVAL; - -	if (!(a.flags & MAP_ANONYMOUS)) { -		error = -EBADF; -		file = fget(a.fd); -		if (!file) -			goto out; -	} -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); -out: -	return error; +	return sys_mmap_pgoff(addr, len, prot, flags, fd, +			      pgoff >> (PAGE_SHIFT - 12));  } -#endif  /*   * sys_ipc() is the de-multiplexer for the SysV IPC calls.. diff --git a/arch/h8300/kernel/sys_h8300.c b/arch/h8300/kernel/sys_h8300.c index 8cb5d73a0e3..b5969db0ca1 100644 --- a/arch/h8300/kernel/sys_h8300.c +++ b/arch/h8300/kernel/sys_h8300.c @@ -26,39 +26,6 @@  #include <asm/traps.h>  #include <asm/unistd.h> -/* common code for old and new mmaps */ -static inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} - -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	return do_mmap2(addr, len, prot, flags, fd, pgoff); -} -  /*   * Perform the select(nd, in, out, ex, tv) and mmap() system   * calls. Linux/m68k cloned Linux/i386, which didn't use to be able to @@ -87,57 +54,11 @@ asmlinkage int old_mmap(struct mmap_arg_struct *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); -out: -	return error; -} - -#if 0 /* DAVIDM - do we want this */ -struct mmap_arg_struct64 { -	__u32 addr; -	__u32 len; -	__u32 prot; -	__u32 flags; -	__u64 offset; /* 64 bits */ -	__u32 fd; -}; - -asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg) -{ -	int error = -EFAULT; -	struct file * file = NULL; -	struct mmap_arg_struct64 a; -	unsigned long pgoff; - -	if (copy_from_user(&a, arg, sizeof(a))) -		return -EFAULT; - -	if ((long)a.offset & ~PAGE_MASK) -		return -EINVAL; - -	pgoff = a.offset >> PAGE_SHIFT; -	if ((a.offset >> PAGE_SHIFT) != pgoff) -		return -EINVAL; - -	if (!(a.flags & MAP_ANONYMOUS)) { -		error = -EBADF; -		file = fget(a.fd); -		if (!file) -			goto out; -	} -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, +			       a.offset >> PAGE_SHIFT);  out:  	return error;  } -#endif  struct sel_arg_struct {  	unsigned long n; diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S index 4eb67faac63..2d69881eda6 100644 --- a/arch/h8300/kernel/syscalls.S +++ b/arch/h8300/kernel/syscalls.S @@ -206,7 +206,7 @@ SYMBOL_NAME_LABEL(sys_call_table)  	.long SYMBOL_NAME(sys_ni_syscall)	/* streams2 */  	.long SYMBOL_NAME(sys_vfork)            /* 190 */  	.long SYMBOL_NAME(sys_getrlimit) -	.long SYMBOL_NAME(sys_mmap2) +	.long SYMBOL_NAME(sys_mmap_pgoff)  	.long SYMBOL_NAME(sys_truncate64)  	.long SYMBOL_NAME(sys_ftruncate64)  	.long SYMBOL_NAME(sys_stat64)		/* 195 */ diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c index 92ed83f3403..ae384a2974c 100644 --- a/arch/ia64/kernel/sys_ia64.c +++ b/arch/ia64/kernel/sys_ia64.c @@ -185,39 +185,6 @@ int ia64_mmap_check(unsigned long addr, unsigned long len,  	return 0;  } -static inline unsigned long -do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff) -{ -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			return -EBADF; - -		if (!file->f_op || !file->f_op->mmap) { -			addr = -ENODEV; -			goto out; -		} -	} - -	/* Careful about overflows.. */ -	len = PAGE_ALIGN(len); -	if (!len || len > TASK_SIZE) { -		addr = -EINVAL; -		goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -out:	if (file) -		fput(file); -	return addr; -} -  /*   * mmap2() is like mmap() except that the offset is expressed in units   * of PAGE_SIZE (instead of bytes).  This allows to mmap2() (pieces @@ -226,7 +193,7 @@ out:	if (file)  asmlinkage unsigned long  sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff)  { -	addr = do_mmap2(addr, len, prot, flags, fd, pgoff); +	addr = sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);  	if (!IS_ERR((void *) addr))  		force_successful_syscall_return();  	return addr; @@ -238,7 +205,7 @@ sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, lo  	if (offset_in_page(off) != 0)  		return -EINVAL; -	addr = do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT); +	addr = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);  	if (!IS_ERR((void *) addr))  		force_successful_syscall_return();  	return addr; diff --git a/arch/m32r/kernel/sys_m32r.c b/arch/m32r/kernel/sys_m32r.c index 305ac852bbe..d3c865c5a6b 100644 --- a/arch/m32r/kernel/sys_m32r.c +++ b/arch/m32r/kernel/sys_m32r.c @@ -76,30 +76,6 @@ asmlinkage int sys_tas(int __user *addr)  	return oldval;  } -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  /*   * sys_ipc() is the de-multiplexer for the SysV IPC calls..   * diff --git a/arch/m32r/kernel/syscall_table.S b/arch/m32r/kernel/syscall_table.S index aa3bf4cfab3..60536e27123 100644 --- a/arch/m32r/kernel/syscall_table.S +++ b/arch/m32r/kernel/syscall_table.S @@ -191,7 +191,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall		/* streams2 */  	.long sys_vfork			/* 190 */  	.long sys_getrlimit -	.long sys_mmap2 +	.long sys_mmap_pgoff  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64		/* 195 */ diff --git a/arch/m68k/kernel/sys_m68k.c b/arch/m68k/kernel/sys_m68k.c index 7deb402bfc7..218f441de66 100644 --- a/arch/m68k/kernel/sys_m68k.c +++ b/arch/m68k/kernel/sys_m68k.c @@ -29,37 +29,16 @@  #include <asm/page.h>  #include <asm/unistd.h> -/* common code for old and new mmaps */ -static inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags,  	unsigned long fd, unsigned long pgoff)  { -	return do_mmap2(addr, len, prot, flags, fd, pgoff); +	/* +	 * This is wrong for sun3 - there PAGE_SIZE is 8Kb, +	 * so we need to shift the argument down by 1; m68k mmap64(3) +	 * (in libc) expects the last argument of mmap2 in 4Kb units. +	 */ +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);  }  /* @@ -90,57 +69,11 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); -out: -	return error; -} - -#if 0 -struct mmap_arg_struct64 { -	__u32 addr; -	__u32 len; -	__u32 prot; -	__u32 flags; -	__u64 offset; /* 64 bits */ -	__u32 fd; -}; - -asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg) -{ -	int error = -EFAULT; -	struct file * file = NULL; -	struct mmap_arg_struct64 a; -	unsigned long pgoff; - -	if (copy_from_user(&a, arg, sizeof(a))) -		return -EFAULT; - -	if ((long)a.offset & ~PAGE_MASK) -		return -EINVAL; - -	pgoff = a.offset >> PAGE_SHIFT; -	if ((a.offset >> PAGE_SHIFT) != pgoff) -		return -EINVAL; - -	if (!(a.flags & MAP_ANONYMOUS)) { -		error = -EBADF; -		file = fget(a.fd); -		if (!file) -			goto out; -	} -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, +			       a.offset >> PAGE_SHIFT);  out:  	return error;  } -#endif  struct sel_arg_struct {  	unsigned long n; diff --git a/arch/m68knommu/kernel/sys_m68k.c b/arch/m68knommu/kernel/sys_m68k.c index efdd090778a..b67cbc735a9 100644 --- a/arch/m68knommu/kernel/sys_m68k.c +++ b/arch/m68knommu/kernel/sys_m68k.c @@ -27,39 +27,6 @@  #include <asm/cacheflush.h>  #include <asm/unistd.h> -/* common code for old and new mmaps */ -static inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} - -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	return do_mmap2(addr, len, prot, flags, fd, pgoff); -} -  /*   * Perform the select(nd, in, out, ex, tv) and mmap() system   * calls. Linux/m68k cloned Linux/i386, which didn't use to be able to @@ -88,9 +55,8 @@ asmlinkage int old_mmap(struct mmap_arg_struct *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, +				a.offset >> PAGE_SHIFT);  out:  	return error;  } diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S index 23535cc415a..486837efa3d 100644 --- a/arch/m68knommu/kernel/syscalltable.S +++ b/arch/m68knommu/kernel/syscalltable.S @@ -210,7 +210,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall	/* streams2 */  	.long sys_vfork		/* 190 */  	.long sys_getrlimit -	.long sys_mmap2 +	.long sys_mmap_pgoff  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64	/* 195 */ diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c index 07cabed4b94..9f3c205fb75 100644 --- a/arch/microblaze/kernel/sys_microblaze.c +++ b/arch/microblaze/kernel/sys_microblaze.c @@ -62,46 +62,14 @@ out:  	return error;  } -asmlinkage long -sys_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	struct file *file = NULL; -	int ret = -EBADF; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) { -			printk(KERN_INFO "no fd in mmap\r\n"); -			goto out; -		} -	} - -	down_write(¤t->mm->mmap_sem); -	ret = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); -out: -	return ret; -} -  asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  			unsigned long prot, unsigned long flags,  			unsigned long fd, off_t pgoff)  { -	int err = -EINVAL; - -	if (pgoff & ~PAGE_MASK) { -		printk(KERN_INFO "no pagemask in mmap\r\n"); -		goto out; -	} +	if (pgoff & ~PAGE_MASK) +		return -EINVAL; -	err = sys_mmap2(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT); -out: -	return err; +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);  }  /* diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S index c1ab1dc1089..b96f365ea6b 100644 --- a/arch/microblaze/kernel/syscall_table.S +++ b/arch/microblaze/kernel/syscall_table.S @@ -196,7 +196,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall		/* reserved for streams2 */  	.long sys_vfork		/* 190 */  	.long sys_getrlimit -	.long sys_mmap2			/* mmap2 */ +	.long sys_mmap_pgoff		/* mmap2 */  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64		/* 195 */ diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 1a2793efdc4..f042563c924 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -67,28 +67,13 @@ SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,  	unsigned long, prot, unsigned long, flags, unsigned long, fd,  	unsigned long, pgoff)  { -	struct file * file = NULL;  	unsigned long error;  	error = -EINVAL;  	if (pgoff & (~PAGE_MASK >> 12))  		goto out; -	pgoff >>= PAGE_SHIFT-12; - -	if (!(flags & MAP_ANONYMOUS)) { -		error = -EBADF; -		file = fget(fd); -		if (!file) -			goto out; -	} -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); - +	error = sys_mmap_pgoff(addr, len, prot, flags, fd, +			       pgoff >> (PAGE_SHIFT-12));  out:  	return error;  } diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index fe0d7980560..c25b2e7dcb7 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -129,31 +129,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,  	}  } -/* common code for old and new mmaps */ -static inline unsigned long -do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, -        unsigned long flags, unsigned long fd, unsigned long pgoff) -{ -	unsigned long error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,  	unsigned long, prot, unsigned long, flags, unsigned long,  	fd, off_t, offset) @@ -164,7 +139,7 @@ SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,  	if (offset & ~PAGE_MASK)  		goto out; -	result = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +	result = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);  out:  	return result; @@ -177,7 +152,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,  	if (pgoff & (~PAGE_MASK >> 12))  		return -EINVAL; -	return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12)); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12));  }  save_static_function(sys_fork); diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index a94e7ea3faa..c9ee6c009d7 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S @@ -578,7 +578,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall	/* reserved for streams2 */  	.long sys_vfork		/* 190 */  	.long sys_getrlimit -	.long sys_mmap2 +	.long sys_mmap_pgoff  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64	/* 195 */ diff --git a/arch/mn10300/kernel/sys_mn10300.c b/arch/mn10300/kernel/sys_mn10300.c index ec4100dfcb7..17cc6ce04e8 100644 --- a/arch/mn10300/kernel/sys_mn10300.c +++ b/arch/mn10300/kernel/sys_mn10300.c @@ -23,42 +23,13 @@  #include <asm/uaccess.h> -/* - * memory mapping syscall - */ -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -			  unsigned long prot, unsigned long flags, -			  unsigned long fd, unsigned long pgoff) -{ -	struct file *file = NULL; -	long error = -EINVAL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	error = -EBADF; -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  asmlinkage long old_mmap(unsigned long addr, unsigned long len,  			 unsigned long prot, unsigned long flags,  			 unsigned long fd, unsigned long offset)  {  	if (offset & ~PAGE_MASK)  		return -EINVAL; -	return sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);  }  struct sel_arg_struct { diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index 71b31957c8f..9147391afb0 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c @@ -110,37 +110,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,  	return addr;  } -static unsigned long do_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, unsigned long fd, -	unsigned long pgoff) -{ -	struct file * file = NULL; -	unsigned long error = -EBADF; -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file != NULL) -		fput(file); -out: -	return error; -} -  asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags, unsigned long fd,  	unsigned long pgoff)  {  	/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE  	   we have. */ -	return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT - 12)); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, +			      pgoff >> (PAGE_SHIFT - 12));  }  asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, @@ -148,7 +125,8 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,  		unsigned long offset)  {  	if (!(offset & ~PAGE_MASK)) { -		return do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +		return sys_mmap_pgoff(addr, len, prot, flags, fd, +					offset >> PAGE_SHIFT);  	} else {  		return -EINVAL;  	} diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c index c04832c4a02..3370e62e43d 100644 --- a/arch/powerpc/kernel/syscalls.c +++ b/arch/powerpc/kernel/syscalls.c @@ -140,7 +140,6 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len,  			unsigned long prot, unsigned long flags,  			unsigned long fd, unsigned long off, int shift)  { -	struct file * file = NULL;  	unsigned long ret = -EINVAL;  	if (!arch_validate_prot(prot)) @@ -151,20 +150,8 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len,  			goto out;  		off >>= shift;  	} -		 -	ret = -EBADF; -	if (!(flags & MAP_ANONYMOUS)) { -		if (!(file = fget(fd))) -			goto out; -	} - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	down_write(¤t->mm->mmap_sem); -	ret = do_mmap_pgoff(file, addr, len, prot, flags, off); -	up_write(¤t->mm->mmap_sem); -	if (file) -		fput(file); +	ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off);  out:  	return ret;  } diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 11556aa6bf1..22c9e557bb2 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -624,33 +624,6 @@ struct mmap_arg_struct_emu31 {  	u32	offset;  }; -/* common code for old and new mmaps */ -static inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	struct file * file = NULL; -	unsigned long error = -EBADF; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out:     -	return error; -} - -  asmlinkage unsigned long  old32_mmap(struct mmap_arg_struct_emu31 __user *arg)  { @@ -664,7 +637,8 @@ old32_mmap(struct mmap_arg_struct_emu31 __user *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);  +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, +			       a.offset >> PAGE_SHIFT);  out:  	return error;  } @@ -677,7 +651,7 @@ sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg)  	if (copy_from_user(&a, arg, sizeof(a)))  		goto out; -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);  out:  	return error;  } diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index e9d94f61d50..86a74c9c9e6 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c @@ -32,32 +32,6 @@  #include <asm/uaccess.h>  #include "entry.h" -/* common code for old and new mmaps */ -static inline long do_mmap2( -	unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, -	unsigned long fd, unsigned long pgoff) -{ -	long error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  /*   * Perform the select(nd, in, out, ex, tv) and mmap() system   * calls. Linux for S/390 isn't able to handle more than 5 @@ -81,7 +55,7 @@ SYSCALL_DEFINE1(mmap2, struct mmap_arg_struct __user *, arg)  	if (copy_from_user(&a, arg, sizeof(a)))  		goto out; -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);  out:  	return error;  } @@ -98,7 +72,7 @@ SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct __user *, arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); +	error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);  out:  	return error;  } diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c index 00124946986..3d6a67dd628 100644 --- a/arch/score/kernel/sys_score.c +++ b/arch/score/kernel/sys_score.c @@ -36,34 +36,15 @@ asmlinkage long  sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,  	  unsigned long flags, unsigned long fd, unsigned long pgoff)  { -	int error = -EBADF; -	struct file *file = NULL; - -	if (pgoff & (~PAGE_MASK >> 12)) -		return -EINVAL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			return error; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); - -	return error; +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);  }  asmlinkage long  sys_mmap(unsigned long addr, unsigned long len, unsigned long prot,  	unsigned long flags, unsigned long fd, off_t pgoff)  { -	return sys_mmap2(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT); +	/* where's the alignment check? */ +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);  }  asmlinkage long diff --git a/arch/sh/kernel/sys_sh.c b/arch/sh/kernel/sys_sh.c index 8aa5d1ceaf1..71399cde03b 100644 --- a/arch/sh/kernel/sys_sh.c +++ b/arch/sh/kernel/sys_sh.c @@ -28,37 +28,13 @@  #include <asm/cacheflush.h>  #include <asm/cachectl.h> -static inline long -do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, -	 unsigned long flags, int fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  asmlinkage int old_mmap(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags,  	int fd, unsigned long off)  {  	if (off & ~PAGE_MASK)  		return -EINVAL; -	return do_mmap2(addr, len, prot, flags, fd, off>>PAGE_SHIFT); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT);  }  asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, @@ -74,7 +50,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,  	pgoff >>= PAGE_SHIFT - 12; -	return do_mmap2(addr, len, prot, flags, fd, pgoff); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);  }  /* diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 10c43bea32c..36f6f26d9ce 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -234,31 +234,6 @@ int sparc_mmap_check(unsigned long addr, unsigned long len)  }  /* Linux version of mmap */ -static unsigned long do_mmap2(unsigned long addr, unsigned long len, -	unsigned long prot, unsigned long flags, unsigned long fd, -	unsigned long pgoff) -{ -	struct file * file = NULL; -	unsigned long retval = -EBADF; - -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	len = PAGE_ALIGN(len); -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - -	down_write(¤t->mm->mmap_sem); -	retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return retval; -}  asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags, unsigned long fd, @@ -266,14 +241,16 @@ asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,  {  	/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE  	   we have. */ -	return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT - 12)); +	return sys_mmap_pgoff(addr, len, prot, flags, fd, +			      pgoff >> (PAGE_SHIFT - 12));  }  asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,  	unsigned long prot, unsigned long flags, unsigned long fd,  	unsigned long off)  { -	return do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT); +	/* no alignment check? */ +	return sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);  }  long sparc_remap_file_pages(unsigned long start, unsigned long size, diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index d498b32c75f..8f9cd58497d 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -572,23 +572,13 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,  		unsigned long, prot, unsigned long, flags, unsigned long, fd,  		unsigned long, off)  { -	struct file * file = NULL; -	unsigned long retval = -EBADF; +	unsigned long retval = -EINVAL; -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	len = PAGE_ALIGN(len); - -	down_write(¤t->mm->mmap_sem); -	retval = do_mmap(file, addr, len, prot, flags, off); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); +	if ((off + PAGE_ALIGN(len)) < off) +		goto out; +	if (off & ~PAGE_MASK) +		goto out; +	retval = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);  out:  	return retval;  } diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c index a4625c7b2bf..cccab850c27 100644 --- a/arch/um/kernel/syscall.c +++ b/arch/um/kernel/syscall.c @@ -8,6 +8,7 @@  #include "linux/mm.h"  #include "linux/sched.h"  #include "linux/utsname.h" +#include "linux/syscalls.h"  #include "asm/current.h"  #include "asm/mman.h"  #include "asm/uaccess.h" @@ -37,31 +38,6 @@ long sys_vfork(void)  	return ret;  } -/* common code for old and new mmaps */ -long sys_mmap2(unsigned long addr, unsigned long len, -	       unsigned long prot, unsigned long flags, -	       unsigned long fd, unsigned long pgoff) -{ -	long error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); - out: -	return error; -} -  long old_mmap(unsigned long addr, unsigned long len,  	      unsigned long prot, unsigned long flags,  	      unsigned long fd, unsigned long offset) @@ -70,7 +46,7 @@ long old_mmap(unsigned long addr, unsigned long len,  	if (offset & ~PAGE_MASK)  		goto out; -	err = sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +	err = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);   out:  	return err;  } diff --git a/arch/um/sys-i386/shared/sysdep/syscalls.h b/arch/um/sys-i386/shared/sysdep/syscalls.h index 905698197e3..e7787679e31 100644 --- a/arch/um/sys-i386/shared/sysdep/syscalls.h +++ b/arch/um/sys-i386/shared/sysdep/syscalls.h @@ -20,7 +20,3 @@ extern syscall_handler_t *sys_call_table[];  #define EXECUTE_SYSCALL(syscall, regs) \  	((long (*)(struct syscall_args)) \  	 (*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs)) - -extern long sys_mmap2(unsigned long addr, unsigned long len, -		      unsigned long prot, unsigned long flags, -		      unsigned long fd, unsigned long pgoff); diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 4eefdca9832..53147ad85b9 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S @@ -696,7 +696,7 @@ ia32_sys_call_table:  	.quad quiet_ni_syscall		/* streams2 */  	.quad stub32_vfork            /* 190 */  	.quad compat_sys_getrlimit -	.quad sys32_mmap2 +	.quad sys_mmap_pgoff  	.quad sys32_truncate64  	.quad sys32_ftruncate64  	.quad sys32_stat64		/* 195 */ diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index df82c0e48de..422572c7792 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c @@ -155,9 +155,6 @@ struct mmap_arg_struct {  asmlinkage long sys32_mmap(struct mmap_arg_struct __user *arg)  {  	struct mmap_arg_struct a; -	struct file *file = NULL; -	unsigned long retval; -	struct mm_struct *mm ;  	if (copy_from_user(&a, arg, sizeof(a)))  		return -EFAULT; @@ -165,22 +162,8 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct __user *arg)  	if (a.offset & ~PAGE_MASK)  		return -EINVAL; -	if (!(a.flags & MAP_ANONYMOUS)) { -		file = fget(a.fd); -		if (!file) -			return -EBADF; -	} - -	mm = current->mm; -	down_write(&mm->mmap_sem); -	retval = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, +	return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,  			       a.offset>>PAGE_SHIFT); -	if (file) -		fput(file); - -	up_write(&mm->mmap_sem); - -	return retval;  }  asmlinkage long sys32_mprotect(unsigned long start, size_t len, @@ -483,30 +466,6 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd,  	return ret;  } -asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len, -			    unsigned long prot, unsigned long flags, -			    unsigned long fd, unsigned long pgoff) -{ -	struct mm_struct *mm = current->mm; -	unsigned long error; -	struct file *file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			return -EBADF; -	} - -	down_write(&mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(&mm->mmap_sem); - -	if (file) -		fput(file); -	return error; -} -  asmlinkage long sys32_olduname(struct oldold_utsname __user *name)  {  	char *arch = "x86_64"; diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index 9af9decb38c..4a5a089e1c6 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h @@ -57,9 +57,6 @@ asmlinkage long sys32_pwrite(unsigned int, char __user *, u32, u32, u32);  asmlinkage long sys32_personality(unsigned long);  asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32); -asmlinkage long sys32_mmap2(unsigned long, unsigned long, unsigned long, -			    unsigned long, unsigned long, unsigned long); -  struct oldold_utsname;  struct old_utsname;  asmlinkage long sys32_olduname(struct oldold_utsname __user *); diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index 372b76edd63..1bb6e395881 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h @@ -55,8 +55,6 @@ struct sel_arg_struct;  struct oldold_utsname;  struct old_utsname; -asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long, -			  unsigned long, unsigned long, unsigned long);  asmlinkage int old_mmap(struct mmap_arg_struct __user *);  asmlinkage int old_select(struct sel_arg_struct __user *);  asmlinkage int sys_ipc(uint, int, int, int, void __user *, long); diff --git a/arch/x86/kernel/sys_i386_32.c b/arch/x86/kernel/sys_i386_32.c index 1884a8d12bf..dee1ff7cba5 100644 --- a/arch/x86/kernel/sys_i386_32.c +++ b/arch/x86/kernel/sys_i386_32.c @@ -24,31 +24,6 @@  #include <asm/syscalls.h> -asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, -			  unsigned long prot, unsigned long flags, -			  unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file *file = NULL; -	struct mm_struct *mm = current->mm; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(&mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(&mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  /*   * Perform the select(nd, in, out, ex, tv) and mmap() system   * calls. Linux/i386 didn't use to be able to handle more than @@ -77,7 +52,7 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)  	if (a.offset & ~PAGE_MASK)  		goto out; -	err = sys_mmap2(a.addr, a.len, a.prot, a.flags, +	err = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags,  			a.fd, a.offset >> PAGE_SHIFT);  out:  	return err; diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 45e00eb09c3..8aa2057efd1 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -23,26 +23,11 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,  		unsigned long, fd, unsigned long, off)  {  	long error; -	struct file *file; -  	error = -EINVAL;  	if (off & ~PAGE_MASK)  		goto out; -	error = -EBADF; -	file = NULL; -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, off >> PAGE_SHIFT); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); +	error = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);  out:  	return error;  } diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S index 70c2125d55b..15228b5d3eb 100644 --- a/arch/x86/kernel/syscall_table_32.S +++ b/arch/x86/kernel/syscall_table_32.S @@ -191,7 +191,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall	/* reserved for streams2 */  	.long ptregs_vfork	/* 190 */  	.long sys_getrlimit -	.long sys_mmap2 +	.long sys_mmap_pgoff  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64	/* 195 */ diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h index 05cebf8f62b..4352dbe1186 100644 --- a/arch/xtensa/include/asm/syscall.h +++ b/arch/xtensa/include/asm/syscall.h @@ -13,8 +13,6 @@ struct sigaction;  asmlinkage long xtensa_execve(char*, char**, char**, struct pt_regs*);  asmlinkage long xtensa_clone(unsigned long, unsigned long, struct pt_regs*);  asmlinkage long xtensa_pipe(int __user *); -asmlinkage long xtensa_mmap2(unsigned long, unsigned long, unsigned long, -    			     unsigned long, unsigned long, unsigned long);  asmlinkage long xtensa_ptrace(long, long, long, long);  asmlinkage long xtensa_sigreturn(struct pt_regs*);  asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index 4e55dc76302..fbf318b3af3 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h @@ -189,7 +189,7 @@ __SYSCALL( 79, sys_fremovexattr, 2)  /* File Map / Shared Memory Operations */  #define __NR_mmap2 				 80 -__SYSCALL( 80, xtensa_mmap2, 6) +__SYSCALL( 80, sys_mmap_pgoff, 6)  #define __NR_munmap 				 81  __SYSCALL( 81, sys_munmap, 2)  #define __NR_mprotect 				 82 diff --git a/arch/xtensa/kernel/syscall.c b/arch/xtensa/kernel/syscall.c index ac15ecbdf91..1e67bab775c 100644 --- a/arch/xtensa/kernel/syscall.c +++ b/arch/xtensa/kernel/syscall.c @@ -57,31 +57,6 @@ asmlinkage long xtensa_pipe(int __user *userfds)  	return error;  } - -asmlinkage long xtensa_mmap2(unsigned long addr, unsigned long len, -   			     unsigned long prot, unsigned long flags, -			     unsigned long fd, unsigned long pgoff) -{ -	int error = -EBADF; -	struct file * file = NULL; - -	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -	if (!(flags & MAP_ANONYMOUS)) { -		file = fget(fd); -		if (!file) -			goto out; -	} - -	down_write(¤t->mm->mmap_sem); -	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -	up_write(¤t->mm->mmap_sem); - -	if (file) -		fput(file); -out: -	return error; -} -  asmlinkage long xtensa_shmat(int shmid, char __user *shmaddr, int shmflg)  {  	unsigned long ret; diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index bc70c5810fe..939a61507ac 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -834,4 +834,8 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]);  asmlinkage long sys_perf_event_open(  		struct perf_event_attr __user *attr_uptr,  		pid_t pid, int cpu, int group_fd, unsigned long flags); + +asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len, +			unsigned long prot, unsigned long flags, +			unsigned long fd, unsigned long pgoff);  #endif diff --git a/mm/util.c b/mm/util.c index 7c35ad95f92..3bf81b294ae 100644 --- a/mm/util.c +++ b/mm/util.c @@ -4,6 +4,10 @@  #include <linux/module.h>  #include <linux/err.h>  #include <linux/sched.h> +#include <linux/hugetlb.h> +#include <linux/syscalls.h> +#include <linux/mman.h> +#include <linux/file.h>  #include <asm/uaccess.h>  #define CREATE_TRACE_POINTS @@ -268,6 +272,31 @@ int __attribute__((weak)) get_user_pages_fast(unsigned long start,  }  EXPORT_SYMBOL_GPL(get_user_pages_fast); +SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, +		unsigned long, prot, unsigned long, flags, +		unsigned long, fd, unsigned long, pgoff) +{ +	struct file * file = NULL; +	unsigned long retval = -EBADF; + +	if (!(flags & MAP_ANONYMOUS)) { +		file = fget(fd); +		if (!file) +			goto out; +	} + +	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); + +	down_write(¤t->mm->mmap_sem); +	retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); +	up_write(¤t->mm->mmap_sem); + +	if (file) +		fput(file); +out: +	return retval; +} +  /* Tracepoints definitions. */  EXPORT_TRACEPOINT_SYMBOL(kmalloc);  EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);  |