do {
 again:
                next = pmd_addr_end(addr, end);
-               if (pmd_none(*pmd) || (!walk->vma && !walk->no_vma)) {
+               if (pmd_none(*pmd)) {
                        if (ops->pte_hole)
                                err = ops->pte_hole(addr, next, depth, walk);
                        if (err)
        do {
  again:
                next = pud_addr_end(addr, end);
-               if (pud_none(*pud) || (!walk->vma && !walk->no_vma)) {
+               if (pud_none(*pud)) {
                        if (ops->pte_hole)
                                err = ops->pte_hole(addr, next, depth, walk);
                        if (err)
        struct vm_area_struct *vma = walk->vma;
        const struct mm_walk_ops *ops = walk->ops;
 
-       if (vma && ops->pre_vma) {
+       if (ops->pre_vma) {
                err = ops->pre_vma(start, end, walk);
                if (err)
                        return err;
        }
 
-       if (vma && is_vm_hugetlb_page(vma)) {
+       if (is_vm_hugetlb_page(vma)) {
                if (ops->hugetlb_entry)
                        err = walk_hugetlb_range(start, end, walk);
        } else
                err = walk_pgd_range(start, end, walk);
 
-       if (vma && ops->post_vma)
+       if (ops->post_vma)
                ops->post_vma(walk);
 
        return err;
                if (!vma) { /* after the last vma */
                        walk.vma = NULL;
                        next = end;
+                       if (ops->pte_hole)
+                               err = ops->pte_hole(start, next, -1, &walk);
                } else if (start < vma->vm_start) { /* outside vma */
                        walk.vma = NULL;
                        next = min(end, vma->vm_start);
+                       if (ops->pte_hole)
+                               err = ops->pte_hole(start, next, -1, &walk);
                } else { /* inside vma */
                        walk.vma = vma;
                        next = min(end, vma->vm_end);
                        }
                        if (err < 0)
                                break;
-               }
-               if (walk.vma || walk.ops->pte_hole)
                        err = __walk_page_range(start, next, &walk);
+               }
                if (err)
                        break;
        } while (start = next, start < end);
        if (start >= end || !walk.mm)
                return -EINVAL;
 
-       mmap_assert_locked(walk.mm);
+       mmap_assert_write_locked(walk.mm);
 
-       return __walk_page_range(start, end, &walk);
+       return walk_pgd_range(start, end, &walk);
 }
 
 int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,