diff options
author | kib <kib@FreeBSD.org> | 2008-05-14 14:29:54 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2008-05-14 14:29:54 +0000 |
commit | 592c22cb14a73766a10bccfee0c46af19d44fbd3 (patch) | |
tree | 374fb5fd70e1f7e4b4deaa5453ef5fdada1f2fdc /sys/kern | |
parent | f9190ee1b5c77d53c83ff44d9993314cfcd61b94 (diff) | |
download | FreeBSD-src-592c22cb14a73766a10bccfee0c46af19d44fbd3.zip FreeBSD-src-592c22cb14a73766a10bccfee0c46af19d44fbd3.tar.gz |
Add the devctl notifications for the cdev create/destroy events.
Based on the submission by: Andriy Gapon <avg icyb net ua>
MFC after: 2 weeks
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_conf.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 1db25f8..f8e7a10 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> #include <sys/systm.h> +#include <sys/bus.h> #include <sys/bio.h> #include <sys/lock.h> #include <sys/mutex.h> @@ -526,6 +527,37 @@ unit2minor(int unit) return ((unit & 0xff) | ((unit << 8) & ~0xffff)); } +static void +notify(struct cdev *dev, const char *ev) +{ + static const char prefix[] = "cdev="; + char *data; + int namelen; + + if (cold) + return; + namelen = strlen(dev->si_name); + data = malloc(namelen + sizeof(prefix), M_TEMP, M_WAITOK); + memcpy(data, prefix, sizeof(prefix) - 1); + memcpy(data + sizeof(prefix) - 1, dev->si_name, namelen + 1); + devctl_notify("DEVFS", "CDEV", ev, data); + free(data, M_TEMP); +} + +static void +notify_create(struct cdev *dev) +{ + + notify(dev, "CREATE"); +} + +static void +notify_destroy(struct cdev *dev) +{ + + notify(dev, "DESTROY"); +} + static struct cdev * newdev(struct cdevsw *csw, int y, struct cdev *si) { @@ -706,6 +738,9 @@ make_dev_credv(int flags, struct cdevsw *devsw, int minornr, devfs_create(dev); clean_unrhdrl(devfs_inos); dev_unlock_and_free(); + + notify_create(dev); + return (dev); } @@ -794,6 +829,9 @@ make_dev_alias(struct cdev *pdev, const char *fmt, ...) clean_unrhdrl(devfs_inos); dev_unlock(); dev_depends(pdev, dev); + + notify_create(dev); + return (dev); } @@ -842,6 +880,10 @@ destroy_devl(struct cdev *dev) msleep(&csw, &devmtx, PRIBIO, "devdrn", hz / 10); } + mtx_unlock(&devmtx); + notify_destroy(dev); + mtx_lock(&devmtx); + dev->si_drv1 = 0; dev->si_drv2 = 0; bzero(&dev->__si_u, sizeof(dev->__si_u)); |