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>
This commit is contained in:
Poul-Henning Kamp 2000-09-11 17:15:33 +00:00
parent e2397c3ab0
commit 5ef2707e6e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=65747

View File

@ -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);
}