mm, fs: reduce fault, page_mkwrite, and pfn_mkwrite to take only vmf
[linux-block.git] / mm / mmap.c
index dc4291dcc99b8f245fe38aeb52bb5aa5fbe3243d..1cd70010edf0c53581918a10ec0633fd2b72f5f7 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2806,11 +2806,11 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)
  *  anonymous maps.  eventually we may be able to do some
  *  brk-specific accounting here.
  */
-static int do_brk(unsigned long addr, unsigned long request)
+static int do_brk_flags(unsigned long addr, unsigned long request, unsigned long flags)
 {
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma, *prev;
-       unsigned long flags, len;
+       unsigned long len;
        struct rb_node **rb_link, *rb_parent;
        pgoff_t pgoff = addr >> PAGE_SHIFT;
        int error;
@@ -2821,7 +2821,10 @@ static int do_brk(unsigned long addr, unsigned long request)
        if (!len)
                return 0;
 
-       flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
+       /* Until we need other flags, refuse anything except VM_EXEC. */
+       if ((flags & (~VM_EXEC)) != 0)
+               return -EINVAL;
+       flags |= VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
 
        error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED);
        if (offset_in_page(error))
@@ -2889,7 +2892,12 @@ out:
        return 0;
 }
 
-int vm_brk(unsigned long addr, unsigned long len)
+static int do_brk(unsigned long addr, unsigned long len)
+{
+       return do_brk_flags(addr, len, 0);
+}
+
+int vm_brk_flags(unsigned long addr, unsigned long len, unsigned long flags)
 {
        struct mm_struct *mm = current->mm;
        int ret;
@@ -2898,13 +2906,19 @@ int vm_brk(unsigned long addr, unsigned long len)
        if (down_write_killable(&mm->mmap_sem))
                return -EINTR;
 
-       ret = do_brk(addr, len);
+       ret = do_brk_flags(addr, len, flags);
        populate = ((mm->def_flags & VM_LOCKED) != 0);
        up_write(&mm->mmap_sem);
        if (populate && !ret)
                mm_populate(addr, len);
        return ret;
 }
+EXPORT_SYMBOL(vm_brk_flags);
+
+int vm_brk(unsigned long addr, unsigned long len)
+{
+       return vm_brk_flags(addr, len, 0);
+}
 EXPORT_SYMBOL(vm_brk);
 
 /* Release all mmaps. */
@@ -3111,8 +3125,7 @@ void vm_stat_account(struct mm_struct *mm, vm_flags_t flags, long npages)
                mm->data_vm += npages;
 }
 
-static int special_mapping_fault(struct vm_area_struct *vma,
-                                struct vm_fault *vmf);
+static int special_mapping_fault(struct vm_fault *vmf);
 
 /*
  * Having a close hook prevents vma merging regardless of flags.
@@ -3147,9 +3160,9 @@ static const struct vm_operations_struct legacy_special_mapping_vmops = {
        .fault = special_mapping_fault,
 };
 
-static int special_mapping_fault(struct vm_area_struct *vma,
-                               struct vm_fault *vmf)
+static int special_mapping_fault(struct vm_fault *vmf)
 {
+       struct vm_area_struct *vma = vmf->vma;
        pgoff_t pgoff;
        struct page **pages;
 
@@ -3159,7 +3172,7 @@ static int special_mapping_fault(struct vm_area_struct *vma,
                struct vm_special_mapping *sm = vma->vm_private_data;
 
                if (sm->fault)
-                       return sm->fault(sm, vma, vmf);
+                       return sm->fault(sm, vmf->vma, vmf);
 
                pages = sm->pages;
        }