diff --git a/mm/filemap.c b/mm/filemap.c index 582f5317ff71..5e07bf996e9a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3482,7 +3482,7 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf, struct file *file = vma->vm_file; struct page *page = folio_page(folio, start); unsigned int mmap_miss = READ_ONCE(file->f_ra.mmap_miss); - unsigned int count = 0; + unsigned int count = 0, i; pte_t *old_ptep = vmf->pte; do { @@ -3504,10 +3504,16 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf, continue; skip: if (count) { - set_pte_range(vmf, folio, page, count, addr); + for (i = 0;i < count; i++) { + set_pte_range(vmf, folio, page, 1, addr); + page++; + vmf->pte++; + addr += PAGE_SIZE; + } folio_ref_add(folio, count); if (in_range(vmf->address, addr, count)) ret = VM_FAULT_NOPAGE; + count = 0; } count++; @@ -3518,7 +3524,12 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf, } while (--nr_pages > 0); if (count) { - set_pte_range(vmf, folio, page, count, addr); + for (i = 0;i < count; i++) { + set_pte_range(vmf, folio, page, 1, addr); + page++; + vmf->pte++; + addr += PAGE_SIZE; + } folio_ref_add(folio, count); if (in_range(vmf->address, addr, count)) ret = VM_FAULT_NOPAGE;