summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-05-14 14:29:54 +0000
committerkib <kib@FreeBSD.org>2008-05-14 14:29:54 +0000
commit592c22cb14a73766a10bccfee0c46af19d44fbd3 (patch)
tree374fb5fd70e1f7e4b4deaa5453ef5fdada1f2fdc /sys/kern/kern_conf.c
parentf9190ee1b5c77d53c83ff44d9993314cfcd61b94 (diff)
downloadFreeBSD-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/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c42
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));
OpenPOWER on IntegriCloud