xen: Module autoprobing support for frontend drivers
authorMark McLoughlin <markmc@redhat.com>
Wed, 2 Apr 2008 17:54:05 +0000 (10:54 -0700)
committerIngo Molnar <mingo@elte.hu>
Thu, 24 Apr 2008 21:57:33 +0000 (23:57 +0200)
Add module aliases to support autoprobing modules
for xen frontend devices.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
drivers/block/xen-blkfront.c
drivers/net/xen-netfront.c
drivers/xen/xenbus/xenbus_probe.c

index dfe61afe676a9d95dedb74d2d123c3db2622710c..ffa0b436129b130d19e720485fabe1d3dbd4ca91 100644 (file)
@@ -1015,3 +1015,4 @@ module_exit(xlblk_exit);
 MODULE_DESCRIPTION("Xen virtual block device frontend");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_BLOCKDEV_MAJOR(XENVBD_MAJOR);
+MODULE_ALIAS("xen:vbd");
index 7483d45bc5bccffefd18b4fa94122eb78d40460f..b3fa27e6c78aa6c02f0606eea69cf8101477b800 100644 (file)
@@ -1809,3 +1809,4 @@ module_exit(netif_exit);
 
 MODULE_DESCRIPTION("Xen virtual network device frontend");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("xen:vif");
index 88fc5ec665f5049a892298ccd56a159ea53a804d..57ceb5346b749338e153ccdbeaf4bf5ceb09c19f 100644 (file)
@@ -88,6 +88,16 @@ int xenbus_match(struct device *_dev, struct device_driver *_drv)
        return match_device(drv->ids, to_xenbus_device(_dev)) != NULL;
 }
 
+static int xenbus_uevent(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;
+}
+
 /* device/<type>/<id> => <type>-<id> */
 static int frontend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
 {
@@ -166,6 +176,7 @@ static struct xen_bus_type xenbus_frontend = {
        .bus = {
                .name     = "xen",
                .match    = xenbus_match,
+               .uevent   = xenbus_uevent,
                .probe    = xenbus_dev_probe,
                .remove   = xenbus_dev_remove,
                .shutdown = xenbus_dev_shutdown,
@@ -438,6 +449,12 @@ static ssize_t xendev_show_devtype(struct device *dev,
 }
 DEVICE_ATTR(devtype, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_devtype, NULL);
 
+static ssize_t xendev_show_modalias(struct device *dev,
+                                   struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "xen:%s\n", to_xenbus_device(dev)->devicetype);
+}
+DEVICE_ATTR(modalias, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_modalias, NULL);
 
 int xenbus_probe_node(struct xen_bus_type *bus,
                      const char *type,
@@ -492,10 +509,16 @@ int xenbus_probe_node(struct xen_bus_type *bus,
 
        err = device_create_file(&xendev->dev, &dev_attr_devtype);
        if (err)
-               goto fail_remove_file;
+               goto fail_remove_nodename;
+
+       err = device_create_file(&xendev->dev, &dev_attr_modalias);
+       if (err)
+               goto fail_remove_devtype;
 
        return 0;
-fail_remove_file:
+fail_remove_devtype:
+       device_remove_file(&xendev->dev, &dev_attr_devtype);
+fail_remove_nodename:
        device_remove_file(&xendev->dev, &dev_attr_nodename);
 fail_unregister:
        device_unregister(&xendev->dev);