pages[i]->persistent_gnt = persistent_gnt;
                } else {
                        if (gnttab_page_cache_get(&ring->free_pages,
-                                                 &pages[i]->page))
-                               goto out_of_memory;
+                                                 &pages[i]->page)) {
+                               gnttab_page_cache_put(&ring->free_pages,
+                                                     pages_to_gnt,
+                                                     segs_to_map);
+                               ret = -ENOMEM;
+                               goto out;
+                       }
                        addr = vaddr(pages[i]->page);
                        pages_to_gnt[segs_to_map] = pages[i]->page;
                        pages[i]->persistent_gnt = NULL;
        }
        segs_to_map = 0;
        last_map = map_until;
-       if (map_until != num)
+       if (!ret && map_until != num)
                goto again;
 
-       return ret;
-
-out_of_memory:
-       pr_alert("%s: out of memory\n", __func__);
-       gnttab_page_cache_put(&ring->free_pages, pages_to_gnt, segs_to_map);
-       for (i = last_map; i < num; i++)
+out:
+       for (i = last_map; i < num; i++) {
+               /* Don't zap current batch's valid persistent grants. */
+               if(i >= last_map + segs_to_map)
+                       pages[i]->persistent_gnt = NULL;
                pages[i]->handle = BLKBACK_INVALID_HANDLE;
-       return -ENOMEM;
+       }
+
+       return ret;
 }
 
 static int xen_blkbk_map_seg(struct pending_req *pending_req)