struct xenbus_transaction xbt;
        const char *message = NULL;
        int rv;
-       grant_ref_t gref;
 
-       priv->shr = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
-       if (!priv->shr) {
-               xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
-               return -ENOMEM;
-       }
-
-       rv = xenbus_grant_ring(dev, priv->shr, 1, &gref);
+       rv = xenbus_setup_ring(dev, GFP_KERNEL, (void **)&priv->shr, 1,
+                              &priv->ring_ref);
        if (rv < 0)
                return rv;
 
-       priv->ring_ref = gref;
-
        rv = xenbus_alloc_evtchn(dev, &priv->evtchn);
        if (rv)
                return rv;
        if (!priv)
                return;
 
-       if (priv->ring_ref)
-               gnttab_end_foreign_access(priv->ring_ref,
-                               (unsigned long)priv->shr);
-       else
-               free_page((unsigned long)priv->shr);
+       xenbus_teardown_ring((void **)&priv->shr, 1, &priv->ring_ref);
 
        if (priv->irq)
                unbind_from_irqhandler(priv->irq, priv);