--- ./linux-2.6.16.x86_64/drivers/xen/xenbus/xenbus_probe.c.timeout-message 2006-06-27 20:50:43.000000000 +0100 +++ ./linux-2.6.16.x86_64/drivers/xen/xenbus/xenbus_probe.c 2006-06-30 18:48:02.000000000 +0100 @@ -879,29 +879,19 @@ EXPORT_SYMBOL_GPL(unregister_xenstore_notifier); -static int all_devices_ready_(struct device *dev, void *data) +static int find_disconnected_device_(struct device *dev, void *data) { struct xenbus_device *xendev = to_xenbus_device(dev); - int *result = data; - if (xendev->state != XenbusStateConnected) { - *result = 0; - return 1; - } - - return 0; + return (dev->driver == NULL || xendev->state == XenbusStateConnected) ? 0 : 1; } - -static int all_devices_ready(void) +static struct device *find_disconnected_device(struct device *start) { - int ready = 1; - bus_for_each_dev(&xenbus_frontend.bus, NULL, &ready, - all_devices_ready_); - return ready; + return bus_find_device(&xenbus_frontend.bus, start, NULL, + find_disconnected_device_); } - void xenbus_probe(void *unused) { BUG_ON((xenstored_ready <= 0)); @@ -1066,17 +1056,30 @@ static int __init wait_for_devices(void) { unsigned long timeout = jiffies + 10*HZ; + struct device *dev = NULL; + struct xenbus_device *xendev; if (!is_running_on_xen()) return -ENODEV; while (time_before(jiffies, timeout)) { - if (all_devices_ready()) + if ((dev = find_disconnected_device(NULL)) == NULL) return 0; + put_device(dev); schedule_timeout_interruptible(HZ/10); } - printk(KERN_WARNING "XENBUS: Timeout connecting to devices!\n"); + dev = NULL; + + while ((dev = find_disconnected_device(dev)) != NULL) { + xendev = to_xenbus_device(dev); + + printk(KERN_WARNING "XENBUS: Timeout connecting to device: %s\n", + xendev->nodename); + + put_device(dev); + } + return 0; }