diff options
author | phk <phk@FreeBSD.org> | 2000-09-11 17:15:33 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2000-09-11 17:15:33 +0000 |
commit | e16fe1f5255e5d7c61d2bf9fa09301d0f2cccf31 (patch) | |
tree | f33f2162c3abaeb166c8034fcfefe08cc4800175 /sys/kern | |
parent | ae910d41707d16b4e9dfdd62fea7b8ef80a0b4c8 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/kern_conf.c | 16 |
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); } |