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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to