Index: linux-2.6.20.i386/drivers/xen/blkfront/blkfront.c =================================================================== --- linux-2.6.20.i386.orig/drivers/xen/blkfront/blkfront.c +++ linux-2.6.20.i386/drivers/xen/blkfront/blkfront.c @@ -343,6 +343,8 @@ static void connect(struct blkfront_info spin_unlock_irq(&blkif_io_lock); add_disk(info->gd); + + info->is_ready = 1; } /** @@ -852,6 +854,13 @@ static void blkif_recover(struct blkfron spin_unlock_irq(&blkif_io_lock); } +int blkfront_is_ready(struct xenbus_device *dev) +{ + struct blkfront_info *info = dev->dev.driver_data; + + return info->is_ready; +} + /* ** Driver Registration ** */ @@ -870,6 +879,7 @@ static struct xenbus_driver blkfront = { .remove = blkfront_remove, .resume = blkfront_resume, .otherend_changed = backend_changed, + .is_ready = blkfront_is_ready, }; Index: linux-2.6.20.i386/drivers/xen/blkfront/block.h =================================================================== --- linux-2.6.20.i386.orig/drivers/xen/blkfront/block.h +++ linux-2.6.20.i386/drivers/xen/blkfront/block.h @@ -125,6 +125,7 @@ struct blkfront_info struct blk_shadow shadow[BLK_RING_SIZE]; unsigned long shadow_free; int feature_barrier; + int is_ready; /** * The number of people holding this device open. We won't allow a Index: linux-2.6.20.i386/drivers/xen/xenbus/xenbus_probe.c =================================================================== --- linux-2.6.20.i386.orig/drivers/xen/xenbus/xenbus_probe.c +++ linux-2.6.20.i386/drivers/xen/xenbus/xenbus_probe.c @@ -940,6 +940,7 @@ static int is_disconnected_device(struct { struct xenbus_device *xendev = to_xenbus_device(dev); struct device_driver *drv = data; + struct xenbus_driver *xendrv; /* * A device with no driver will never connect. We care only about @@ -952,7 +953,9 @@ static int is_disconnected_device(struct if (drv && (dev->driver != drv)) return 0; - return (xendev->state != XenbusStateConnected); + xendrv = to_xenbus_driver(dev->driver); + return (xendev->state != XenbusStateConnected || + (xendrv->is_ready && !xendrv->is_ready(xendev))); } static int exists_disconnected_device(struct device_driver *drv) Index: linux-2.6.20.i386/include/xen/xenbus.h =================================================================== --- linux-2.6.20.i386.orig/include/xen/xenbus.h +++ linux-2.6.20.i386/include/xen/xenbus.h @@ -105,6 +105,7 @@ struct xenbus_driver { int (*uevent)(struct xenbus_device *, char **, int, char *, int); struct device_driver driver; int (*read_otherend_details)(struct xenbus_device *dev); + int (*is_ready)(struct xenbus_device *dev); }; static inline struct xenbus_driver *to_xenbus_driver(struct device_driver *drv)