{
        swp_entry_t swp;
        struct swap_info_struct *si;
-       struct page *page = pagecache_get_page(mapping, index,
-                                               FGP_ENTRY | FGP_HEAD, 0);
+       struct folio *folio = __filemap_get_folio(mapping, index, FGP_ENTRY, 0);
 
-       if (!page)
-               return page;
-       if (!xa_is_value(page))
-               return find_subpage(page, index);
+       if (!xa_is_value(folio))
+               goto out;
        if (!shmem_mapping(mapping))
                return NULL;
 
-       swp = radix_to_swp_entry(page);
+       swp = radix_to_swp_entry(folio);
        /* There might be swapin error entries in shmem mapping. */
        if (non_swap_entry(swp))
                return NULL;
        si = get_swap_device(swp);
        if (!si)
                return NULL;
-       page = find_get_page(swap_address_space(swp), swp_offset(swp));
+       index = swp_offset(swp);
+       folio = filemap_get_folio(swap_address_space(swp), index);
        put_swap_device(si);
-       return page;
+out:
+       if (!folio)
+               return NULL;
+       return folio_file_page(folio, index);
 }
 
 struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,