* and the hugetlb mutex should remain held when calling this routine.
  *
  * It handles two specific cases:
- * 1) A reservation was in place and the page consumed the reservation.
- *    HPageRestoreReserve is set in the page.
- * 2) No reservation was in place for the page, so HPageRestoreReserve is
+ * 1) A reservation was in place and the folio consumed the reservation.
+ *    hugetlb_restore_reserve is set in the folio.
+ * 2) No reservation was in place for the page, so hugetlb_restore_reserve is
  *    not set.  However, alloc_hugetlb_folio always updates the reserve map.
  *
  * In case 1, free_huge_page later in the error path will increment the
  * In case 2, simply undo reserve map modifications done by alloc_hugetlb_folio.
  */
 void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma,
-                       unsigned long address, struct page *page)
+                       unsigned long address, struct folio *folio)
 {
-       struct folio *folio = page_folio(page);
        long rc = vma_needs_reservation(h, vma, address);
 
        if (folio_test_hugetlb_restore_reserve(folio)) {
                                entry = huge_ptep_get(src_pte);
                                if (!pte_same(src_pte_old, entry)) {
                                        restore_reserve_on_error(h, dst_vma, addr,
-                                                               &new_folio->page);
+                                                               new_folio);
                                        folio_put(new_folio);
                                        /* huge_ptep of dst_pte won't change as in child */
                                        goto again;
         * unshare)
         */
        if (new_folio != page_folio(old_page))
-               restore_reserve_on_error(h, vma, haddr, &new_folio->page);
+               restore_reserve_on_error(h, vma, haddr, new_folio);
        folio_put(new_folio);
 out_release_old:
        put_page(old_page);
                                 * to the page cache. So it's safe to call
                                 * restore_reserve_on_error() here.
                                 */
-                               restore_reserve_on_error(h, vma, haddr, &folio->page);
+                               restore_reserve_on_error(h, vma, haddr, folio);
                                folio_put(folio);
                                goto out;
                        }
        spin_unlock(ptl);
 backout_unlocked:
        if (new_folio && !new_pagecache_folio)
-               restore_reserve_on_error(h, vma, haddr, &folio->page);
+               restore_reserve_on_error(h, vma, haddr, folio);
 
        folio_unlock(folio);
        folio_put(folio);
                        /* Free the allocated folio which may have
                         * consumed a reservation.
                         */
-                       restore_reserve_on_error(h, dst_vma, dst_addr, &folio->page);
+                       restore_reserve_on_error(h, dst_vma, dst_addr, folio);
                        folio_put(folio);
 
                        /* Allocate a temporary folio to hold the copied
                folio_unlock(folio);
 out_release_nounlock:
        if (!folio_in_pagecache)
-               restore_reserve_on_error(h, dst_vma, dst_addr, &folio->page);
+               restore_reserve_on_error(h, dst_vma, dst_addr, folio);
        folio_put(folio);
        goto out;
 }