page_alloc: fix invalid watermark check on a negative value
[sfrench/cifs-2.6.git] / mm / mremap.c
index 303d3290b938667699e0ab61cbd8e6ac81c286eb..b522cd0259a0f1553645d22eb682a489ea1c5345 100644 (file)
@@ -490,12 +490,12 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
                return 0;
 
        old_end = old_addr + len;
-       flush_cache_range(vma, old_addr, old_end);
 
        if (is_vm_hugetlb_page(vma))
                return move_hugetlb_page_tables(vma, new_vma, old_addr,
                                                new_addr, len);
 
+       flush_cache_range(vma, old_addr, old_end);
        mmu_notifier_range_init(&range, MMU_NOTIFY_UNMAP, 0, vma, vma->vm_mm,
                                old_addr, old_end);
        mmu_notifier_invalidate_range_start(&range);
@@ -766,14 +766,8 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr,
        if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP))
                return ERR_PTR(-EFAULT);
 
-       if (vma->vm_flags & VM_LOCKED) {
-               unsigned long locked, lock_limit;
-               locked = mm->locked_vm << PAGE_SHIFT;
-               lock_limit = rlimit(RLIMIT_MEMLOCK);
-               locked += new_len - old_len;
-               if (locked > lock_limit && !capable(CAP_IPC_LOCK))
-                       return ERR_PTR(-EAGAIN);
-       }
+       if (mlock_future_check(mm, vma->vm_flags, new_len - old_len))
+               return ERR_PTR(-EAGAIN);
 
        if (!may_expand_vm(mm, vma->vm_flags,
                                (new_len - old_len) >> PAGE_SHIFT))
@@ -826,9 +820,9 @@ static unsigned long mremap_to(unsigned long addr, unsigned long old_len,
                        goto out;
        }
 
-       if (old_len >= new_len) {
+       if (old_len > new_len) {
                ret = do_munmap(mm, addr+new_len, old_len - new_len, uf_unmap);
-               if (ret && old_len != new_len)
+               if (ret)
                        goto out;
                old_len = new_len;
        }
@@ -947,7 +941,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
                return -EINTR;
        vma = vma_lookup(mm, addr);
        if (!vma) {
-               ret = EFAULT;
+               ret = -EFAULT;
                goto out;
        }