--- linux-2.6.17.noarch/drivers/xen/blkfront/blkfront.c.waitforme 2006-08-11 14:01:58.000000000 -0400 +++ linux-2.6.17.noarch/drivers/xen/blkfront/blkfront.c 2006-08-11 14:02:27.000000000 -0400 @@ -824,10 +824,17 @@ static struct xenbus_driver blkfront = { static int __init xlblk_init(void) { + int ret; + if (!is_running_on_xen()) return -ENODEV; - return xenbus_register_frontend(&blkfront); + ret = xenbus_register_frontend(&blkfront); + if (ret) + return ret; + + xenbus_wait_for_devices(); + return 0; } module_init(xlblk_init); --- linux-2.6.17.noarch/drivers/xen/netfront/netfront.c.waitforme 2006-08-11 14:02:41.000000000 -0400 +++ linux-2.6.17.noarch/drivers/xen/netfront/netfront.c 2006-08-11 14:03:19.000000000 -0400 @@ -1579,6 +1579,8 @@ static struct notifier_block notifier_in static int __init netif_init(void) { + int ret; + if (!is_running_on_xen()) return -ENODEV; @@ -1589,7 +1591,12 @@ static int __init netif_init(void) (void)register_inetaddr_notifier(¬ifier_inetdev); - return xenbus_register_frontend(&netfront); + ret = xenbus_register_frontend(&netfront); + if (ret) + return ret; + + xenbus_wait_for_devices(); + return 0; } module_init(netif_init); --- linux-2.6.17.noarch/drivers/xen/xenbus/xenbus_probe.c.waitforme 2006-08-11 13:59:37.000000000 -0400 +++ linux-2.6.17.noarch/drivers/xen/xenbus/xenbus_probe.c 2006-08-11 14:00:35.000000000 -0400 @@ -1067,7 +1067,7 @@ static int print_device_status(struct de * boot slightly, but of course needs tools or manual intervention to set up * those flags correctly. */ -static int __init wait_for_devices(void) +int xenbus_wait_for_devices(void) { unsigned long timeout = jiffies + 10*HZ; @@ -1083,4 +1083,5 @@ static int __init wait_for_devices(void) return 0; } -late_initcall(wait_for_devices); +EXPORT_SYMBOL(xenbus_wait_for_devices); +late_initcall(xenbus_wait_for_devices); --- linux-2.6.17.noarch/include/xen/xenbus.h.waitforme 2006-08-11 14:00:07.000000000 -0400 +++ linux-2.6.17.noarch/include/xen/xenbus.h 2006-08-11 14:01:31.000000000 -0400 @@ -157,6 +157,7 @@ int register_xenbus_watch(struct xenbus_ void unregister_xenbus_watch(struct xenbus_watch *watch); void xs_suspend(void); void xs_resume(void); +int xenbus_wait_for_devices(void); /* Used by xenbus_dev to borrow kernel's store connection. */ void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg);