if (idx >= size)
                goto out;
 
-retry:
        new_page = false;
        page = find_lock_page(mapping, idx);
        if (!page) {
                if (vma->vm_flags & VM_MAYSHARE) {
                        int err = huge_add_to_page_cache(page, mapping, idx);
                        if (err) {
+                               /*
+                                * err can't be -EEXIST which implies someone
+                                * else consumed the reservation since hugetlb
+                                * fault mutex is held when add a hugetlb page
+                                * to the page cache. So it's safe to call
+                                * restore_reserve_on_error() here.
+                                */
+                               restore_reserve_on_error(h, vma, haddr, page);
                                put_page(page);
-                               if (err == -EEXIST)
-                                       goto retry;
                                goto out;
                        }
                        new_pagecache_page = true;