summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-09-11 17:15:33 +0000
committerphk <phk@FreeBSD.org>2000-09-11 17:15:33 +0000
commite16fe1f5255e5d7c61d2bf9fa09301d0f2cccf31 (patch)
treef33f2162c3abaeb166c8034fcfefe08cc4800175 /sys/kern/kern_conf.c
parentae910d41707d16b4e9dfdd62fea7b8ef80a0b4c8 (diff)
downloadFreeBSD-src-e16fe1f5255e5d7c61d2bf9fa09301d0f2cccf31.zip
FreeBSD-src-e16fe1f5255e5d7c61d2bf9fa09301d0f2cccf31.tar.gz
revent multiple make_dev() calls on the same dev_t and similar bogosities.
A couple of new warnings may be emitted during boot if drivers DTWT. Tested by: George Cox <gjvc@gjvc.com>
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 404f6f4..6121ed7 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -315,6 +315,11 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, char
int i;
dev = makedev(devsw->d_maj, minor);
+ if (dev->si_flags & SI_NAMED) {
+ printf( "WARNING: Driver mistake: repeat make_dev(\"%s\")\n",
+ dev->si_name);
+ return (dev);
+ }
va_start(ap, fmt);
i = kvprintf(fmt, NULL, dev->si_name, 32, ap);
dev->si_name[i] = '\0';
@@ -323,6 +328,7 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, char
dev->si_uid = uid;
dev->si_gid = gid;
dev->si_mode = perms;
+ dev->si_flags |= SI_NAMED;
if (devfs_create_hook)
devfs_create_hook(dev);
@@ -338,6 +344,7 @@ make_dev_alias(dev_t pdev, char *fmt, ...)
dev = allocdev();
dev->si_flags |= SI_ALIAS;
+ dev->si_flags |= SI_NAMED;
dev->si_drv1 = pdev;
LIST_INSERT_HEAD(&pdev->si_names, dev, si_hash);
@@ -354,11 +361,20 @@ make_dev_alias(dev_t pdev, char *fmt, ...)
void
destroy_dev(dev_t dev)
{
+
+ if (!(dev->si_flags & SI_NAMED)) {
+ printf( "WARNING: Driver mistake: destroy_dev on %d/%d\n",
+ major(dev), minor(dev));
+ return;
+ }
+
if (devfs_destroy_hook)
devfs_destroy_hook(dev);
dev->si_drv1 = 0;
dev->si_drv2 = 0;
dev->si_devsw = 0;
+ dev->si_flags &= ~SI_NAMED;
+ dev->si_flags &= ~SI_ALIAS;
freedev(dev);
}
OpenPOWER on IntegriCloud