* do_exit() will not see it, and will keep the reservation
                 * forever.
                 */
-               if (adjust_reservation && vma_needs_reservation(h, vma, address))
-                       vma_add_reservation(h, vma, address);
+               if (adjust_reservation) {
+                       int rc = vma_needs_reservation(h, vma, address);
+
+                       if (rc < 0)
+                               /* Pressumably allocate_file_region_entries failed
+                                * to allocate a file_region struct. Clear
+                                * hugetlb_restore_reserve so that global reserve
+                                * count will not be incremented by free_huge_folio.
+                                * Act as if we consumed the reservation.
+                                */
+                               folio_clear_hugetlb_restore_reserve(page_folio(page));
+                       else if (rc)
+                               vma_add_reservation(h, vma, address);
+               }
 
                tlb_remove_page_size(tlb, page, huge_page_size(h));
                /*