summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>2012-03-25 14:20:43 +0000
committergibbs <gibbs@FreeBSD.org>2012-03-25 14:20:43 +0000
commitfd2370c0573dde79a290d6194b6b88aa8b6b2cb1 (patch)
treeaef237ec065dc3e3098e0fec613495b94e6e3bc9 /sys/dev
parent9edb0f9ffba451a0006f5d41d66048d6ac01df9a (diff)
downloadFreeBSD-src-fd2370c0573dde79a290d6194b6b88aa8b6b2cb1.zip
FreeBSD-src-fd2370c0573dde79a290d6194b6b88aa8b6b2cb1.tar.gz
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 <schonefeld@ids-mannheim.de> MFC after: 3 days
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/xen/blkfront/blkfront.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c
index 3061a82..f36ffb1 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,
OpenPOWER on IntegriCloud