]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/kern_conf.c
MFV: zlib 1.3
[FreeBSD/FreeBSD.git] / sys / kern / kern_conf.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 1999-2002 Poul-Henning Kamp
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28
29 #include <sys/cdefs.h>
30 #include <sys/param.h>
31 #include <sys/kernel.h>
32 #include <sys/systm.h>
33 #include <sys/bio.h>
34 #include <sys/devctl.h>
35 #include <sys/lock.h>
36 #include <sys/mutex.h>
37 #include <sys/module.h>
38 #include <sys/malloc.h>
39 #include <sys/conf.h>
40 #include <sys/vnode.h>
41 #include <sys/queue.h>
42 #include <sys/poll.h>
43 #include <sys/sx.h>
44 #include <sys/ctype.h>
45 #include <sys/ucred.h>
46 #include <sys/taskqueue.h>
47 #include <machine/stdarg.h>
48
49 #include <fs/devfs/devfs_int.h>
50 #include <vm/vm.h>
51
52 static MALLOC_DEFINE(M_DEVT, "cdev", "cdev storage");
53
54 struct mtx devmtx;
55 static void destroy_devl(struct cdev *dev);
56 static int destroy_dev_sched_cbl(struct cdev *dev,
57     void (*cb)(void *), void *arg);
58 static void destroy_dev_tq(void *ctx, int pending);
59 static void destroy_dev_tq_giant(void *ctx, int pending);
60 static int make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw,
61     int unit, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
62     va_list ap);
63
64 static struct cdev_priv_list cdevp_free_list =
65     TAILQ_HEAD_INITIALIZER(cdevp_free_list);
66 static SLIST_HEAD(free_cdevsw, cdevsw) cdevsw_gt_post_list =
67     SLIST_HEAD_INITIALIZER(cdevsw_gt_post_list);
68
69 void
70 dev_lock(void)
71 {
72
73         mtx_lock(&devmtx);
74 }
75
76 /*
77  * Free all the memory collected while the cdev mutex was
78  * locked. Since devmtx is after the system map mutex, free() cannot
79  * be called immediately and is postponed until cdev mutex can be
80  * dropped.
81  */
82 static void
83 dev_unlock_and_free(void)
84 {
85         struct cdev_priv_list cdp_free;
86         struct free_cdevsw csw_free;
87         struct cdev_priv *cdp;
88         struct cdevsw *csw;
89
90         dev_lock_assert_locked();
91
92         /*
93          * Make the local copy of the list heads while the dev_mtx is
94          * held. Free it later.
95          */
96         TAILQ_INIT(&cdp_free);
97         TAILQ_CONCAT(&cdp_free, &cdevp_free_list, cdp_list);
98         csw_free = cdevsw_gt_post_list;
99         SLIST_INIT(&cdevsw_gt_post_list);
100
101         mtx_unlock(&devmtx);
102
103         while ((cdp = TAILQ_FIRST(&cdp_free)) != NULL) {
104                 TAILQ_REMOVE(&cdp_free, cdp, cdp_list);
105                 devfs_free(&cdp->cdp_c);
106         }
107         while ((csw = SLIST_FIRST(&csw_free)) != NULL) {
108                 SLIST_REMOVE_HEAD(&csw_free, d_postfree_list);
109                 free(csw, M_DEVT);
110         }
111 }
112
113 static void
114 dev_free_devlocked(struct cdev *cdev)
115 {
116         struct cdev_priv *cdp;
117
118         dev_lock_assert_locked();
119         cdp = cdev2priv(cdev);
120         KASSERT((cdp->cdp_flags & CDP_UNREF_DTR) == 0,
121             ("destroy_dev() was not called after delist_dev(%p)", cdev));
122         TAILQ_INSERT_HEAD(&cdevp_free_list, cdp, cdp_list);
123 }
124
125 static void
126 cdevsw_free_devlocked(struct cdevsw *csw)
127 {
128
129         dev_lock_assert_locked();
130         SLIST_INSERT_HEAD(&cdevsw_gt_post_list, csw, d_postfree_list);
131 }
132
133 void
134 dev_unlock(void)
135 {
136
137         mtx_unlock(&devmtx);
138 }
139
140 void
141 dev_ref(struct cdev *dev)
142 {
143
144         dev_lock_assert_unlocked();
145         mtx_lock(&devmtx);
146         dev->si_refcount++;
147         mtx_unlock(&devmtx);
148 }
149
150 void
151 dev_refl(struct cdev *dev)
152 {
153
154         dev_lock_assert_locked();
155         dev->si_refcount++;
156 }
157
158 void
159 dev_rel(struct cdev *dev)
160 {
161         int flag = 0;
162
163         dev_lock_assert_unlocked();
164         dev_lock();
165         dev->si_refcount--;
166         KASSERT(dev->si_refcount >= 0,
167             ("dev_rel(%s) gave negative count", devtoname(dev)));
168         if (dev->si_devsw == NULL && dev->si_refcount == 0) {
169                 LIST_REMOVE(dev, si_list);
170                 flag = 1;
171         }
172         dev_unlock();
173         if (flag)
174                 devfs_free(dev);
175 }
176
177 struct cdevsw *
178 dev_refthread(struct cdev *dev, int *ref)
179 {
180         struct cdevsw *csw;
181         struct cdev_priv *cdp;
182
183         dev_lock_assert_unlocked();
184         if ((dev->si_flags & SI_ETERNAL) != 0) {
185                 *ref = 0;
186                 return (dev->si_devsw);
187         }
188         cdp = cdev2priv(dev);
189         mtx_lock(&cdp->cdp_threadlock);
190         csw = dev->si_devsw;
191         if (csw != NULL) {
192                 if ((cdp->cdp_flags & CDP_SCHED_DTR) == 0)
193                         atomic_add_long(&dev->si_threadcount, 1);
194                 else
195                         csw = NULL;
196         }
197         mtx_unlock(&cdp->cdp_threadlock);
198         if (csw != NULL)
199                 *ref = 1;
200         return (csw);
201 }
202
203 struct cdevsw *
204 devvn_refthread(struct vnode *vp, struct cdev **devp, int *ref)
205 {
206         struct cdevsw *csw;
207         struct cdev_priv *cdp;
208         struct cdev *dev;
209
210         dev_lock_assert_unlocked();
211         if ((vp->v_vflag & VV_ETERNALDEV) != 0) {
212                 dev = vp->v_rdev;
213                 if (dev == NULL)
214                         return (NULL);
215                 KASSERT((dev->si_flags & SI_ETERNAL) != 0,
216                     ("Not eternal cdev"));
217                 *ref = 0;
218                 csw = dev->si_devsw;
219                 KASSERT(csw != NULL, ("Eternal cdev is destroyed"));
220                 *devp = dev;
221                 return (csw);
222         }
223
224         csw = NULL;
225         VI_LOCK(vp);
226         dev = vp->v_rdev;
227         if (dev == NULL) {
228                 VI_UNLOCK(vp);
229                 return (NULL);
230         }
231         cdp = cdev2priv(dev);
232         mtx_lock(&cdp->cdp_threadlock);
233         if ((cdp->cdp_flags & CDP_SCHED_DTR) == 0) {
234                 csw = dev->si_devsw;
235                 if (csw != NULL)
236                         atomic_add_long(&dev->si_threadcount, 1);
237         }
238         mtx_unlock(&cdp->cdp_threadlock);
239         VI_UNLOCK(vp);
240         if (csw != NULL) {
241                 *devp = dev;
242                 *ref = 1;
243         }
244         return (csw);
245 }
246
247 void    
248 dev_relthread(struct cdev *dev, int ref)
249 {
250
251         dev_lock_assert_unlocked();
252         if (!ref)
253                 return;
254         KASSERT(dev->si_threadcount > 0,
255             ("%s threadcount is wrong", dev->si_name));
256         atomic_subtract_rel_long(&dev->si_threadcount, 1);
257 }
258
259 int
260 nullop(void)
261 {
262
263         return (0);
264 }
265
266 int
267 eopnotsupp(void)
268 {
269
270         return (EOPNOTSUPP);
271 }
272
273 static int
274 enxio(void)
275 {
276         return (ENXIO);
277 }
278
279 static int
280 enodev(void)
281 {
282         return (ENODEV);
283 }
284
285 /* Define a dead_cdevsw for use when devices leave unexpectedly. */
286
287 #define dead_open       (d_open_t *)enxio
288 #define dead_close      (d_close_t *)enxio
289 #define dead_read       (d_read_t *)enxio
290 #define dead_write      (d_write_t *)enxio
291 #define dead_ioctl      (d_ioctl_t *)enxio
292 #define dead_poll       (d_poll_t *)enodev
293 #define dead_mmap       (d_mmap_t *)enodev
294
295 static void
296 dead_strategy(struct bio *bp)
297 {
298
299         biofinish(bp, NULL, ENXIO);
300 }
301
302 #define dead_kqfilter   (d_kqfilter_t *)enxio
303 #define dead_mmap_single (d_mmap_single_t *)enodev
304
305 static struct cdevsw dead_cdevsw = {
306         .d_version =    D_VERSION,
307         .d_open =       dead_open,
308         .d_close =      dead_close,
309         .d_read =       dead_read,
310         .d_write =      dead_write,
311         .d_ioctl =      dead_ioctl,
312         .d_poll =       dead_poll,
313         .d_mmap =       dead_mmap,
314         .d_strategy =   dead_strategy,
315         .d_name =       "dead",
316         .d_kqfilter =   dead_kqfilter,
317         .d_mmap_single = dead_mmap_single
318 };
319
320 /* Default methods if driver does not specify method */
321
322 #define null_open       (d_open_t *)nullop
323 #define null_close      (d_close_t *)nullop
324 #define no_read         (d_read_t *)enodev
325 #define no_write        (d_write_t *)enodev
326 #define no_ioctl        (d_ioctl_t *)enodev
327 #define no_mmap         (d_mmap_t *)enodev
328 #define no_kqfilter     (d_kqfilter_t *)enodev
329 #define no_mmap_single  (d_mmap_single_t *)enodev
330
331 static void
332 no_strategy(struct bio *bp)
333 {
334
335         biofinish(bp, NULL, ENODEV);
336 }
337
338 static int
339 no_poll(struct cdev *dev __unused, int events, struct thread *td __unused)
340 {
341
342         return (poll_no_poll(events));
343 }
344
345 static int
346 giant_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
347 {
348         struct cdevsw *dsw;
349         int ref, retval;
350
351         dsw = dev_refthread(dev, &ref);
352         if (dsw == NULL)
353                 return (ENXIO);
354         mtx_lock(&Giant);
355         retval = dsw->d_gianttrick->d_open(dev, oflags, devtype, td);
356         mtx_unlock(&Giant);
357         dev_relthread(dev, ref);
358         return (retval);
359 }
360
361 static int
362 giant_fdopen(struct cdev *dev, int oflags, struct thread *td, struct file *fp)
363 {
364         struct cdevsw *dsw;
365         int ref, retval;
366
367         dsw = dev_refthread(dev, &ref);
368         if (dsw == NULL)
369                 return (ENXIO);
370         mtx_lock(&Giant);
371         retval = dsw->d_gianttrick->d_fdopen(dev, oflags, td, fp);
372         mtx_unlock(&Giant);
373         dev_relthread(dev, ref);
374         return (retval);
375 }
376
377 static int
378 giant_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
379 {
380         struct cdevsw *dsw;
381         int ref, retval;
382
383         dsw = dev_refthread(dev, &ref);
384         if (dsw == NULL)
385                 return (ENXIO);
386         mtx_lock(&Giant);
387         retval = dsw->d_gianttrick->d_close(dev, fflag, devtype, td);
388         mtx_unlock(&Giant);
389         dev_relthread(dev, ref);
390         return (retval);
391 }
392
393 static void
394 giant_strategy(struct bio *bp)
395 {
396         struct cdevsw *dsw;
397         struct cdev *dev;
398         int ref;
399
400         dev = bp->bio_dev;
401         dsw = dev_refthread(dev, &ref);
402         if (dsw == NULL) {
403                 biofinish(bp, NULL, ENXIO);
404                 return;
405         }
406         mtx_lock(&Giant);
407         dsw->d_gianttrick->d_strategy(bp);
408         mtx_unlock(&Giant);
409         dev_relthread(dev, ref);
410 }
411
412 static int
413 giant_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
414 {
415         struct cdevsw *dsw;
416         int ref, retval;
417
418         dsw = dev_refthread(dev, &ref);
419         if (dsw == NULL)
420                 return (ENXIO);
421         mtx_lock(&Giant);
422         retval = dsw->d_gianttrick->d_ioctl(dev, cmd, data, fflag, td);
423         mtx_unlock(&Giant);
424         dev_relthread(dev, ref);
425         return (retval);
426 }
427   
428 static int
429 giant_read(struct cdev *dev, struct uio *uio, int ioflag)
430 {
431         struct cdevsw *dsw;
432         int ref, retval;
433
434         dsw = dev_refthread(dev, &ref);
435         if (dsw == NULL)
436                 return (ENXIO);
437         mtx_lock(&Giant);
438         retval = dsw->d_gianttrick->d_read(dev, uio, ioflag);
439         mtx_unlock(&Giant);
440         dev_relthread(dev, ref);
441         return (retval);
442 }
443
444 static int
445 giant_write(struct cdev *dev, struct uio *uio, int ioflag)
446 {
447         struct cdevsw *dsw;
448         int ref, retval;
449
450         dsw = dev_refthread(dev, &ref);
451         if (dsw == NULL)
452                 return (ENXIO);
453         mtx_lock(&Giant);
454         retval = dsw->d_gianttrick->d_write(dev, uio, ioflag);
455         mtx_unlock(&Giant);
456         dev_relthread(dev, ref);
457         return (retval);
458 }
459
460 static int
461 giant_poll(struct cdev *dev, int events, struct thread *td)
462 {
463         struct cdevsw *dsw;
464         int ref, retval;
465
466         dsw = dev_refthread(dev, &ref);
467         if (dsw == NULL)
468                 return (ENXIO);
469         mtx_lock(&Giant);
470         retval = dsw->d_gianttrick->d_poll(dev, events, td);
471         mtx_unlock(&Giant);
472         dev_relthread(dev, ref);
473         return (retval);
474 }
475
476 static int
477 giant_kqfilter(struct cdev *dev, struct knote *kn)
478 {
479         struct cdevsw *dsw;
480         int ref, retval;
481
482         dsw = dev_refthread(dev, &ref);
483         if (dsw == NULL)
484                 return (ENXIO);
485         mtx_lock(&Giant);
486         retval = dsw->d_gianttrick->d_kqfilter(dev, kn);
487         mtx_unlock(&Giant);
488         dev_relthread(dev, ref);
489         return (retval);
490 }
491
492 static int
493 giant_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot,
494     vm_memattr_t *memattr)
495 {
496         struct cdevsw *dsw;
497         int ref, retval;
498
499         dsw = dev_refthread(dev, &ref);
500         if (dsw == NULL)
501                 return (ENXIO);
502         mtx_lock(&Giant);
503         retval = dsw->d_gianttrick->d_mmap(dev, offset, paddr, nprot,
504             memattr);
505         mtx_unlock(&Giant);
506         dev_relthread(dev, ref);
507         return (retval);
508 }
509
510 static int
511 giant_mmap_single(struct cdev *dev, vm_ooffset_t *offset, vm_size_t size,
512     vm_object_t *object, int nprot)
513 {
514         struct cdevsw *dsw;
515         int ref, retval;
516
517         dsw = dev_refthread(dev, &ref);
518         if (dsw == NULL)
519                 return (ENXIO);
520         mtx_lock(&Giant);
521         retval = dsw->d_gianttrick->d_mmap_single(dev, offset, size, object,
522             nprot);
523         mtx_unlock(&Giant);
524         dev_relthread(dev, ref);
525         return (retval);
526 }
527
528 static void
529 notify(struct cdev *dev, const char *ev, int flags)
530 {
531         static const char prefix[] = "cdev=";
532         char *data;
533         int namelen, mflags;
534
535         if (cold)
536                 return;
537         mflags = (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK;
538         namelen = strlen(dev->si_name);
539         data = malloc(namelen + sizeof(prefix), M_TEMP, mflags);
540         if (data == NULL)
541                 return;
542         memcpy(data, prefix, sizeof(prefix) - 1);
543         memcpy(data + sizeof(prefix) - 1, dev->si_name, namelen + 1);
544         devctl_notify("DEVFS", "CDEV", ev, data);
545         free(data, M_TEMP);
546 }
547
548 static void
549 notify_create(struct cdev *dev, int flags)
550 {
551
552         notify(dev, "CREATE", flags);
553 }
554
555 static void
556 notify_destroy(struct cdev *dev)
557 {
558
559         notify(dev, "DESTROY", MAKEDEV_WAITOK);
560 }
561
562 static struct cdev *
563 newdev(struct make_dev_args *args, struct cdev *si)
564 {
565         struct cdev *si2;
566         struct cdevsw *csw;
567
568         dev_lock_assert_locked();
569         csw = args->mda_devsw;
570         si2 = NULL;
571         if (csw->d_flags & D_NEEDMINOR) {
572                 /* We may want to return an existing device */
573                 LIST_FOREACH(si2, &csw->d_devs, si_list) {
574                         if (dev2unit(si2) == args->mda_unit) {
575                                 dev_free_devlocked(si);
576                                 si = si2;
577                                 break;
578                         }
579                 }
580
581                 /*
582                  * If we're returning an existing device, we should make sure
583                  * it isn't already initialized.  This would have been caught
584                  * in consumers anyways, but it's good to catch such a case
585                  * early.  We still need to complete initialization of the
586                  * device, and we'll use whatever make_dev_args were passed in
587                  * to do so.
588                  */
589                 KASSERT(si2 == NULL || (si2->si_flags & SI_NAMED) == 0,
590                     ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)",
591                     args->mda_devsw->d_name, dev2unit(si2), devtoname(si2)));
592         }
593         si->si_drv0 = args->mda_unit;
594         si->si_drv1 = args->mda_si_drv1;
595         si->si_drv2 = args->mda_si_drv2;
596         /* Only push to csw->d_devs if it's not a cloned device. */
597         if (si2 == NULL) {
598                 si->si_devsw = csw;
599                 LIST_INSERT_HEAD(&csw->d_devs, si, si_list);
600         } else {
601                 KASSERT(si->si_devsw == csw,
602                     ("%s: inconsistent devsw between clone_create() and make_dev()",
603                     __func__));
604         }
605         return (si);
606 }
607
608 static void
609 fini_cdevsw(struct cdevsw *devsw)
610 {
611         struct cdevsw *gt;
612
613         if (devsw->d_gianttrick != NULL) {
614                 gt = devsw->d_gianttrick;
615                 memcpy(devsw, gt, sizeof *devsw);
616                 cdevsw_free_devlocked(gt);
617                 devsw->d_gianttrick = NULL;
618         }
619         devsw->d_flags &= ~D_INIT;
620 }
621
622 static int
623 prep_cdevsw(struct cdevsw *devsw, int flags)
624 {
625         struct cdevsw *dsw2;
626
627         dev_lock_assert_locked();
628         if (devsw->d_flags & D_INIT)
629                 return (0);
630         if (devsw->d_flags & D_NEEDGIANT) {
631                 dev_unlock();
632                 dsw2 = malloc(sizeof *dsw2, M_DEVT,
633                      (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK);
634                 dev_lock();
635                 if (dsw2 == NULL && !(devsw->d_flags & D_INIT))
636                         return (ENOMEM);
637         } else
638                 dsw2 = NULL;
639         if (devsw->d_flags & D_INIT) {
640                 if (dsw2 != NULL)
641                         cdevsw_free_devlocked(dsw2);
642                 return (0);
643         }
644
645         if (devsw->d_version != D_VERSION_04) {
646                 printf(
647                     "WARNING: Device driver \"%s\" has wrong version %s\n",
648                     devsw->d_name == NULL ? "???" : devsw->d_name,
649                     "and is disabled.  Recompile KLD module.");
650                 devsw->d_open = dead_open;
651                 devsw->d_close = dead_close;
652                 devsw->d_read = dead_read;
653                 devsw->d_write = dead_write;
654                 devsw->d_ioctl = dead_ioctl;
655                 devsw->d_poll = dead_poll;
656                 devsw->d_mmap = dead_mmap;
657                 devsw->d_mmap_single = dead_mmap_single;
658                 devsw->d_strategy = dead_strategy;
659                 devsw->d_kqfilter = dead_kqfilter;
660         }
661
662         if ((devsw->d_flags & D_NEEDGIANT) != 0) {
663                 if ((devsw->d_flags & D_GIANTOK) == 0) {
664                         printf(
665                             "WARNING: Device \"%s\" is Giant locked and may be "
666                             "deleted before FreeBSD 14.0.\n",
667                             devsw->d_name == NULL ? "???" : devsw->d_name);
668                 }
669                 if (devsw->d_gianttrick == NULL) {
670                         memcpy(dsw2, devsw, sizeof *dsw2);
671                         devsw->d_gianttrick = dsw2;
672                         dsw2 = NULL;
673                 }
674         }
675
676 #define FIXUP(member, noop, giant)                              \
677         do {                                                    \
678                 if (devsw->member == NULL) {                    \
679                         devsw->member = noop;                   \
680                 } else if (devsw->d_flags & D_NEEDGIANT)        \
681                         devsw->member = giant;                  \
682                 }                                               \
683         while (0)
684
685         FIXUP(d_open,           null_open,      giant_open);
686         FIXUP(d_fdopen,         NULL,           giant_fdopen);
687         FIXUP(d_close,          null_close,     giant_close);
688         FIXUP(d_read,           no_read,        giant_read);
689         FIXUP(d_write,          no_write,       giant_write);
690         FIXUP(d_ioctl,          no_ioctl,       giant_ioctl);
691         FIXUP(d_poll,           no_poll,        giant_poll);
692         FIXUP(d_mmap,           no_mmap,        giant_mmap);
693         FIXUP(d_strategy,       no_strategy,    giant_strategy);
694         FIXUP(d_kqfilter,       no_kqfilter,    giant_kqfilter);
695         FIXUP(d_mmap_single,    no_mmap_single, giant_mmap_single);
696
697         LIST_INIT(&devsw->d_devs);
698
699         devsw->d_flags |= D_INIT;
700
701         if (dsw2 != NULL)
702                 cdevsw_free_devlocked(dsw2);
703         return (0);
704 }
705
706 static int
707 prep_devname(struct cdev *dev, const char *fmt, va_list ap)
708 {
709         int len;
710         char *from, *q, *s, *to;
711
712         dev_lock_assert_locked();
713
714         len = vsnrprintf(dev->si_name, sizeof(dev->si_name), 32, fmt, ap);
715         if (len > sizeof(dev->si_name) - 1)
716                 return (ENAMETOOLONG);
717
718         /* Strip leading slashes. */
719         for (from = dev->si_name; *from == '/'; from++)
720                 ;
721
722         for (to = dev->si_name; *from != '\0'; from++, to++) {
723                 /*
724                  * Spaces and double quotation marks cause
725                  * problems for the devctl(4) protocol.
726                  * Reject names containing those characters.
727                  */
728                 if (isspace(*from) || *from == '"')
729                         return (EINVAL);
730                 /* Treat multiple sequential slashes as single. */
731                 while (from[0] == '/' && from[1] == '/')
732                         from++;
733                 /* Trailing slash is considered invalid. */
734                 if (from[0] == '/' && from[1] == '\0')
735                         return (EINVAL);
736                 *to = *from;
737         }
738         *to = '\0';
739
740         if (dev->si_name[0] == '\0')
741                 return (EINVAL);
742
743         /* Disallow "." and ".." components. */
744         for (s = dev->si_name;;) {
745                 for (q = s; *q != '/' && *q != '\0'; q++)
746                         ;
747                 if (q - s == 1 && s[0] == '.')
748                         return (EINVAL);
749                 if (q - s == 2 && s[0] == '.' && s[1] == '.')
750                         return (EINVAL);
751                 if (*q != '/')
752                         break;
753                 s = q + 1;
754         }
755
756         if (devfs_dev_exists(dev->si_name) != 0)
757                 return (EEXIST);
758
759         return (0);
760 }
761
762 void
763 make_dev_args_init_impl(struct make_dev_args *args, size_t sz)
764 {
765
766         bzero(args, sz);
767         args->mda_size = sz;
768 }
769
770 static int
771 make_dev_sv(struct make_dev_args *args1, struct cdev **dres,
772     const char *fmt, va_list ap)
773 {
774         struct cdev *dev, *dev_new;
775         struct make_dev_args args;
776         int res;
777
778         bzero(&args, sizeof(args));
779         if (sizeof(args) < args1->mda_size)
780                 return (EINVAL);
781         bcopy(args1, &args, args1->mda_size);
782         KASSERT((args.mda_flags & MAKEDEV_WAITOK) == 0 ||
783             (args.mda_flags & MAKEDEV_NOWAIT) == 0,
784             ("make_dev_sv: both WAITOK and NOWAIT specified"));
785         dev_new = devfs_alloc(args.mda_flags);
786         if (dev_new == NULL)
787                 return (ENOMEM);
788         dev_lock();
789         res = prep_cdevsw(args.mda_devsw, args.mda_flags);
790         if (res != 0) {
791                 dev_unlock();
792                 devfs_free(dev_new);
793                 return (res);
794         }
795         dev = newdev(&args, dev_new);
796         if ((dev->si_flags & SI_NAMED) == 0) {
797                 res = prep_devname(dev, fmt, ap);
798                 if (res != 0) {
799                         if ((args.mda_flags & MAKEDEV_CHECKNAME) == 0) {
800                                 panic(
801                         "make_dev_sv: bad si_name (error=%d, si_name=%s)",
802                                     res, dev->si_name);
803                         }
804                         if (dev == dev_new) {
805                                 LIST_REMOVE(dev, si_list);
806                                 dev_unlock();
807                                 devfs_free(dev);
808                         } else
809                                 dev_unlock();
810                         return (res);
811                 }
812         }
813         if ((args.mda_flags & MAKEDEV_REF) != 0)
814                 dev_refl(dev);
815         if ((args.mda_flags & MAKEDEV_ETERNAL) != 0)
816                 dev->si_flags |= SI_ETERNAL;
817         KASSERT(!(dev->si_flags & SI_NAMED),
818             ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)",
819             args.mda_devsw->d_name, dev2unit(dev), devtoname(dev)));
820         dev->si_flags |= SI_NAMED;
821         if (args.mda_cr != NULL)
822                 dev->si_cred = crhold(args.mda_cr);
823         dev->si_uid = args.mda_uid;
824         dev->si_gid = args.mda_gid;
825         dev->si_mode = args.mda_mode;
826
827         devfs_create(dev);
828         clean_unrhdrl(devfs_inos);
829         dev_unlock_and_free();
830
831         notify_create(dev, args.mda_flags);
832
833         *dres = dev;
834         return (0);
835 }
836
837 int
838 make_dev_s(struct make_dev_args *args, struct cdev **dres,
839     const char *fmt, ...)
840 {
841         va_list ap;
842         int res;
843
844         va_start(ap, fmt);
845         res = make_dev_sv(args, dres, fmt, ap);
846         va_end(ap);
847         return (res);
848 }
849
850 static int
851 make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit,
852     struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
853     va_list ap)
854 {
855         struct make_dev_args args;
856
857         make_dev_args_init(&args);
858         args.mda_flags = flags;
859         args.mda_devsw = devsw;
860         args.mda_cr = cr;
861         args.mda_uid = uid;
862         args.mda_gid = gid;
863         args.mda_mode = mode;
864         args.mda_unit = unit;
865         return (make_dev_sv(&args, dres, fmt, ap));
866 }
867
868 struct cdev *
869 make_dev(struct cdevsw *devsw, int unit, uid_t uid, gid_t gid, int mode,
870     const char *fmt, ...)
871 {
872         struct cdev *dev;
873         va_list ap;
874         int res __unused;
875
876         va_start(ap, fmt);
877         res = make_dev_credv(0, &dev, devsw, unit, NULL, uid, gid, mode, fmt,
878                       ap);
879         va_end(ap);
880         KASSERT(res == 0 && dev != NULL,
881             ("make_dev: failed make_dev_credv (error=%d)", res));
882         return (dev);
883 }
884
885 struct cdev *
886 make_dev_cred(struct cdevsw *devsw, int unit, struct ucred *cr, uid_t uid,
887     gid_t gid, int mode, const char *fmt, ...)
888 {
889         struct cdev *dev;
890         va_list ap;
891         int res __unused;
892
893         va_start(ap, fmt);
894         res = make_dev_credv(0, &dev, devsw, unit, cr, uid, gid, mode, fmt, ap);
895         va_end(ap);
896
897         KASSERT(res == 0 && dev != NULL,
898             ("make_dev_cred: failed make_dev_credv (error=%d)", res));
899         return (dev);
900 }
901
902 struct cdev *
903 make_dev_credf(int flags, struct cdevsw *devsw, int unit, struct ucred *cr,
904     uid_t uid, gid_t gid, int mode, const char *fmt, ...)
905 {
906         struct cdev *dev;
907         va_list ap;
908         int res;
909
910         va_start(ap, fmt);
911         res = make_dev_credv(flags, &dev, devsw, unit, cr, uid, gid, mode,
912             fmt, ap);
913         va_end(ap);
914
915         KASSERT(((flags & MAKEDEV_NOWAIT) != 0 && res == ENOMEM) ||
916             ((flags & MAKEDEV_CHECKNAME) != 0 && res != ENOMEM) || res == 0,
917             ("make_dev_credf: failed make_dev_credv (error=%d)", res));
918         return (res == 0 ? dev : NULL);
919 }
920
921 int
922 make_dev_p(int flags, struct cdev **cdev, struct cdevsw *devsw,
923     struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, ...)
924 {
925         va_list ap;
926         int res;
927
928         va_start(ap, fmt);
929         res = make_dev_credv(flags, cdev, devsw, 0, cr, uid, gid, mode,
930             fmt, ap);
931         va_end(ap);
932
933         KASSERT(((flags & MAKEDEV_NOWAIT) != 0 && res == ENOMEM) ||
934             ((flags & MAKEDEV_CHECKNAME) != 0 && res != ENOMEM) || res == 0,
935             ("make_dev_p: failed make_dev_credv (error=%d)", res));
936         return (res);
937 }
938
939 static void
940 dev_dependsl(struct cdev *pdev, struct cdev *cdev)
941 {
942
943         cdev->si_parent = pdev;
944         cdev->si_flags |= SI_CHILD;
945         LIST_INSERT_HEAD(&pdev->si_children, cdev, si_siblings);
946 }
947
948 void
949 dev_depends(struct cdev *pdev, struct cdev *cdev)
950 {
951
952         dev_lock();
953         dev_dependsl(pdev, cdev);
954         dev_unlock();
955 }
956
957 static int
958 make_dev_alias_v(int flags, struct cdev **cdev, struct cdev *pdev,
959     const char *fmt, va_list ap)
960 {
961         struct cdev *dev;
962         int error;
963
964         KASSERT(pdev != NULL, ("make_dev_alias_v: pdev is NULL"));
965         KASSERT((flags & MAKEDEV_WAITOK) == 0 || (flags & MAKEDEV_NOWAIT) == 0,
966             ("make_dev_alias_v: both WAITOK and NOWAIT specified"));
967         KASSERT((flags & ~(MAKEDEV_WAITOK | MAKEDEV_NOWAIT |
968             MAKEDEV_CHECKNAME)) == 0,
969             ("make_dev_alias_v: invalid flags specified (flags=%02x)", flags));
970
971         dev = devfs_alloc(flags);
972         if (dev == NULL)
973                 return (ENOMEM);
974         dev_lock();
975         dev->si_flags |= SI_ALIAS;
976         error = prep_devname(dev, fmt, ap);
977         if (error != 0) {
978                 if ((flags & MAKEDEV_CHECKNAME) == 0) {
979                         panic("make_dev_alias_v: bad si_name "
980                             "(error=%d, si_name=%s)", error, dev->si_name);
981                 }
982                 dev_unlock();
983                 devfs_free(dev);
984                 return (error);
985         }
986         dev->si_flags |= SI_NAMED;
987         devfs_create(dev);
988         dev_dependsl(pdev, dev);
989         clean_unrhdrl(devfs_inos);
990         dev_unlock();
991
992         notify_create(dev, flags);
993         *cdev = dev;
994
995         return (0);
996 }
997
998 struct cdev *
999 make_dev_alias(struct cdev *pdev, const char *fmt, ...)
1000 {
1001         struct cdev *dev;
1002         va_list ap;
1003         int res __unused;
1004
1005         va_start(ap, fmt);
1006         res = make_dev_alias_v(MAKEDEV_WAITOK, &dev, pdev, fmt, ap);
1007         va_end(ap);
1008
1009         KASSERT(res == 0 && dev != NULL,
1010             ("make_dev_alias: failed make_dev_alias_v (error=%d)", res));
1011         return (dev);
1012 }
1013
1014 int
1015 make_dev_alias_p(int flags, struct cdev **cdev, struct cdev *pdev,
1016     const char *fmt, ...)
1017 {
1018         va_list ap;
1019         int res;
1020
1021         va_start(ap, fmt);
1022         res = make_dev_alias_v(flags, cdev, pdev, fmt, ap);
1023         va_end(ap);
1024         return (res);
1025 }
1026
1027 int
1028 make_dev_physpath_alias(int flags, struct cdev **cdev, struct cdev *pdev, 
1029     struct cdev *old_alias, const char *physpath)
1030 {
1031         char *devfspath;
1032         int physpath_len;
1033         int max_parentpath_len;
1034         int parentpath_len;
1035         int devfspathbuf_len;
1036         int mflags;
1037         int ret;
1038
1039         *cdev = NULL;
1040         devfspath = NULL;
1041         physpath_len = strlen(physpath);
1042         ret = EINVAL;
1043         if (physpath_len == 0)
1044                 goto out;
1045
1046         if (strncmp("id1,", physpath, 4) == 0) {
1047                 physpath += 4;
1048                 physpath_len -= 4;
1049                 if (physpath_len == 0)
1050                         goto out;
1051         }
1052
1053         max_parentpath_len = SPECNAMELEN - physpath_len - /*/*/1;
1054         parentpath_len = strlen(pdev->si_name);
1055         if (max_parentpath_len < parentpath_len) {
1056                 if (bootverbose)
1057                         printf("WARNING: Unable to alias %s "
1058                             "to %s/%s - path too long\n",
1059                             pdev->si_name, physpath, pdev->si_name);
1060                 ret = ENAMETOOLONG;
1061                 goto out;
1062         }
1063
1064         mflags = (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK;
1065         devfspathbuf_len = physpath_len + /*/*/1 + parentpath_len + /*NUL*/1;
1066         devfspath = malloc(devfspathbuf_len, M_DEVBUF, mflags);
1067         if (devfspath == NULL) {
1068                 ret = ENOMEM;
1069                 goto out;
1070         }
1071
1072         sprintf(devfspath, "%s/%s", physpath, pdev->si_name);
1073         if (old_alias != NULL && strcmp(old_alias->si_name, devfspath) == 0) {
1074                 /* Retain the existing alias. */
1075                 *cdev = old_alias;
1076                 old_alias = NULL;
1077                 ret = 0;
1078         } else {
1079                 ret = make_dev_alias_p(flags, cdev, pdev, "%s", devfspath);
1080         }
1081 out:
1082         if (old_alias != NULL)  
1083                 destroy_dev(old_alias);
1084         if (devfspath != NULL)
1085                 free(devfspath, M_DEVBUF);
1086         return (ret);
1087 }
1088
1089 static void
1090 destroy_devl(struct cdev *dev)
1091 {
1092         struct cdevsw *csw;
1093         struct cdev_privdata *p;
1094         struct cdev_priv *cdp;
1095
1096         dev_lock_assert_locked();
1097         KASSERT(dev->si_flags & SI_NAMED,
1098             ("WARNING: Driver mistake: destroy_dev on %d\n", dev2unit(dev)));
1099         KASSERT((dev->si_flags & SI_ETERNAL) == 0,
1100             ("WARNING: Driver mistake: destroy_dev on eternal %d\n",
1101              dev2unit(dev)));
1102
1103         cdp = cdev2priv(dev);
1104         if ((cdp->cdp_flags & CDP_UNREF_DTR) == 0) {
1105                 /*
1106                  * Avoid race with dev_rel(), e.g. from the populate
1107                  * loop.  If CDP_UNREF_DTR flag is set, the reference
1108                  * to be dropped at the end of destroy_devl() was
1109                  * already taken by delist_dev_locked().
1110                  */
1111                 dev_refl(dev);
1112
1113                 devfs_destroy(dev);
1114         }
1115
1116         /* Remove name marking */
1117         dev->si_flags &= ~SI_NAMED;
1118
1119         /* If we are a child, remove us from the parents list */
1120         if (dev->si_flags & SI_CHILD) {
1121                 LIST_REMOVE(dev, si_siblings);
1122                 dev->si_flags &= ~SI_CHILD;
1123         }
1124
1125         /* Kill our children */
1126         while (!LIST_EMPTY(&dev->si_children))
1127                 destroy_devl(LIST_FIRST(&dev->si_children));
1128
1129         /* Remove from clone list */
1130         if (dev->si_flags & SI_CLONELIST) {
1131                 LIST_REMOVE(dev, si_clone);
1132                 dev->si_flags &= ~SI_CLONELIST;
1133         }
1134
1135         mtx_lock(&cdp->cdp_threadlock);
1136         csw = dev->si_devsw;
1137         dev->si_devsw = NULL;   /* already NULL for SI_ALIAS */
1138         while (csw != NULL && csw->d_purge != NULL && dev->si_threadcount) {
1139                 csw->d_purge(dev);
1140                 mtx_unlock(&cdp->cdp_threadlock);
1141                 msleep(csw, &devmtx, PRIBIO, "devprg", hz/10);
1142                 mtx_lock(&cdp->cdp_threadlock);
1143                 if (dev->si_threadcount)
1144                         printf("Still %lu threads in %s\n",
1145                             dev->si_threadcount, devtoname(dev));
1146         }
1147         while (dev->si_threadcount != 0) {
1148                 /* Use unique dummy wait ident */
1149                 mtx_unlock(&cdp->cdp_threadlock);
1150                 msleep(&csw, &devmtx, PRIBIO, "devdrn", hz / 10);
1151                 mtx_lock(&cdp->cdp_threadlock);
1152         }
1153
1154         mtx_unlock(&cdp->cdp_threadlock);
1155         dev_unlock();
1156         if ((cdp->cdp_flags & CDP_UNREF_DTR) == 0) {
1157                 /* avoid out of order notify events */
1158                 notify_destroy(dev);
1159         }
1160         mtx_lock(&cdevpriv_mtx);
1161         while ((p = LIST_FIRST(&cdp->cdp_fdpriv)) != NULL) {
1162                 devfs_destroy_cdevpriv(p);
1163                 mtx_lock(&cdevpriv_mtx);
1164         }
1165         mtx_unlock(&cdevpriv_mtx);
1166         dev_lock();
1167
1168         dev->si_drv1 = 0;
1169         dev->si_drv2 = 0;
1170
1171         if (!(dev->si_flags & SI_ALIAS)) {
1172                 /* Remove from cdevsw list */
1173                 LIST_REMOVE(dev, si_list);
1174
1175                 /* If cdevsw has no more struct cdev *'s, clean it */
1176                 if (LIST_EMPTY(&csw->d_devs)) {
1177                         fini_cdevsw(csw);
1178                         wakeup(&csw->d_devs);
1179                 }
1180         }
1181         dev->si_flags &= ~SI_ALIAS;
1182         cdp->cdp_flags &= ~CDP_UNREF_DTR;
1183         dev->si_refcount--;
1184
1185         if (dev->si_refcount > 0)
1186                 LIST_INSERT_HEAD(&dead_cdevsw.d_devs, dev, si_list);
1187         else
1188                 dev_free_devlocked(dev);
1189 }
1190
1191 static void
1192 delist_dev_locked(struct cdev *dev)
1193 {
1194         struct cdev_priv *cdp;
1195         struct cdev *child;
1196
1197         dev_lock_assert_locked();
1198         cdp = cdev2priv(dev);
1199         if ((cdp->cdp_flags & CDP_UNREF_DTR) != 0)
1200                 return;
1201         cdp->cdp_flags |= CDP_UNREF_DTR;
1202         dev_refl(dev);
1203         devfs_destroy(dev);
1204         LIST_FOREACH(child, &dev->si_children, si_siblings)
1205                 delist_dev_locked(child);
1206         dev_unlock();   
1207         /* ensure the destroy event is queued in order */
1208         notify_destroy(dev);
1209         dev_lock();
1210 }
1211
1212 /*
1213  * This function will delist a character device and its children from
1214  * the directory listing and create a destroy event without waiting
1215  * for all character device references to go away. At some later point
1216  * destroy_dev() must be called to complete the character device
1217  * destruction. After calling this function the character device name
1218  * can instantly be re-used.
1219  */
1220 void
1221 delist_dev(struct cdev *dev)
1222 {
1223
1224         WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "delist_dev");
1225         dev_lock();
1226         delist_dev_locked(dev);
1227         dev_unlock();
1228 }
1229
1230 void
1231 destroy_dev(struct cdev *dev)
1232 {
1233
1234         WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "destroy_dev");
1235         dev_lock();
1236         destroy_devl(dev);
1237         dev_unlock_and_free();
1238 }
1239
1240 const char *
1241 devtoname(struct cdev *dev)
1242 {
1243
1244         return (dev->si_name);
1245 }
1246
1247 int
1248 dev_stdclone(char *name, char **namep, const char *stem, int *unit)
1249 {
1250         int u, i;
1251
1252         i = strlen(stem);
1253         if (strncmp(stem, name, i) != 0)
1254                 return (0);
1255         if (!isdigit(name[i]))
1256                 return (0);
1257         u = 0;
1258         if (name[i] == '0' && isdigit(name[i+1]))
1259                 return (0);
1260         while (isdigit(name[i])) {
1261                 u *= 10;
1262                 u += name[i++] - '0';
1263         }
1264         if (u > 0xffffff)
1265                 return (0);
1266         *unit = u;
1267         if (namep)
1268                 *namep = &name[i];
1269         if (name[i]) 
1270                 return (2);
1271         return (1);
1272 }
1273
1274 /*
1275  * Helper functions for cloning device drivers.
1276  *
1277  * The objective here is to make it unnecessary for the device drivers to
1278  * use rman or similar to manage their unit number space.  Due to the way
1279  * we do "on-demand" devices, using rman or other "private" methods 
1280  * will be very tricky to lock down properly once we lock down this file.
1281  *
1282  * Instead we give the drivers these routines which puts the struct cdev *'s
1283  * that are to be managed on their own list, and gives the driver the ability
1284  * to ask for the first free unit number or a given specified unit number.
1285  *
1286  * In addition these routines support paired devices (pty, nmdm and similar)
1287  * by respecting a number of "flag" bits in the minor number.
1288  *
1289  */
1290
1291 struct clonedevs {
1292         LIST_HEAD(,cdev)        head;
1293 };
1294
1295 void
1296 clone_setup(struct clonedevs **cdp)
1297 {
1298
1299         *cdp = malloc(sizeof **cdp, M_DEVBUF, M_WAITOK | M_ZERO);
1300         LIST_INIT(&(*cdp)->head);
1301 }
1302
1303 int
1304 clone_create(struct clonedevs **cdp, struct cdevsw *csw, int *up,
1305     struct cdev **dp, int extra)
1306 {
1307         struct clonedevs *cd;
1308         struct cdev *dev, *ndev, *dl, *de;
1309         struct make_dev_args args;
1310         int unit, low, u;
1311
1312         KASSERT(*cdp != NULL,
1313             ("clone_setup() not called in driver \"%s\"", csw->d_name));
1314         KASSERT(!(extra & CLONE_UNITMASK),
1315             ("Illegal extra bits (0x%x) in clone_create", extra));
1316         KASSERT(*up <= CLONE_UNITMASK,
1317             ("Too high unit (0x%x) in clone_create", *up));
1318         KASSERT(csw->d_flags & D_NEEDMINOR,
1319             ("clone_create() on cdevsw without minor numbers"));
1320
1321         /*
1322          * Search the list for a lot of things in one go:
1323          *   A preexisting match is returned immediately.
1324          *   The lowest free unit number if we are passed -1, and the place
1325          *       in the list where we should insert that new element.
1326          *   The place to insert a specified unit number, if applicable
1327          *       the end of the list.
1328          */
1329         unit = *up;
1330         ndev = devfs_alloc(MAKEDEV_WAITOK);
1331         dev_lock();
1332         prep_cdevsw(csw, MAKEDEV_WAITOK);
1333         low = extra;
1334         de = dl = NULL;
1335         cd = *cdp;
1336         LIST_FOREACH(dev, &cd->head, si_clone) {
1337                 KASSERT(dev->si_flags & SI_CLONELIST,
1338                     ("Dev %p(%s) should be on clonelist", dev, dev->si_name));
1339                 u = dev2unit(dev);
1340                 if (u == (unit | extra)) {
1341                         *dp = dev;
1342                         dev_unlock();
1343                         devfs_free(ndev);
1344                         return (0);
1345                 }
1346                 if (unit == -1 && u == low) {
1347                         low++;
1348                         de = dev;
1349                         continue;
1350                 } else if (u < (unit | extra)) {
1351                         de = dev;
1352                         continue;
1353                 } else if (u > (unit | extra)) {
1354                         dl = dev;
1355                         break;
1356                 }
1357         }
1358         if (unit == -1)
1359                 unit = low & CLONE_UNITMASK;
1360         make_dev_args_init(&args);
1361         args.mda_unit = unit | extra;
1362         args.mda_devsw = csw;
1363         dev = newdev(&args, ndev);
1364         if (dev->si_flags & SI_CLONELIST) {
1365                 printf("dev %p (%s) is on clonelist\n", dev, dev->si_name);
1366                 printf("unit=%d, low=%d, extra=0x%x\n", unit, low, extra);
1367                 LIST_FOREACH(dev, &cd->head, si_clone) {
1368                         printf("\t%p %s\n", dev, dev->si_name);
1369                 }
1370                 panic("foo");
1371         }
1372         KASSERT(!(dev->si_flags & SI_CLONELIST),
1373             ("Dev %p(%s) should not be on clonelist", dev, dev->si_name));
1374         if (dl != NULL)
1375                 LIST_INSERT_BEFORE(dl, dev, si_clone);
1376         else if (de != NULL)
1377                 LIST_INSERT_AFTER(de, dev, si_clone);
1378         else
1379                 LIST_INSERT_HEAD(&cd->head, dev, si_clone);
1380         dev->si_flags |= SI_CLONELIST;
1381         *up = unit;
1382         dev_unlock_and_free();
1383         return (1);
1384 }
1385
1386 /*
1387  * Kill everything still on the list.  The driver should already have
1388  * disposed of any softc hung of the struct cdev *'s at this time.
1389  */
1390 void
1391 clone_cleanup(struct clonedevs **cdp)
1392 {
1393         struct cdev *dev;
1394         struct cdev_priv *cp;
1395         struct clonedevs *cd;
1396
1397         cd = *cdp;
1398         if (cd == NULL)
1399                 return;
1400         dev_lock();
1401         while (!LIST_EMPTY(&cd->head)) {
1402                 dev = LIST_FIRST(&cd->head);
1403                 LIST_REMOVE(dev, si_clone);
1404                 KASSERT(dev->si_flags & SI_CLONELIST,
1405                     ("Dev %p(%s) should be on clonelist", dev, dev->si_name));
1406                 dev->si_flags &= ~SI_CLONELIST;
1407                 cp = cdev2priv(dev);
1408                 if (!(cp->cdp_flags & CDP_SCHED_DTR)) {
1409                         cp->cdp_flags |= CDP_SCHED_DTR;
1410                         KASSERT(dev->si_flags & SI_NAMED,
1411                                 ("Driver has goofed in cloning underways udev %jx unit %x",
1412                                 (uintmax_t)dev2udev(dev), dev2unit(dev)));
1413                         destroy_devl(dev);
1414                 }
1415         }
1416         dev_unlock_and_free();
1417         free(cd, M_DEVBUF);
1418         *cdp = NULL;
1419 }
1420
1421 static TAILQ_HEAD(, cdev_priv) dev_ddtr =
1422         TAILQ_HEAD_INITIALIZER(dev_ddtr);
1423 static TAILQ_HEAD(, cdev_priv) dev_ddtr_giant =
1424         TAILQ_HEAD_INITIALIZER(dev_ddtr_giant);
1425 static struct task dev_dtr_task = TASK_INITIALIZER(0, destroy_dev_tq, &dev_ddtr);
1426 static struct task dev_dtr_task_giant = TASK_INITIALIZER(0, destroy_dev_tq_giant,
1427     &dev_ddtr_giant);
1428
1429 static void
1430 destroy_dev_tq(void *ctx, int pending)
1431 {
1432         TAILQ_HEAD(, cdev_priv) *ddtr = ctx;
1433         struct cdev_priv *cp;
1434         struct cdev *dev;
1435         void (*cb)(void *);
1436         void *cb_arg;
1437
1438         dev_lock();
1439         while (!TAILQ_EMPTY(ddtr)) {
1440                 cp = TAILQ_FIRST(ddtr);
1441                 dev = &cp->cdp_c;
1442                 KASSERT(cp->cdp_flags & CDP_SCHED_DTR,
1443                     ("cdev %p in dev_destroy_tq without CDP_SCHED_DTR", cp));
1444                 TAILQ_REMOVE(ddtr, cp, cdp_dtr_list);
1445                 cb = cp->cdp_dtr_cb;
1446                 cb_arg = cp->cdp_dtr_cb_arg;
1447                 destroy_devl(dev);
1448                 dev_unlock_and_free();
1449                 dev_rel(dev);
1450                 if (cb != NULL)
1451                         cb(cb_arg);
1452                 dev_lock();
1453         }
1454         dev_unlock();
1455 }
1456
1457 static void
1458 destroy_dev_tq_giant(void *ctx, int pending)
1459 {
1460         mtx_lock(&Giant);
1461         destroy_dev_tq(ctx, pending);
1462         mtx_unlock(&Giant);
1463 }
1464
1465 /*
1466  * devmtx shall be locked on entry. devmtx will be unlocked after
1467  * function return.
1468  */
1469 static int
1470 destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg)
1471 {
1472         struct cdev_priv *cp;
1473         bool need_giant;
1474
1475         dev_lock_assert_locked();
1476         cp = cdev2priv(dev);
1477         if (cp->cdp_flags & CDP_SCHED_DTR) {
1478                 dev_unlock();
1479                 return (0);
1480         }
1481         dev_refl(dev);
1482         cp->cdp_flags |= CDP_SCHED_DTR;
1483         cp->cdp_dtr_cb = cb;
1484         cp->cdp_dtr_cb_arg = arg;
1485         need_giant = (dev->si_devsw->d_flags & D_NEEDGIANT) != 0;
1486         if (need_giant)
1487                 TAILQ_INSERT_TAIL(&dev_ddtr_giant, cp, cdp_dtr_list);
1488         else
1489                 TAILQ_INSERT_TAIL(&dev_ddtr, cp, cdp_dtr_list);
1490         dev_unlock();
1491         if (need_giant)
1492                 taskqueue_enqueue(taskqueue_thread, &dev_dtr_task_giant);
1493         else
1494                 taskqueue_enqueue(taskqueue_thread, &dev_dtr_task);
1495         return (1);
1496 }
1497
1498 int
1499 destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg)
1500 {
1501
1502         dev_lock();
1503         return (destroy_dev_sched_cbl(dev, cb, arg));
1504 }
1505
1506 int
1507 destroy_dev_sched(struct cdev *dev)
1508 {
1509
1510         return (destroy_dev_sched_cb(dev, NULL, NULL));
1511 }
1512
1513 void
1514 destroy_dev_drain(struct cdevsw *csw)
1515 {
1516
1517         dev_lock();
1518         while (!LIST_EMPTY(&csw->d_devs)) {
1519                 msleep(&csw->d_devs, &devmtx, PRIBIO, "devscd", hz/10);
1520         }
1521         dev_unlock();
1522 }
1523
1524 #include "opt_ddb.h"
1525 #ifdef DDB
1526 #include <sys/kernel.h>
1527
1528 #include <ddb/ddb.h>
1529
1530 DB_SHOW_COMMAND(cdev, db_show_cdev)
1531 {
1532         struct cdev_priv *cdp;
1533         struct cdev *dev;
1534         u_int flags;
1535         char buf[512];
1536
1537         if (!have_addr) {
1538                 TAILQ_FOREACH(cdp, &cdevp_list, cdp_list) {
1539                         dev = &cdp->cdp_c;
1540                         db_printf("%s %p\n", dev->si_name, dev);
1541                         if (db_pager_quit)
1542                                 break;
1543                 }
1544                 return;
1545         }
1546
1547         dev = (struct cdev *)addr;
1548         cdp = cdev2priv(dev);
1549         db_printf("dev %s ref %d use %ld thr %ld inuse %u fdpriv %p\n",
1550             dev->si_name, dev->si_refcount, dev->si_usecount,
1551             dev->si_threadcount, cdp->cdp_inuse, cdp->cdp_fdpriv.lh_first);
1552         db_printf("devsw %p si_drv0 %d si_drv1 %p si_drv2 %p\n",
1553             dev->si_devsw, dev->si_drv0, dev->si_drv1, dev->si_drv2);
1554         flags = dev->si_flags;
1555 #define SI_FLAG(flag)   do {                                            \
1556         if (flags & (flag)) {                                           \
1557                 if (buf[0] != '\0')                                     \
1558                         strlcat(buf, ", ", sizeof(buf));                \
1559                 strlcat(buf, (#flag) + 3, sizeof(buf));                 \
1560                 flags &= ~(flag);                                       \
1561         }                                                               \
1562 } while (0)
1563         buf[0] = '\0';
1564         SI_FLAG(SI_ETERNAL);
1565         SI_FLAG(SI_ALIAS);
1566         SI_FLAG(SI_NAMED);
1567         SI_FLAG(SI_CHILD);
1568         SI_FLAG(SI_DUMPDEV);
1569         SI_FLAG(SI_CLONELIST);
1570         db_printf("si_flags %s\n", buf);
1571
1572         flags = cdp->cdp_flags;
1573 #define CDP_FLAG(flag)  do {                                            \
1574         if (flags & (flag)) {                                           \
1575                 if (buf[0] != '\0')                                     \
1576                         strlcat(buf, ", ", sizeof(buf));                \
1577                 strlcat(buf, (#flag) + 4, sizeof(buf));                 \
1578                 flags &= ~(flag);                                       \
1579         }                                                               \
1580 } while (0)
1581         buf[0] = '\0';
1582         CDP_FLAG(CDP_ACTIVE);
1583         CDP_FLAG(CDP_SCHED_DTR);
1584         db_printf("cdp_flags %s\n", buf);
1585 }
1586 #endif