diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-11 15:23:29 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-11 15:23:29 -0500 |
| commit | aad3bf04dca5a2147a8406f7aef5703ee5259a52 (patch) | |
| tree | 558d5915ddceab6bb47ed844dea9386c6036d087 /arch/mips/kernel | |
| parent | 11bd04f6f35621193311c32e0721142b073a7794 (diff) | |
| parent | aa65607373a4daf2010e8c3867b6317619f3c1a3 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/viro/mmap
* git://git.kernel.org/pub/scm/linux/kernel/git/viro/mmap:
Add missing alignment check in arch/score sys_mmap()
fix broken aliasing checks for MAP_FIXED on sparc32, mips, arm and sh
Get rid of open-coding in ia64_brk()
sparc_brk() is not needed anymore
switch do_brk() to get_unmapped_area()
Take arch_mmap_check() into get_unmapped_area()
fix a struct file leak in do_mmap_pgoff()
Unify sys_mmap*
Cut hugetlb case early for 32bit on ia64
arch_mmap_check() on mn10300
Kill ancient crap in s390 compat mmap
arm: add arch_mmap_check(), get rid of sys_arm_mremap()
file ->get_unmapped_area() shouldn't duplicate work of get_unmapped_area()
kill useless checks in sparc mremap variants
fix pgoff in "have to relocate" case of mremap()
fix the arch checks in MREMAP_FIXED case
fix checks for expand-in-place mremap
do_mremap() untangling, part 3
do_mremap() untangling, part 2
untangling do_mremap(), part 1
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/linux32.c | 19 | ||||
| -rw-r--r-- | arch/mips/kernel/syscall.c | 32 |
2 files changed, 6 insertions, 45 deletions
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 1a2793efdc4e..f042563c924f 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, | |||
| 67 | unsigned long, prot, unsigned long, flags, unsigned long, fd, | 67 | unsigned long, prot, unsigned long, flags, unsigned long, fd, |
| 68 | unsigned long, pgoff) | 68 | unsigned long, pgoff) |
| 69 | { | 69 | { |
| 70 | struct file * file = NULL; | ||
| 71 | unsigned long error; | 70 | unsigned long error; |
| 72 | 71 | ||
| 73 | error = -EINVAL; | 72 | error = -EINVAL; |
| 74 | if (pgoff & (~PAGE_MASK >> 12)) | 73 | if (pgoff & (~PAGE_MASK >> 12)) |
| 75 | goto out; | 74 | goto out; |
| 76 | pgoff >>= PAGE_SHIFT-12; | 75 | error = sys_mmap_pgoff(addr, len, prot, flags, fd, |
| 77 | 76 | pgoff >> (PAGE_SHIFT-12)); | |
| 78 | if (!(flags & MAP_ANONYMOUS)) { | ||
| 79 | error = -EBADF; | ||
| 80 | file = fget(fd); | ||
| 81 | if (!file) | ||
| 82 | goto out; | ||
| 83 | } | ||
| 84 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
| 85 | |||
| 86 | down_write(¤t->mm->mmap_sem); | ||
| 87 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
| 88 | up_write(¤t->mm->mmap_sem); | ||
| 89 | if (file) | ||
| 90 | fput(file); | ||
| 91 | |||
| 92 | out: | 77 | out: |
| 93 | return error; | 78 | return error; |
| 94 | } | 79 | } |
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index fe0d79805603..3f7f466190b4 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
| @@ -93,7 +93,8 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 93 | * We do not accept a shared mapping if it would violate | 93 | * We do not accept a shared mapping if it would violate |
| 94 | * cache aliasing constraints. | 94 | * cache aliasing constraints. |
| 95 | */ | 95 | */ |
| 96 | if ((flags & MAP_SHARED) && (addr & shm_align_mask)) | 96 | if ((flags & MAP_SHARED) && |
| 97 | ((addr - (pgoff << PAGE_SHIFT)) & shm_align_mask)) | ||
| 97 | return -EINVAL; | 98 | return -EINVAL; |
| 98 | return addr; | 99 | return addr; |
| 99 | } | 100 | } |
| @@ -129,31 +130,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 129 | } | 130 | } |
| 130 | } | 131 | } |
| 131 | 132 | ||
| 132 | /* common code for old and new mmaps */ | ||
| 133 | static inline unsigned long | ||
| 134 | do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | ||
| 135 | unsigned long flags, unsigned long fd, unsigned long pgoff) | ||
| 136 | { | ||
| 137 | unsigned long error = -EBADF; | ||
| 138 | struct file * file = NULL; | ||
| 139 | |||
| 140 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
| 141 | if (!(flags & MAP_ANONYMOUS)) { | ||
| 142 | file = fget(fd); | ||
| 143 | if (!file) | ||
| 144 | goto out; | ||
| 145 | } | ||
| 146 | |||
| 147 | down_write(¤t->mm->mmap_sem); | ||
| 148 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
| 149 | up_write(¤t->mm->mmap_sem); | ||
| 150 | |||
| 151 | if (file) | ||
| 152 | fput(file); | ||
| 153 | out: | ||
| 154 | return error; | ||
| 155 | } | ||
| 156 | |||
| 157 | SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, | 133 | SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, |
| 158 | unsigned long, prot, unsigned long, flags, unsigned long, | 134 | unsigned long, prot, unsigned long, flags, unsigned long, |
| 159 | fd, off_t, offset) | 135 | fd, off_t, offset) |
| @@ -164,7 +140,7 @@ SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, | |||
| 164 | if (offset & ~PAGE_MASK) | 140 | if (offset & ~PAGE_MASK) |
| 165 | goto out; | 141 | goto out; |
| 166 | 142 | ||
| 167 | result = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); | 143 | result = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); |
| 168 | 144 | ||
| 169 | out: | 145 | out: |
| 170 | return result; | 146 | return result; |
| @@ -177,7 +153,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len, | |||
| 177 | if (pgoff & (~PAGE_MASK >> 12)) | 153 | if (pgoff & (~PAGE_MASK >> 12)) |
| 178 | return -EINVAL; | 154 | return -EINVAL; |
| 179 | 155 | ||
| 180 | return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12)); | 156 | return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12)); |
| 181 | } | 157 | } |
| 182 | 158 | ||
| 183 | save_static_function(sys_fork); | 159 | save_static_function(sys_fork); |
