From b28e21ef717a67dfed9ef1e41987961ee006e875 Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sun, 26 Aug 2012 12:31:13 +0200 Subject: [PATCH] kernel/devfs: Pass more arguments to the callback for devfs_scan_callback. 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 | 15 +++++++++++++-- sys/kern/kern_udev.c | 5 ++--- sys/kern/vfs_conf.c | 7 ++++--- sys/sys/devfs.h | 2 +- sys/vfs/devfs/devfs_core.c | 6 +++++- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/share/man/man9/make_dev.9 b/share/man/man9/make_dev.9 index 2c6ddf1607..adb512482f 100644 --- a/share/man/man9/make_dev.9 +++ b/share/man/man9/make_dev.9 @@ -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 diff --git a/sys/kern/kern_udev.c b/sys/kern/kern_udev.c index 5f4a1bd194..d9602a17bb 100644 --- a/sys/kern/kern_udev.c +++ b/sys/kern/kern_udev.c @@ -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) { diff --git a/sys/kern/vfs_conf.c b/sys/kern/vfs_conf.c index d0d33de41f..2795314cd5 100644 --- a/sys/kern/vfs_conf.c +++ b/sys/kern/vfs_conf.c @@ -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); } diff --git a/sys/sys/devfs.h b/sys/sys/devfs.h index 59f009f18f..e0ce373bcf 100644 --- a/sys/sys/devfs.h +++ b/sys/sys/devfs.h @@ -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)) diff --git a/sys/vfs/devfs/devfs_core.c b/sys/vfs/devfs/devfs_core.c index 679fbeda82..eb14bb3b15 100644 --- a/sys/vfs/devfs/devfs_core.c +++ b/sys/vfs/devfs/devfs_core.c @@ -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; -- 2.41.0