X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fxen%2Fblkback%2Fxenbus.c;h=419d00e0301650ef18c07c65e4ea5bee78e2c1f5;hb=refs%2Fheads%2Fvserver;hp=59d93242b5b203c45e6afb1a738774780da29607;hpb=1db395853d4f30d6120458bd279ede1f882a8525;p=linux-2.6.git diff --git a/drivers/xen/blkback/xenbus.c b/drivers/xen/blkback/xenbus.c index 59d93242b..419d00e03 100644 --- a/drivers/xen/blkback/xenbus.c +++ b/drivers/xen/blkback/xenbus.c @@ -194,7 +194,7 @@ static int blkback_probe(struct xenbus_device *dev, } /* setup back pointer */ - be->blkif->be = be; + be->blkif->be = be; err = xenbus_watch_path2(dev, dev->nodename, "physical-device", &be->backend_watch, backend_changed); @@ -287,7 +287,7 @@ static void backend_changed(struct xenbus_watch *watch, } /* We're potentially connected now */ - update_blkif_status(be->blkif); + update_blkif_status(be->blkif); } } @@ -301,10 +301,15 @@ static void frontend_changed(struct xenbus_device *dev, struct backend_info *be = dev->dev.driver_data; int err; - DPRINTK(""); + DPRINTK("%s", xenbus_strstate(frontend_state)); 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: @@ -327,11 +332,14 @@ static void frontend_changed(struct xenbus_device *dev, 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); @@ -364,7 +372,7 @@ again: return; } - err = xenbus_printf(xbt, dev->nodename, "sectors", "%lu", + err = xenbus_printf(xbt, dev->nodename, "sectors", "%llu", vbd_size(&be->blkif->vbd)); if (err) { xenbus_dev_fatal(dev, err, "writing %s/sectors",