X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fxen%2Fblktap%2Fxenbus.c;fp=drivers%2Fxen%2Fblktap%2Fxenbus.c;h=b08e1dcc1db4c29b565d9679826fb4b19bd48858;hb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;hp=b1ad47b529030e888054c257d0aa7c575cd3b590;hpb=4e76c8a9fa413ccc09d3f7f664183dcce3555d57;p=linux-2.6.git diff --git a/drivers/xen/blktap/xenbus.c b/drivers/xen/blktap/xenbus.c index b1ad47b52..b08e1dcc1 100644 --- a/drivers/xen/blktap/xenbus.c +++ b/drivers/xen/blktap/xenbus.c @@ -174,7 +174,7 @@ static int blktap_probe(struct xenbus_device *dev, } /* setup back pointer */ - be->blkif->be = be; + be->blkif->be = be; be->blkif->sectors = 0; /* set a watch on disk info, waiting for userspace to update details*/ @@ -247,6 +247,11 @@ static void tap_frontend_changed(struct xenbus_device *dev, switch (frontend_state) { case XenbusStateInitialising: + if (dev->state == XenbusStateClosed) { + printk("%s: %s: prepare for reconnect\n", + __FUNCTION__, dev->nodename); + xenbus_switch_state(dev, XenbusStateInitWait); + } break; case XenbusStateInitialised: @@ -264,15 +269,22 @@ static void tap_frontend_changed(struct xenbus_device *dev, break; case XenbusStateClosing: + if (be->blkif->xenblkd) { + kthread_stop(be->blkif->xenblkd); + be->blkif->xenblkd = NULL; + } xenbus_switch_state(dev, XenbusStateClosing); break; case XenbusStateClosed: + xenbus_switch_state(dev, XenbusStateClosed); + if (xenbus_dev_is_online(dev)) + break; + /* fall through if not online */ + case XenbusStateUnknown: device_unregister(&dev->dev); break; - case XenbusStateUnknown: - case XenbusStateInitWait: default: xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", frontend_state);