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