mm/mmap.c: remove incorrect MAP_FIXED flag comparison from mmap_region
authorPiotr Kwapulinski <[email protected]>
Thu, 14 Jan 2016 23:19:50 +0000 (15:19 -0800)
committerLinus Torvalds <[email protected]>
Fri, 15 Jan 2016 00:00:49 +0000 (16:00 -0800)
The following flag comparison in mmap_region makes no sense:

    if (!(vm_flags & MAP_FIXED))
        return -ENOMEM;

The condition is always false and thus the above "return -ENOMEM" is
never executed.  The vm_flags must not be compared with MAP_FIXED flag.
The vm_flags may only be compared with VM_* flags.  MAP_FIXED has the
same value as VM_MAYREAD.

Hitting the rlimit is a slow path and find_vma_intersection should
realize that there is no overlapping VMA for !MAP_FIXED case pretty
quickly.

Signed-off-by: Piotr Kwapulinski <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Chris Metcalf <[email protected]>
Reviewed-by: Naoya Horiguchi <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/mmap.c

index 9da9c27c33a2a61231a39f54af0e5926af4bd98f..c311bfd8005b535ed5b9c50467ef79dd961353fe 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1551,9 +1551,6 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
                 * MAP_FIXED may remove pages of mappings that intersects with
                 * requested mapping. Account for the pages it would unmap.
                 */
-               if (!(vm_flags & MAP_FIXED))
-                       return -ENOMEM;
-
                nr_pages = count_vma_pages_range(mm, addr, addr + len);
 
                if (!may_expand_vm(mm, (len >> PAGE_SHIFT) - nr_pages))