diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 16 |
1 files changed, 12 insertions, 4 deletions
| @@ -2462,6 +2462,7 @@ int install_special_mapping(struct mm_struct *mm, | |||
| 2462 | unsigned long addr, unsigned long len, | 2462 | unsigned long addr, unsigned long len, |
| 2463 | unsigned long vm_flags, struct page **pages) | 2463 | unsigned long vm_flags, struct page **pages) |
| 2464 | { | 2464 | { |
| 2465 | int ret; | ||
| 2465 | struct vm_area_struct *vma; | 2466 | struct vm_area_struct *vma; |
| 2466 | 2467 | ||
| 2467 | vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); | 2468 | vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); |
| @@ -2479,16 +2480,23 @@ int install_special_mapping(struct mm_struct *mm, | |||
| 2479 | vma->vm_ops = &special_mapping_vmops; | 2480 | vma->vm_ops = &special_mapping_vmops; |
| 2480 | vma->vm_private_data = pages; | 2481 | vma->vm_private_data = pages; |
| 2481 | 2482 | ||
| 2482 | if (unlikely(insert_vm_struct(mm, vma))) { | 2483 | ret = security_file_mmap(NULL, 0, 0, 0, vma->vm_start, 1); |
| 2483 | kmem_cache_free(vm_area_cachep, vma); | 2484 | if (ret) |
| 2484 | return -ENOMEM; | 2485 | goto out; |
| 2485 | } | 2486 | |
| 2487 | ret = insert_vm_struct(mm, vma); | ||
| 2488 | if (ret) | ||
| 2489 | goto out; | ||
| 2486 | 2490 | ||
| 2487 | mm->total_vm += len >> PAGE_SHIFT; | 2491 | mm->total_vm += len >> PAGE_SHIFT; |
| 2488 | 2492 | ||
| 2489 | perf_event_mmap(vma); | 2493 | perf_event_mmap(vma); |
| 2490 | 2494 | ||
| 2491 | return 0; | 2495 | return 0; |
| 2496 | |||
| 2497 | out: | ||
| 2498 | kmem_cache_free(vm_area_cachep, vma); | ||
| 2499 | return ret; | ||
| 2492 | } | 2500 | } |
| 2493 | 2501 | ||
| 2494 | static DEFINE_MUTEX(mm_all_locks_mutex); | 2502 | static DEFINE_MUTEX(mm_all_locks_mutex); |
