--- x/mm/filemap.c +++ y/mm/filemap.c @@ -3636,6 +3636,10 @@ static vm_fault_t filemap_map_folio_rang continue; skip: if (count) { + for (unsigned int i = 0; i < count; i++) { + if (page_folio(page + i) != folio) + goto out; + } set_pte_range(vmf, folio, page, count, addr); *rss += count; folio_ref_add(folio, count); @@ -3658,6 +3662,7 @@ skip: ret = VM_FAULT_NOPAGE; } +out: vmf->pte = old_ptep; return ret; @@ -3738,8 +3743,8 @@ vm_fault_t filemap_map_pages(struct vm_f addr += (xas.xa_index - last_pgoff) << PAGE_SHIFT; vmf->pte += xas.xa_index - last_pgoff; last_pgoff = xas.xa_index; - end = folio_next_index(folio) - 1; - nr_pages = min(end, end_pgoff) - xas.xa_index + 1; + end = folio_next_index(folio) -1; + nr_pages = min(end, end_pgoff) - xas.xa_index; if (!folio_test_large(folio)) ret |= filemap_map_order0_folio(vmf,