kernel/devfs: Pass more arguments to the callback for devfs_scan_callback.
authorSascha Wildner <saw@online.de>
Sun, 26 Aug 2012 10:31:13 +0000 (12:31 +0200)
committerSascha Wildner <saw@online.de>
Sun, 26 Aug 2012 10:31:13 +0000 (12:31 +0200)
is_alias signals whether it is an alias or a real device. If true, name
is the alias name. If false, it is the device name.

Reviewed-by: alexh
share/man/man9/make_dev.9
sys/kern/kern_udev.c
sys/kern/vfs_conf.c
sys/sys/devfs.h
sys/vfs/devfs/devfs_core.c

index 2c6ddf1..adb5124 100644 (file)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man9/make_dev.9,v 1.2.2.3 2001/12/17 11:30:18 ru Exp $
 .\"
-.Dd August 24, 2012
+.Dd August 26, 2012
 .Dt MAKE_DEV 9
 .Os
 .Sh NAME
@@ -312,10 +312,21 @@ function has the following form:
 devfs_scan_t mydev_scan_callback;
 
 void
-mydev_scan_callback(cdev_t dev, void *arg)
+mydev_scan_callback(char *name, cdev_t dev, bool is_alias, void *arg)
 {
 };
 .Ed
+.Pp
+The
+.Fa name
+argument is the alias' name (if
+.Fa is_alias
+is
+.Dv true )
+or he
+.Vt cdev Ap s
+.Fa si_name
+field.
 .Sh HISTORY
 The
 .Fn make_dev
index 5f4a1bd..d9602a1 100644 (file)
@@ -69,7 +69,7 @@ static void udev_event_insert(int, prop_dictionary_t);
 static struct udev_event_kernel *udev_event_remove(void);
 static void udev_event_free(struct udev_event_kernel *);
 static char *udev_event_externalize(struct udev_event_kernel *);
-static void udev_getdevs_scan_callback(cdev_t, void *);
+static void udev_getdevs_scan_callback(char *, cdev_t, bool, void *);
 static int udev_getdevs_ioctl(struct plistref *, u_long, prop_dictionary_t);
 static void udev_dev_filter_detach(struct knote *);
 static int udev_dev_filter_read(struct knote *, long);
@@ -726,7 +726,7 @@ udev_dev_ioctl(struct dev_ioctl_args *ap)
 }
 
 static void
-udev_getdevs_scan_callback(cdev_t cdev, void *arg)
+udev_getdevs_scan_callback(char *name, cdev_t cdev, bool is_alias, void *arg)
 {
        struct udev_prop_ctx *ctx = arg;
 
@@ -755,7 +755,6 @@ udev_getdevs_ioctl(struct plistref *pref, u_long cmd, prop_dictionary_t dict)
                return EINVAL;
        }
 
-       /* XXX: need devfs_scan_alias_callback() */
        devfs_scan_callback(udev_getdevs_scan_callback, &ctx);
 
        if (ctx.error != 0) {
index d0d33de..2795314 100644 (file)
@@ -490,10 +490,11 @@ end:
 
 
 static void
-vfs_mountroot_ask_callback(cdev_t dev, void *arg __unused)
+vfs_mountroot_ask_callback(char *name, cdev_t dev, bool is_alias,
+    void *arg __unused)
 {
-       if (dev_is_good(dev) && (dev_dflags(dev) & D_DISK))
-               kprintf(" \"%s\" ", dev->si_name);
+       if (!is_alias && dev_is_good(dev) && (dev_dflags(dev) & D_DISK))
+               kprintf(" \"%s\" ", name);
 }
 
 
index 59f009f..e0ce373 100644 (file)
@@ -244,7 +244,7 @@ TAILQ_HEAD(devfs_chandler_head, devfs_clone_handler);
 TAILQ_HEAD(devfs_alias_head, devfs_alias);
 TAILQ_HEAD(devfs_dev_ops_head, devfs_dev_ops);
 
-typedef void (devfs_scan_t)(cdev_t, void *);
+typedef void (devfs_scan_t)(char *, cdev_t, bool, void *);
 typedef void* (devfs_iterate_callback_t)(struct devfs_node *, void *);
 
 #define DEVFS_NODE(x)          ((struct devfs_node *)((x)->v_data))
index 679fbed..eb14bb3 100644 (file)
@@ -1753,9 +1753,13 @@ static int
 devfs_scan_callback_worker(devfs_scan_t *callback, void *arg)
 {
        cdev_t dev, dev1;
+       struct devfs_alias *alias, *alias1;
 
        TAILQ_FOREACH_MUTABLE(dev, &devfs_dev_list, link, dev1) {
-               callback(dev, arg);
+               callback(dev->si_name, dev, false, arg);
+       }
+       TAILQ_FOREACH_MUTABLE(alias, &devfs_alias_list, link, alias1) {
+               callback(alias->name, alias->dev_target, true, arg);
        }
 
        return 0;