/* first iteration or cross vma bound */
                if (!vma || start >= vma->vm_end) {
-                       vma = vma_lookup(mm, start);
+                       vma = find_vma(mm, start);
+                       if (vma && (start < vma->vm_start)) {
+                               WARN_ON_ONCE(vma->vm_flags & VM_GROWSDOWN);
+                               vma = NULL;
+                       }
                        if (!vma && in_gate_area(mm, start)) {
                                ret = get_gate_page(mm, start & PAGE_MASK,
                                                gup_flags, &vma,
                fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
 retry:
-       vma = vma_lookup(mm, address);
+       vma = find_vma(mm, address);
        if (!vma)
                return -EFAULT;
+       if (address < vma->vm_start ) {
+               WARN_ON_ONCE(vma->vm_flags & VM_GROWSDOWN);
+               return -EFAULT;
+       }
 
        if (!vma_permits_fault(vma, fault_flags))
                return -EFAULT;