svn commit: r334315 - stable/11/sys/dev/xen/blkback
Roger Pau Monné
royger at FreeBSD.org
Tue May 29 07:51:25 UTC 2018
Author: royger
Date: Tue May 29 07:51:24 2018
New Revision: 334315
URL: https://svnweb.freebsd.org/changeset/base/334315
Log:
MFC r334027: xen-blkback: do not use state 3
Linux will not connect to a backend that's in state 3
(XenbusStateInitialised), it needs to be in state 2
(XenbusStateInitWait) for Linux to attempt to connect to the
backend.
Approved by: re (kib)
Modified:
stable/11/sys/dev/xen/blkback/blkback.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/xen/blkback/blkback.c
==============================================================================
--- stable/11/sys/dev/xen/blkback/blkback.c Tue May 29 07:14:57 2018 (r334314)
+++ stable/11/sys/dev/xen/blkback/blkback.c Tue May 29 07:51:24 2018 (r334315)
@@ -804,6 +804,9 @@ struct xbb_softc {
/** Watch to wait for hotplug script execution */
struct xs_watch hotplug_watch;
+
+ /** Got the needed data from hotplug scripts? */
+ bool hotplug_done;
};
/*---------------------------- Request Processing ----------------------------*/
@@ -3308,12 +3311,11 @@ xbb_connect(struct xbb_softc *xbb)
{
int error;
- if (xenbus_get_state(xbb->dev) != XenbusStateInitialised)
+ if (!xbb->hotplug_done ||
+ (xenbus_get_state(xbb->dev) != XenbusStateInitWait) ||
+ (xbb_collect_frontend_info(xbb) != 0))
return;
- if (xbb_collect_frontend_info(xbb) != 0)
- return;
-
xbb->flags &= ~XBBF_SHUTDOWN;
/*
@@ -3410,6 +3412,7 @@ xbb_shutdown(struct xbb_softc *xbb)
free(xbb->hotplug_watch.node, M_XENBLOCKBACK);
xbb->hotplug_watch.node = NULL;
}
+ xbb->hotplug_done = false;
if (xenbus_get_state(xbb->dev) < XenbusStateClosing)
xenbus_set_state(xbb->dev, XenbusStateClosing);
@@ -3690,8 +3693,11 @@ xbb_attach_disk(struct xs_watch *watch, const char **v
return;
}
- /* Tell the front end that we are ready to connect. */
- xenbus_set_state(dev, XenbusStateInitialised);
+ xbb->hotplug_done = true;
+
+ /* The front end might be waiting for the backend, attach if so. */
+ if (xenbus_get_otherend_state(xbb->dev) == XenbusStateInitialised)
+ xbb_connect(xbb);
}
/**
@@ -3755,6 +3761,7 @@ xbb_attach(device_t dev)
* We need to wait for hotplug script execution before
* moving forward.
*/
+ KASSERT(!xbb->hotplug_done, ("Hotplug scripts already executed"));
watch_path = xs_join(xenbus_get_node(xbb->dev), "physical-device-path");
xbb->hotplug_watch.callback_data = (uintptr_t)dev;
xbb->hotplug_watch.callback = xbb_attach_disk;
More information about the svn-src-all
mailing list