diff options
author | gibbs <gibbs@FreeBSD.org> | 2012-03-25 14:20:43 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2012-03-25 14:20:43 +0000 |
commit | fd2370c0573dde79a290d6194b6b88aa8b6b2cb1 (patch) | |
tree | aef237ec065dc3e3098e0fec613495b94e6e3bc9 /sys/dev | |
parent | 9edb0f9ffba451a0006f5d41d66048d6ac01df9a (diff) | |
download | FreeBSD-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.c | 34 |
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, |