* existing persistent grants, or if we have to get new grants,
         * as there are not sufficiently many free.
         */
+       bool new_persistent_gnts = false;
        struct scatterlist *sg;
        int num_sg, max_grefs, num_grant;
 
                 */
                max_grefs += INDIRECT_GREFS(max_grefs);
 
-       /*
-        * We have to reserve 'max_grefs' grants because persistent
-        * grants are shared by all rings.
-        */
-       if (max_grefs > 0)
-               if (gnttab_alloc_grant_references(max_grefs, &setup.gref_head) < 0) {
+       /* Check if we have enough persistent grants to allocate a requests */
+       if (rinfo->persistent_gnts_c < max_grefs) {
+               new_persistent_gnts = true;
+
+               if (gnttab_alloc_grant_references(
+                   max_grefs - rinfo->persistent_gnts_c,
+                   &setup.gref_head) < 0) {
                        gnttab_request_free_callback(
                                &rinfo->callback,
                                blkif_restart_queue_callback,
                                rinfo,
-                               max_grefs);
+                               max_grefs - rinfo->persistent_gnts_c);
                        return 1;
                }
+       }
 
        /* Fill out a communications ring structure. */
        id = blkif_ring_get_request(rinfo, req, &ring_req);
        if (unlikely(require_extra_req))
                rinfo->shadow[extra_id].req = *extra_ring_req;
 
-       if (max_grefs > 0)
+       if (new_persistent_gnts)
                gnttab_free_grant_references(setup.gref_head);
 
        return 0;