unsigned long randomize_stack_top(unsigned long stack_top);
 unsigned long randomize_page(unsigned long start, unsigned long range);
 
-extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
+unsigned long
+__get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
+                   unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags);
+
+static inline unsigned long
+get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
+                 unsigned long pgoff, unsigned long flags)
+{
+       return __get_unmapped_area(file, addr, len, pgoff, flags, 0);
+}
 
 extern unsigned long mmap_region(struct file *file, unsigned long addr,
        unsigned long len, vm_flags_t vm_flags, unsigned long pgoff,
 
        if (mm->map_count > sysctl_max_map_count)
                return -ENOMEM;
 
-       /* Obtain the address to map to. we verify (or select) it and ensure
-        * that it represents a valid section of the address space.
-        */
-       addr = get_unmapped_area(file, addr, len, pgoff, flags);
-       if (IS_ERR_VALUE(addr))
-               return addr;
-
-       if (flags & MAP_FIXED_NOREPLACE) {
-               if (find_vma_intersection(mm, addr, addr + len))
-                       return -EEXIST;
-       }
-
        if (prot == PROT_EXEC) {
                pkey = execute_only_pkey(mm);
                if (pkey < 0)
        vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) |
                        mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
 
+       /* Obtain the address to map to. we verify (or select) it and ensure
+        * that it represents a valid section of the address space.
+        */
+       addr = __get_unmapped_area(file, addr, len, pgoff, flags, vm_flags);
+       if (IS_ERR_VALUE(addr))
+               return addr;
+
+       if (flags & MAP_FIXED_NOREPLACE) {
+               if (find_vma_intersection(mm, addr, addr + len))
+                       return -EEXIST;
+       }
+
        if (flags & MAP_LOCKED)
                if (!can_do_mlock())
                        return -EPERM;
 }
 
 unsigned long
-get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
-               unsigned long pgoff, unsigned long flags)
+__get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
+               unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags)
 {
        unsigned long (*get_area)(struct file *, unsigned long,
                                  unsigned long, unsigned long, unsigned long)
        if (get_area)
                addr = get_area(file, addr, len, pgoff, flags);
        else
-               addr = mm_get_unmapped_area(current->mm, file, addr, len,
-                                           pgoff, flags);
+               addr = mm_get_unmapped_area_vmflags(current->mm, file, addr, len,
+                                                   pgoff, flags, vm_flags);
        if (IS_ERR_VALUE(addr))
                return addr;