diff options
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 33 |
1 files changed, 15 insertions, 18 deletions
@@ -232,7 +232,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) | |||
232 | vma->vm_ops->close(vma); | 232 | vma->vm_ops->close(vma); |
233 | if (vma->vm_file) | 233 | if (vma->vm_file) |
234 | fput(vma->vm_file); | 234 | fput(vma->vm_file); |
235 | mpol_free(vma_policy(vma)); | 235 | mpol_put(vma_policy(vma)); |
236 | kmem_cache_free(vm_area_cachep, vma); | 236 | kmem_cache_free(vm_area_cachep, vma); |
237 | return next; | 237 | return next; |
238 | } | 238 | } |
@@ -626,7 +626,7 @@ again: remove_next = 1 + (end > next->vm_end); | |||
626 | if (file) | 626 | if (file) |
627 | fput(file); | 627 | fput(file); |
628 | mm->map_count--; | 628 | mm->map_count--; |
629 | mpol_free(vma_policy(next)); | 629 | mpol_put(vma_policy(next)); |
630 | kmem_cache_free(vm_area_cachep, next); | 630 | kmem_cache_free(vm_area_cachep, next); |
631 | /* | 631 | /* |
632 | * In mprotect's case 6 (see comments on vma_merge), | 632 | * In mprotect's case 6 (see comments on vma_merge), |
@@ -1068,7 +1068,6 @@ int vma_wants_writenotify(struct vm_area_struct *vma) | |||
1068 | mapping_cap_account_dirty(vma->vm_file->f_mapping); | 1068 | mapping_cap_account_dirty(vma->vm_file->f_mapping); |
1069 | } | 1069 | } |
1070 | 1070 | ||
1071 | |||
1072 | unsigned long mmap_region(struct file *file, unsigned long addr, | 1071 | unsigned long mmap_region(struct file *file, unsigned long addr, |
1073 | unsigned long len, unsigned long flags, | 1072 | unsigned long len, unsigned long flags, |
1074 | unsigned int vm_flags, unsigned long pgoff, | 1073 | unsigned int vm_flags, unsigned long pgoff, |
@@ -1181,22 +1180,20 @@ munmap_back: | |||
1181 | if (vma_wants_writenotify(vma)) | 1180 | if (vma_wants_writenotify(vma)) |
1182 | vma->vm_page_prot = vm_get_page_prot(vm_flags & ~VM_SHARED); | 1181 | vma->vm_page_prot = vm_get_page_prot(vm_flags & ~VM_SHARED); |
1183 | 1182 | ||
1184 | if (!file || !vma_merge(mm, prev, addr, vma->vm_end, | 1183 | if (file && vma_merge(mm, prev, addr, vma->vm_end, |
1185 | vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) { | 1184 | vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) { |
1186 | file = vma->vm_file; | 1185 | mpol_put(vma_policy(vma)); |
1187 | vma_link(mm, vma, prev, rb_link, rb_parent); | ||
1188 | if (correct_wcount) | ||
1189 | atomic_inc(&inode->i_writecount); | ||
1190 | } else { | ||
1191 | if (file) { | ||
1192 | if (correct_wcount) | ||
1193 | atomic_inc(&inode->i_writecount); | ||
1194 | fput(file); | ||
1195 | } | ||
1196 | mpol_free(vma_policy(vma)); | ||
1197 | kmem_cache_free(vm_area_cachep, vma); | 1186 | kmem_cache_free(vm_area_cachep, vma); |
1187 | fput(file); | ||
1188 | } else { | ||
1189 | vma_link(mm, vma, prev, rb_link, rb_parent); | ||
1190 | file = vma->vm_file; | ||
1198 | } | 1191 | } |
1199 | out: | 1192 | |
1193 | /* Once vma denies write, undo our temporary denial count */ | ||
1194 | if (correct_wcount) | ||
1195 | atomic_inc(&inode->i_writecount); | ||
1196 | out: | ||
1200 | mm->total_vm += len >> PAGE_SHIFT; | 1197 | mm->total_vm += len >> PAGE_SHIFT; |
1201 | vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT); | 1198 | vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT); |
1202 | if (vm_flags & VM_LOCKED) { | 1199 | if (vm_flags & VM_LOCKED) { |
@@ -1813,7 +1810,7 @@ int split_vma(struct mm_struct * mm, struct vm_area_struct * vma, | |||
1813 | new->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT); | 1810 | new->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT); |
1814 | } | 1811 | } |
1815 | 1812 | ||
1816 | pol = mpol_copy(vma_policy(vma)); | 1813 | pol = mpol_dup(vma_policy(vma)); |
1817 | if (IS_ERR(pol)) { | 1814 | if (IS_ERR(pol)) { |
1818 | kmem_cache_free(vm_area_cachep, new); | 1815 | kmem_cache_free(vm_area_cachep, new); |
1819 | return PTR_ERR(pol); | 1816 | return PTR_ERR(pol); |
@@ -2129,7 +2126,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, | |||
2129 | new_vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); | 2126 | new_vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); |
2130 | if (new_vma) { | 2127 | if (new_vma) { |
2131 | *new_vma = *vma; | 2128 | *new_vma = *vma; |
2132 | pol = mpol_copy(vma_policy(vma)); | 2129 | pol = mpol_dup(vma_policy(vma)); |
2133 | if (IS_ERR(pol)) { | 2130 | if (IS_ERR(pol)) { |
2134 | kmem_cache_free(vm_area_cachep, new_vma); | 2131 | kmem_cache_free(vm_area_cachep, new_vma); |
2135 | return NULL; | 2132 | return NULL; |