/* * Callback received when the frontend's state changes. */ static void frontend_changed(struct xenbus_device *dev, enum xenbus_state frontend_state) { struct backend_info *be = dev_get_drvdata(&dev->dev); int err; DPRINTK("%s", xenbus_strstate(frontend_state)); switch (frontend_state) { case XenbusStateInitialising: if (dev->state == XenbusStateClosed) { pr_info(DRV_PFX "%s: prepare for reconnect\n", dev->nodename); xenbus_switch_state(dev, XenbusStateInitWait); } break; case XenbusStateInitialised: case XenbusStateConnected: /* * Ensure we connect even when two watches fire in * close successsion and we miss the intermediate value * of frontend_state. */ if (dev->state == XenbusStateConnected) break; /* * Enforce precondition before potential leak point. * xen_blkif_disconnect() is idempotent. */ xen_blkif_disconnect(be->blkif); err = connect_ring(be); if (err) break; xen_update_blkif_status(be->blkif); break; case XenbusStateClosing: xenbus_switch_state(dev, XenbusStateClosing); break; case XenbusStateClosed: xen_blkif_disconnect(be->blkif); xenbus_switch_state(dev, XenbusStateClosed); if (xenbus_dev_is_online(dev)) break; /* fall through if not online */ case XenbusStateUnknown: /* implies xen_blkif_disconnect() via xen_blkbk_remove() */ device_unregister(&dev->dev); break; default: xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", frontend_state); break; } }
static void frontend_changed(struct xenbus_device *dev, enum xenbus_state frontend_state) { struct backend_info *be = dev->data; int err; be->frontend_state = frontend_state; switch (frontend_state) { case XenbusStateInitialising: case XenbusStateInitialised: break; case XenbusStateConnected: err = connect_ring(be); if (err) { return; } maybe_connect(be); break; case XenbusStateClosing: be->tpmif->tpm_instance = -1; break; case XenbusStateClosed: /* * Notify the vTPM manager about the front-end * having left. */ tpmif_vtpm_close(be->instance); device_unregister(&be->dev->dev); tpmback_remove(dev); break; case XenbusStateUnknown: case XenbusStateInitWait: default: xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", frontend_state); break; } }
/** * Callback received when the frontend's state changes. */ static void frontend_changed(struct xenbus_device *dev, enum xenbus_state frontend_state) { struct backend_info *be = dev->data; int err; DPRINTK(""); switch (frontend_state) { case XenbusStateInitialising: break; case XenbusStateInitialised: case XenbusStateConnected: /* Ensure we connect even when two watches fire in close successsion and we miss the intermediate value of frontend_state. */ if (dev->state == XenbusStateConnected) break; err = connect_ring(be); if (err) break; update_blkif_status(be->blkif); break; case XenbusStateClosing: xenbus_switch_state(dev, XenbusStateClosing); break; case XenbusStateClosed: device_unregister(&dev->dev); break; case XenbusStateUnknown: case XenbusStateInitWait: default: xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", frontend_state); break; } }
static void connect(struct backend_info *be) { int err; struct xenbus_device *dev = be->dev; err = connect_ring(be); if(err){ printk("\nxen: dom0: connect ring fail"); return; } /* err = xenbus_watch_pathfmt(dev, &be->hotplug_status_watch, hotplug_status_changed, "%s/%s", dev->nodename,"hotplug-status"); if(err){ xenbus_switch_state(dev, XenbusStateConnected); }else{ */ xenbus_switch_state(dev, XenbusStateConnected); printk("\nxen: dom0: connect()--change state to XenbusStateConnected"); printk("\nxen: dom0: connect finished, otherend_id "); }
static void frontend_changed(struct xenbus_device *dev, enum xenbus_state frontend_state) { struct backend_info *be = dev->dev.driver_data; int err; switch (frontend_state) { case XenbusStateInitialising: case XenbusStateInitialised: break; case XenbusStateConnected: err = connect_ring(be); if (err) { return; } maybe_connect(be); break; case XenbusStateClosing: be->instance = -1; break; case XenbusStateUnknown: case XenbusStateClosed: device_unregister(&be->dev->dev); tpmback_remove(dev); break; default: xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", frontend_state); break; } }