/* Called by xenbus when our backend node changes state */ static void pcifront_backend_changed(struct xenbus_device *xdev, XenbusState be_state) { struct pcifront_device *pdev = xdev->data; switch (be_state) { case XenbusStateClosing: DPRINTF("backend closing (%s)\n", xdev->nodename); pcifront_disconnect(pdev); break; case XenbusStateClosed: DPRINTF("backend closed (%s)\n", xdev->nodename); pcifront_disconnect(pdev); break; case XenbusStateConnected: DPRINTF("backend connected (%s)\n", xdev->nodename); pcifront_connect(pdev); break; default: break; } }
static int pcifront_try_disconnect(struct pcifront_device *pdev) { int err = 0; enum xenbus_state prev_state; spin_lock(&pdev->dev_lock); prev_state = xenbus_read_driver_state(pdev->xdev->nodename); if (prev_state >= XenbusStateClosing) goto out; if(prev_state == XenbusStateConnected) { pcifront_free_roots(pdev); pcifront_disconnect(pdev); } err = xenbus_switch_state(pdev->xdev, XenbusStateClosed); out: spin_unlock(&pdev->dev_lock); return err; }