From 003ae95a7d1c9bdfe029952cca64ce6b6f8f56e4 Mon Sep 17 00:00:00 2001 From: gibbs Date: Mon, 2 Apr 2012 16:50:48 +0000 Subject: [PATCH] MFC Revision 233465 Correct failure to attach the PV block front device on Citrix XenServer configurations that advertise the multi-page ring extension, but only allow a single page of ring space. sys/dev/xen/blkfront/blkfront.c: If only one page of ring space is being used, do not publish in the XenStore the number of pages in use (1), via either of the supported multi-page ring extension schemes. Single page operation is the same with or without the ring-page extension being negotiated. Relying on the legacy behavior avoids an incompatible difference in how the two ring-page extension schemes that are out in the wild deal with the base case of a single page. The Amazon/Red Hat drivers use the same XenStore variable as if the extension was not negotiated. The Citrix drivers assume the new ring reference XenStore variables will be available. Reported by: Oliver Schonefeld git-svn-id: svn://svn.freebsd.org/base/stable/8@233791 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/xen/blkfront/blkfront.c | 34 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index 797ab76c8..1467db4d8 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -698,21 +698,25 @@ blkfront_initialize(struct xb_softc *sc) return; /* Support both backend schemes for relaying ring page limits. */ - error = xs_printf(XST_NIL, node_path, - "num-ring-pages","%u", sc->ring_pages); - if (error) { - xenbus_dev_fatal(sc->xb_dev, error, - "writing %s/num-ring-pages", - node_path); - return; - } - error = xs_printf(XST_NIL, node_path, - "ring-page-order","%u", fls(sc->ring_pages) - 1); - if (error) { - xenbus_dev_fatal(sc->xb_dev, error, - "writing %s/ring-page-order", - node_path); - return; + if (sc->ring_pages > 1) { + error = xs_printf(XST_NIL, node_path, + "num-ring-pages","%u", sc->ring_pages); + if (error) { + xenbus_dev_fatal(sc->xb_dev, error, + "writing %s/num-ring-pages", + node_path); + return; + } + + error = xs_printf(XST_NIL, node_path, + "ring-page-order", "%u", + fls(sc->ring_pages) - 1); + if (error) { + xenbus_dev_fatal(sc->xb_dev, error, + "writing %s/ring-page-order", + node_path); + return; + } } error = xs_printf(XST_NIL, node_path, -- 2.45.0