diff options
| -rw-r--r-- | mm/gup.c | 2 | ||||
| -rw-r--r-- | mm/mmap.c | 29 |
2 files changed, 12 insertions, 19 deletions
| @@ -1238,8 +1238,6 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) | |||
| 1238 | int locked = 0; | 1238 | int locked = 0; |
| 1239 | long ret = 0; | 1239 | long ret = 0; |
| 1240 | 1240 | ||
| 1241 | VM_BUG_ON(start & ~PAGE_MASK); | ||
| 1242 | VM_BUG_ON(len != PAGE_ALIGN(len)); | ||
| 1243 | end = start + len; | 1241 | end = start + len; |
| 1244 | 1242 | ||
| 1245 | for (nstart = start; nstart < end; nstart = nend) { | 1243 | for (nstart = start; nstart < end; nstart = nend) { |
| @@ -186,8 +186,8 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) | |||
| 186 | return next; | 186 | return next; |
| 187 | } | 187 | } |
| 188 | 188 | ||
| 189 | static int do_brk(unsigned long addr, unsigned long len, struct list_head *uf); | 189 | static int do_brk_flags(unsigned long addr, unsigned long request, unsigned long flags, |
| 190 | 190 | struct list_head *uf); | |
| 191 | SYSCALL_DEFINE1(brk, unsigned long, brk) | 191 | SYSCALL_DEFINE1(brk, unsigned long, brk) |
| 192 | { | 192 | { |
| 193 | unsigned long retval; | 193 | unsigned long retval; |
| @@ -245,7 +245,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) | |||
| 245 | goto out; | 245 | goto out; |
| 246 | 246 | ||
| 247 | /* Ok, looks good - let it rip. */ | 247 | /* Ok, looks good - let it rip. */ |
| 248 | if (do_brk(oldbrk, newbrk-oldbrk, &uf) < 0) | 248 | if (do_brk_flags(oldbrk, newbrk-oldbrk, 0, &uf) < 0) |
| 249 | goto out; | 249 | goto out; |
| 250 | 250 | ||
| 251 | set_brk: | 251 | set_brk: |
| @@ -2929,21 +2929,14 @@ static inline void verify_mm_writelocked(struct mm_struct *mm) | |||
| 2929 | * anonymous maps. eventually we may be able to do some | 2929 | * anonymous maps. eventually we may be able to do some |
| 2930 | * brk-specific accounting here. | 2930 | * brk-specific accounting here. |
| 2931 | */ | 2931 | */ |
| 2932 | static int do_brk_flags(unsigned long addr, unsigned long request, unsigned long flags, struct list_head *uf) | 2932 | static int do_brk_flags(unsigned long addr, unsigned long len, unsigned long flags, struct list_head *uf) |
| 2933 | { | 2933 | { |
| 2934 | struct mm_struct *mm = current->mm; | 2934 | struct mm_struct *mm = current->mm; |
| 2935 | struct vm_area_struct *vma, *prev; | 2935 | struct vm_area_struct *vma, *prev; |
| 2936 | unsigned long len; | ||
| 2937 | struct rb_node **rb_link, *rb_parent; | 2936 | struct rb_node **rb_link, *rb_parent; |
| 2938 | pgoff_t pgoff = addr >> PAGE_SHIFT; | 2937 | pgoff_t pgoff = addr >> PAGE_SHIFT; |
| 2939 | int error; | 2938 | int error; |
| 2940 | 2939 | ||
| 2941 | len = PAGE_ALIGN(request); | ||
| 2942 | if (len < request) | ||
| 2943 | return -ENOMEM; | ||
| 2944 | if (!len) | ||
| 2945 | return 0; | ||
| 2946 | |||
| 2947 | /* Until we need other flags, refuse anything except VM_EXEC. */ | 2940 | /* Until we need other flags, refuse anything except VM_EXEC. */ |
| 2948 | if ((flags & (~VM_EXEC)) != 0) | 2941 | if ((flags & (~VM_EXEC)) != 0) |
| 2949 | return -EINVAL; | 2942 | return -EINVAL; |
| @@ -3015,18 +3008,20 @@ out: | |||
| 3015 | return 0; | 3008 | return 0; |
| 3016 | } | 3009 | } |
| 3017 | 3010 | ||
| 3018 | static int do_brk(unsigned long addr, unsigned long len, struct list_head *uf) | 3011 | int vm_brk_flags(unsigned long addr, unsigned long request, unsigned long flags) |
| 3019 | { | ||
| 3020 | return do_brk_flags(addr, len, 0, uf); | ||
| 3021 | } | ||
| 3022 | |||
| 3023 | int vm_brk_flags(unsigned long addr, unsigned long len, unsigned long flags) | ||
| 3024 | { | 3012 | { |
| 3025 | struct mm_struct *mm = current->mm; | 3013 | struct mm_struct *mm = current->mm; |
| 3014 | unsigned long len; | ||
| 3026 | int ret; | 3015 | int ret; |
| 3027 | bool populate; | 3016 | bool populate; |
| 3028 | LIST_HEAD(uf); | 3017 | LIST_HEAD(uf); |
| 3029 | 3018 | ||
| 3019 | len = PAGE_ALIGN(request); | ||
| 3020 | if (len < request) | ||
| 3021 | return -ENOMEM; | ||
| 3022 | if (!len) | ||
| 3023 | return 0; | ||
| 3024 | |||
| 3030 | if (down_write_killable(&mm->mmap_sem)) | 3025 | if (down_write_killable(&mm->mmap_sem)) |
| 3031 | return -EINTR; | 3026 | return -EINTR; |
| 3032 | 3027 | ||
