/* Handle backend state transitions: * * The backend state starts in Initialising and the following transitions are * allowed. * * Initialising -> InitWait -> Connected * \ * \ ^ \ | * \ | \ | * \ | \ | * \ | \ | * \ | \ | * \ | \ | * V | V V * * Closed <-> Closing * * The state argument specifies the eventual state of the backend and the * function transitions to that state via the shortest path. */ static void set_backend_state(struct backend_info *be, enum xenbus_state state) { 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: case XenbusStateConnected: backend_switch_state(be, XenbusStateInitWait); break; case XenbusStateClosing: backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateInitWait: switch (state) { case XenbusStateConnected: backend_connect(be); backend_switch_state(be, XenbusStateConnected); break; case XenbusStateClosing: case XenbusStateClosed: backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateConnected: switch (state) { case XenbusStateInitWait: case XenbusStateClosing: case XenbusStateClosed: backend_disconnect(be); backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateClosing: switch (state) { case XenbusStateInitWait: case XenbusStateConnected: case XenbusStateClosed: backend_switch_state(be, XenbusStateClosed); break; default: BUG(); } break; default: BUG(); } } }
/* Handle backend state transitions: * * The backend state starts in InitWait and the following transitions are * allowed. * * InitWait -> Connected * * ^ \ | * | \ | * | \ | * | \ | * | \ | * | \ | * | V V * * Closed <-> Closing * * The state argument specifies the eventual state of the backend and the * function transitions to that state via the shortest path. */ static void set_backend_state(struct backend_info *be, enum xenbus_state state) { while (be->state != state) { switch (be->state) { case XenbusStateClosed: switch (state) { case XenbusStateInitWait: case XenbusStateConnected: pr_info("%s: prepare for reconnect\n", be->dev->nodename); backend_switch_state(be, XenbusStateInitWait); break; case XenbusStateClosing: backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateInitWait: switch (state) { case XenbusStateConnected: backend_connect(be); backend_switch_state(be, XenbusStateConnected); break; case XenbusStateClosing: case XenbusStateClosed: backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateConnected: switch (state) { case XenbusStateInitWait: case XenbusStateClosing: case XenbusStateClosed: backend_disconnect(be); backend_switch_state(be, XenbusStateClosing); break; default: BUG(); } break; case XenbusStateClosing: switch (state) { case XenbusStateInitWait: case XenbusStateConnected: case XenbusStateClosed: backend_switch_state(be, XenbusStateClosed); break; default: BUG(); } break; default: BUG(); } } }