diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2009-02-09 12:05:51 -0800 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-01-05 16:29:58 -0500 |
commit | df660251eb534649f90f9dcfe1da1cef4ea48a3e (patch) | |
tree | f4ce5d401d16f13437f553117acb7807d05ed2dd /drivers/xen/xenbus/xenbus_probe_frontend.c | |
parent | 2de06cc1f18d638cc7ab1169f61a8599045c2d4f (diff) |
xen: add backend driver support
Impact: backend device support
Add the basic machinery to support backend drivers.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
[corresponds to 79727b851bac in git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen/xenbus/xenbus_probe_frontend.c')
-rw-r--r-- | drivers/xen/xenbus/xenbus_probe_frontend.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/drivers/xen/xenbus/xenbus_probe_frontend.c b/drivers/xen/xenbus/xenbus_probe_frontend.c index 04c4f012352..dd31d5a43b4 100644 --- a/drivers/xen/xenbus/xenbus_probe_frontend.c +++ b/drivers/xen/xenbus/xenbus_probe_frontend.c @@ -62,6 +62,17 @@ static int xenbus_probe_frontend(struct xen_bus_type *bus, const char *type, con return err; } +static int xenbus_uevent_frontend(struct device *_dev, struct kobj_uevent_env *env) +{ + struct xenbus_device *dev = to_xenbus_device(_dev); + + if (add_uevent_var(env, "MODALIAS=xen:%s", dev->devicetype)) + return -ENOMEM; + + return 0; +} + + static void backend_changed(struct xenbus_watch *watch, const char **vec, unsigned int len) { @@ -81,7 +92,7 @@ static struct xen_bus_type xenbus_frontend = { .bus = { .name = "xen", .match = xenbus_match, - .uevent = xenbus_uevent, + .uevent = xenbus_uevent_frontend, .probe = xenbus_dev_probe, .remove = xenbus_dev_remove, .shutdown = xenbus_dev_shutdown, @@ -232,8 +243,25 @@ int __xenbus_register_frontend(struct xenbus_driver *drv, } EXPORT_SYMBOL_GPL(__xenbus_register_frontend); +static int frontend_probe_and_watch(struct notifier_block *notifier, + unsigned long event, + void *data) +{ + /* Enumerate devices in xenstore and watch for changes. */ + xenbus_probe_devices(&xenbus_frontend); + printk(KERN_CRIT "%s devices probed ok\n", __func__); + register_xenbus_watch(&fe_watch); + printk(KERN_CRIT "%s watch add ok ok\n", __func__); + printk(KERN_CRIT "%s all done\n", __func__); + return NOTIFY_DONE; +} + + static int __init xenbus_probe_frontend_init(void) { + static struct notifier_block xenstore_notifier = { + .notifier_call = frontend_probe_and_watch + }; int err; DPRINTK(""); @@ -246,14 +274,7 @@ static int __init xenbus_probe_frontend_init(void) } printk(KERN_CRIT "%s bus registered ok\n", __func__); - if (!xen_initial_domain()) { - /* Enumerate devices in xenstore and watch for changes. */ - xenbus_probe_devices(&xenbus_frontend); - printk(KERN_CRIT "%s devices probed ok\n", __func__); - register_xenbus_watch(&fe_watch); - printk(KERN_CRIT "%s watch add ok ok\n", __func__); - printk(KERN_CRIT "%s all done\n", __func__); - } + register_xenstore_notifier(&xenstore_notifier); return 0; } |