|
@@ -271,6 +271,11 @@ static int netback_probe(struct xenbus_device *dev,
|
|
|
be->dev = dev;
|
|
|
dev_set_drvdata(&dev->dev, be);
|
|
|
|
|
|
+ be->state = XenbusStateInitialising;
|
|
|
+ err = xenbus_switch_state(dev, XenbusStateInitialising);
|
|
|
+ if (err)
|
|
|
+ goto fail;
|
|
|
+
|
|
|
sg = 1;
|
|
|
|
|
|
do {
|
|
@@ -383,11 +388,6 @@ static int netback_probe(struct xenbus_device *dev,
|
|
|
|
|
|
be->hotplug_script = script;
|
|
|
|
|
|
- err = xenbus_switch_state(dev, XenbusStateInitWait);
|
|
|
- if (err)
|
|
|
- goto fail;
|
|
|
-
|
|
|
- be->state = XenbusStateInitWait;
|
|
|
|
|
|
/* This kicks hotplug scripts, so do it immediately. */
|
|
|
err = backend_create_xenvif(be);
|
|
@@ -492,20 +492,20 @@ static inline void backend_switch_state(struct backend_info *be,
|
|
|
|
|
|
/* Handle backend state transitions:
|
|
|
*
|
|
|
- * The backend state starts in InitWait and the following transitions are
|
|
|
+ * The backend state starts in Initialising and the following transitions are
|
|
|
* allowed.
|
|
|
*
|
|
|
- * InitWait -> Connected
|
|
|
- *
|
|
|
- * ^ \ |
|
|
|
- * | \ |
|
|
|
- * | \ |
|
|
|
- * | \ |
|
|
|
- * | \ |
|
|
|
- * | \ |
|
|
|
- * | V V
|
|
|
+ * Initialising -> InitWait -> Connected
|
|
|
+ * \
|
|
|
+ * \ ^ \ |
|
|
|
+ * \ | \ |
|
|
|
+ * \ | \ |
|
|
|
+ * \ | \ |
|
|
|
+ * \ | \ |
|
|
|
+ * \ | \ |
|
|
|
+ * V | V V
|
|
|
*
|
|
|
- * Closed <-> Closing
|
|
|
+ * Closed <-> Closing
|
|
|
*
|
|
|
* The state argument specifies the eventual state of the backend and the
|
|
|
* function transitions to that state via the shortest path.
|
|
@@ -515,6 +515,20 @@ static void set_backend_state(struct backend_info *be,
|
|
|
{
|
|
|
while (be->state != state) {
|
|
|
switch (be->state) {
|
|
|
+ case XenbusStateInitialising:
|
|
|
+ switch (state) {
|
|
|
+ case XenbusStateInitWait:
|
|
|
+ case XenbusStateConnected:
|
|
|
+ case XenbusStateClosing:
|
|
|
+ backend_switch_state(be, XenbusStateInitWait);
|
|
|
+ break;
|
|
|
+ case XenbusStateClosed:
|
|
|
+ backend_switch_state(be, XenbusStateClosed);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+ break;
|
|
|
case XenbusStateClosed:
|
|
|
switch (state) {
|
|
|
case XenbusStateInitWait:
|