unsigned long addr, unsigned long len,
                                            unsigned long pgoff, unsigned long flags)
 {
-       unsigned long maxpages, lpages, nr, loop, ret;
+       unsigned long maxpages, lpages, nr_folios, loop, ret, nr_pages, pfn;
        struct inode *inode = file_inode(file);
-       struct page **pages = NULL, **ptr, *page;
+       struct folio_batch fbatch;
        loff_t isize;
 
        /* the mapping mustn't extend beyond the EOF */
                goto out;
 
        /* gang-find the pages */
-       pages = kcalloc(lpages, sizeof(struct page *), GFP_KERNEL);
-       if (!pages)
-               goto out_free;
-
-       nr = find_get_pages_contig(inode->i_mapping, pgoff, lpages, pages);
-       if (nr != lpages)
-               goto out_free_pages; /* leave if some pages were missing */
+       folio_batch_init(&fbatch);
+       nr_pages = 0;
+repeat:
+       nr_folios = filemap_get_folios_contig(inode->i_mapping, &pgoff,
+                       ULONG_MAX, &fbatch);
+       if (!nr_folios) {
+               ret = -ENOSYS;
+               return ret;
+       }
 
+       if (ret == -ENOSYS) {
+               ret = (unsigned long) folio_address(fbatch.folios[0]);
+               pfn = folio_pfn(fbatch.folios[0]);
+       }
        /* check the pages for physical adjacency */
-       ptr = pages;
-       page = *ptr++;
-       page++;
-       for (loop = lpages; loop > 1; loop--)
-               if (*ptr++ != page++)
-                       goto out_free_pages;
+       for (loop = 0; loop < nr_folios; loop++) {
+               if (pfn + nr_pages != folio_pfn(fbatch.folios[loop])) {
+                       ret = -ENOSYS;
+                       goto out_free; /* leave if not physical adjacent */
+               }
+               nr_pages += folio_nr_pages(fbatch.folios[loop]);
+               if (nr_pages >= lpages)
+                       goto out_free; /* successfully found desired pages*/
+       }
 
+       if (nr_pages < lpages) {
+               folio_batch_release(&fbatch);
+               goto repeat; /* loop if pages are missing */
+       }
        /* okay - all conditions fulfilled */
-       ret = (unsigned long) page_address(pages[0]);
 
-out_free_pages:
-       ptr = pages;
-       for (loop = nr; loop > 0; loop--)
-               put_page(*ptr++);
 out_free:
-       kfree(pages);
+       folio_batch_release(&fbatch);
 out:
        return ret;
 }