diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 8fc1b093009..3883aa32256 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -576,20 +576,33 @@ newdev(struct make_dev_args *args, struct cdev *si) mtx_assert(&devmtx, MA_OWNED); csw = args->mda_devsw; + si2 = NULL; if (csw->d_flags & D_NEEDMINOR) { /* We may want to return an existing device */ LIST_FOREACH(si2, &csw->d_devs, si_list) { if (dev2unit(si2) == args->mda_unit) { dev_free_devlocked(si); - return (si2); + si = si2; + break; } } + + /* + * I had a goto here, but then realized that we shouldn't + * be returning stuff marked NAME anyways. Anything on this + * list will likely be uninitialized. + */ + KASSERT(si2 == NULL || (si2->si_flags & SI_NAMED) == 0, + ("%s: attempt to return fully initialized device %s", + __func__, si2->si_name)); } si->si_drv0 = args->mda_unit; si->si_devsw = csw; si->si_drv1 = args->mda_si_drv1; si->si_drv2 = args->mda_si_drv2; - LIST_INSERT_HEAD(&csw->d_devs, si, si_list); + /* Only pushes to csw->d_devs if it's not a cloned device. */ + if (si2 == NULL) + LIST_INSERT_HEAD(&csw->d_devs, si, si_list); return (si); }