diff options
Diffstat (limited to 'drivers/net/xen-netback')
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 46 | 
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 6a31f2610c23..daf4c7867102 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -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:  | 
