Deleted Added
full compact
kern_conf.c (174280) kern_conf.c (177301)
1/*-
2 * Copyright (c) 1999-2002 Poul-Henning Kamp
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1999-2002 Poul-Henning Kamp
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/kern/kern_conf.c 174280 2007-12-05 01:22:03Z thompsa $");
28__FBSDID("$FreeBSD: head/sys/kern/kern_conf.c 177301 2008-03-17 13:17:10Z kib $");
29
30#include <sys/param.h>
31#include <sys/kernel.h>
32#include <sys/systm.h>
33#include <sys/bio.h>
34#include <sys/lock.h>
35#include <sys/mutex.h>
36#include <sys/module.h>

--- 19 unchanged lines hidden (view full) ---

56 void (*cb)(void *), void *arg);
57static struct cdev *make_dev_credv(int flags,
58 struct cdevsw *devsw, int minornr,
59 struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
60 va_list ap);
61
62static struct cdev_priv_list cdevp_free_list =
63 TAILQ_HEAD_INITIALIZER(cdevp_free_list);
29
30#include <sys/param.h>
31#include <sys/kernel.h>
32#include <sys/systm.h>
33#include <sys/bio.h>
34#include <sys/lock.h>
35#include <sys/mutex.h>
36#include <sys/module.h>

--- 19 unchanged lines hidden (view full) ---

56 void (*cb)(void *), void *arg);
57static struct cdev *make_dev_credv(int flags,
58 struct cdevsw *devsw, int minornr,
59 struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
60 va_list ap);
61
62static struct cdev_priv_list cdevp_free_list =
63 TAILQ_HEAD_INITIALIZER(cdevp_free_list);
64static SLIST_HEAD(free_cdevsw, cdevsw) cdevsw_gt_post_list =
65 SLIST_HEAD_INITIALIZER();
64
65void
66dev_lock(void)
67{
68
69 mtx_lock(&devmtx);
70}
71
66
67void
68dev_lock(void)
69{
70
71 mtx_lock(&devmtx);
72}
73
74/*
75 * Free all the memory collected while the cdev mutex was
76 * locked. Since devmtx is after the system map mutex, free() cannot
77 * be called immediately and is postponed until cdev mutex can be
78 * dropped.
79 */
72static void
73dev_unlock_and_free(void)
74{
80static void
81dev_unlock_and_free(void)
82{
83 struct cdev_priv_list cdp_free;
84 struct free_cdevsw csw_free;
75 struct cdev_priv *cdp;
85 struct cdev_priv *cdp;
86 struct cdevsw *csw;
76
77 mtx_assert(&devmtx, MA_OWNED);
87
88 mtx_assert(&devmtx, MA_OWNED);
78 while ((cdp = TAILQ_FIRST(&cdevp_free_list)) != NULL) {
79 TAILQ_REMOVE(&cdevp_free_list, cdp, cdp_list);
80 mtx_unlock(&devmtx);
89
90 /*
91 * Make the local copy of the list heads while the dev_mtx is
92 * held. Free it later.
93 */
94 TAILQ_INIT(&cdp_free);
95 TAILQ_CONCAT(&cdp_free, &cdevp_free_list, cdp_list);
96 csw_free = cdevsw_gt_post_list;
97 SLIST_INIT(&cdevsw_gt_post_list);
98
99 mtx_unlock(&devmtx);
100
101 while ((cdp = TAILQ_FIRST(&cdp_free)) != NULL) {
102 TAILQ_REMOVE(&cdp_free, cdp, cdp_list);
81 devfs_free(&cdp->cdp_c);
103 devfs_free(&cdp->cdp_c);
82 mtx_lock(&devmtx);
83 }
104 }
84 mtx_unlock(&devmtx);
105 while ((csw = SLIST_FIRST(&csw_free)) != NULL) {
106 SLIST_REMOVE_HEAD(&csw_free, d_postfree_list);
107 free(csw, M_DEVT);
108 }
85}
86
87static void
88dev_free_devlocked(struct cdev *cdev)
89{
90 struct cdev_priv *cdp;
91
92 mtx_assert(&devmtx, MA_OWNED);
93 cdp = cdev->si_priv;
94 TAILQ_INSERT_HEAD(&cdevp_free_list, cdp, cdp_list);
95}
96
109}
110
111static void
112dev_free_devlocked(struct cdev *cdev)
113{
114 struct cdev_priv *cdp;
115
116 mtx_assert(&devmtx, MA_OWNED);
117 cdp = cdev->si_priv;
118 TAILQ_INSERT_HEAD(&cdevp_free_list, cdp, cdp_list);
119}
120
121static void
122cdevsw_free_devlocked(struct cdevsw *csw)
123{
124
125 mtx_assert(&devmtx, MA_OWNED);
126 SLIST_INSERT_HEAD(&cdevsw_gt_post_list, csw, d_postfree_list);
127}
128
97void
98dev_unlock(void)
99{
100
101 mtx_unlock(&devmtx);
102}
103
104void

--- 187 unchanged lines hidden (view full) ---

292 return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
293}
294
295#define no_dump (dumper_t *)enodev
296
297static int
298giant_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
299{
129void
130dev_unlock(void)
131{
132
133 mtx_unlock(&devmtx);
134}
135
136void

--- 187 unchanged lines hidden (view full) ---

324 return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
325}
326
327#define no_dump (dumper_t *)enodev
328
329static int
330giant_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
331{
332 struct cdevsw *dsw;
300 int retval;
301
333 int retval;
334
335 dsw = dev_refthread(dev);
336 if (dsw == NULL)
337 return (ENXIO);
302 mtx_lock(&Giant);
338 mtx_lock(&Giant);
303 retval = dev->si_devsw->d_gianttrick->
304 d_open(dev, oflags, devtype, td);
339 retval = dsw->d_gianttrick->d_open(dev, oflags, devtype, td);
305 mtx_unlock(&Giant);
340 mtx_unlock(&Giant);
341 dev_relthread(dev);
306 return (retval);
307}
308
309static int
310giant_fdopen(struct cdev *dev, int oflags, struct thread *td, struct file *fp)
311{
342 return (retval);
343}
344
345static int
346giant_fdopen(struct cdev *dev, int oflags, struct thread *td, struct file *fp)
347{
348 struct cdevsw *dsw;
312 int retval;
313
349 int retval;
350
351 dsw = dev_refthread(dev);
352 if (dsw == NULL)
353 return (ENXIO);
314 mtx_lock(&Giant);
354 mtx_lock(&Giant);
315 retval = dev->si_devsw->d_gianttrick->
316 d_fdopen(dev, oflags, td, fp);
355 retval = dsw->d_gianttrick->d_fdopen(dev, oflags, td, fp);
317 mtx_unlock(&Giant);
356 mtx_unlock(&Giant);
357 dev_relthread(dev);
318 return (retval);
319}
320
321static int
322giant_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
323{
358 return (retval);
359}
360
361static int
362giant_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
363{
364 struct cdevsw *dsw;
324 int retval;
325
365 int retval;
366
367 dsw = dev_refthread(dev);
368 if (dsw == NULL)
369 return (ENXIO);
326 mtx_lock(&Giant);
370 mtx_lock(&Giant);
327 retval = dev->si_devsw->d_gianttrick->
328 d_close(dev, fflag, devtype, td);
371 retval = dsw->d_gianttrick->d_close(dev, fflag, devtype, td);
329 mtx_unlock(&Giant);
372 mtx_unlock(&Giant);
373 dev_relthread(dev);
330 return (retval);
331}
332
333static void
334giant_strategy(struct bio *bp)
335{
374 return (retval);
375}
376
377static void
378giant_strategy(struct bio *bp)
379{
380 struct cdevsw *dsw;
381 struct cdev *dev;
336
382
383 dev = bp->bio_dev;
384 dsw = dev_refthread(dev);
385 if (dsw == NULL) {
386 biofinish(bp, NULL, ENXIO);
387 return;
388 }
337 mtx_lock(&Giant);
389 mtx_lock(&Giant);
338 bp->bio_dev->si_devsw->d_gianttrick->
339 d_strategy(bp);
390 dsw->d_gianttrick->d_strategy(bp);
340 mtx_unlock(&Giant);
391 mtx_unlock(&Giant);
392 dev_relthread(dev);
341}
342
343static int
344giant_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
345{
393}
394
395static int
396giant_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
397{
398 struct cdevsw *dsw;
346 int retval;
347
399 int retval;
400
401 dsw = dev_refthread(dev);
402 if (dsw == NULL)
403 return (ENXIO);
348 mtx_lock(&Giant);
349 retval = dev->si_devsw->d_gianttrick->
350 d_ioctl(dev, cmd, data, fflag, td);
351 mtx_unlock(&Giant);
404 mtx_lock(&Giant);
405 retval = dev->si_devsw->d_gianttrick->
406 d_ioctl(dev, cmd, data, fflag, td);
407 mtx_unlock(&Giant);
408 dev_relthread(dev);
352 return (retval);
353}
354
355static int
356giant_read(struct cdev *dev, struct uio *uio, int ioflag)
357{
409 return (retval);
410}
411
412static int
413giant_read(struct cdev *dev, struct uio *uio, int ioflag)
414{
415 struct cdevsw *dsw;
358 int retval;
359
416 int retval;
417
418 dsw = dev_refthread(dev);
419 if (dsw == NULL)
420 return (ENXIO);
360 mtx_lock(&Giant);
361 retval = dev->si_devsw->d_gianttrick->
362 d_read(dev, uio, ioflag);
363 mtx_unlock(&Giant);
421 mtx_lock(&Giant);
422 retval = dev->si_devsw->d_gianttrick->
423 d_read(dev, uio, ioflag);
424 mtx_unlock(&Giant);
425 dev_relthread(dev);
364 return (retval);
365}
366
367static int
368giant_write(struct cdev *dev, struct uio *uio, int ioflag)
369{
426 return (retval);
427}
428
429static int
430giant_write(struct cdev *dev, struct uio *uio, int ioflag)
431{
432 struct cdevsw *dsw;
370 int retval;
371
433 int retval;
434
435 dsw = dev_refthread(dev);
436 if (dsw == NULL)
437 return (ENXIO);
372 mtx_lock(&Giant);
438 mtx_lock(&Giant);
373 retval = dev->si_devsw->d_gianttrick->
374 d_write(dev, uio, ioflag);
439 retval = dsw->d_gianttrick->d_write(dev, uio, ioflag);
375 mtx_unlock(&Giant);
440 mtx_unlock(&Giant);
441 dev_relthread(dev);
376 return (retval);
377}
378
379static int
380giant_poll(struct cdev *dev, int events, struct thread *td)
381{
442 return (retval);
443}
444
445static int
446giant_poll(struct cdev *dev, int events, struct thread *td)
447{
448 struct cdevsw *dsw;
382 int retval;
383
449 int retval;
450
451 dsw = dev_refthread(dev);
452 if (dsw == NULL)
453 return (ENXIO);
384 mtx_lock(&Giant);
454 mtx_lock(&Giant);
385 retval = dev->si_devsw->d_gianttrick->
386 d_poll(dev, events, td);
455 retval = dsw->d_gianttrick->d_poll(dev, events, td);
387 mtx_unlock(&Giant);
456 mtx_unlock(&Giant);
457 dev_relthread(dev);
388 return (retval);
389}
390
391static int
392giant_kqfilter(struct cdev *dev, struct knote *kn)
393{
458 return (retval);
459}
460
461static int
462giant_kqfilter(struct cdev *dev, struct knote *kn)
463{
464 struct cdevsw *dsw;
394 int retval;
395
465 int retval;
466
467 dsw = dev_refthread(dev);
468 if (dsw == NULL)
469 return (ENXIO);
396 mtx_lock(&Giant);
470 mtx_lock(&Giant);
397 retval = dev->si_devsw->d_gianttrick->
398 d_kqfilter(dev, kn);
471 retval = dsw->d_gianttrick->d_kqfilter(dev, kn);
399 mtx_unlock(&Giant);
472 mtx_unlock(&Giant);
473 dev_relthread(dev);
400 return (retval);
401}
402
403static int
404giant_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot)
405{
474 return (retval);
475}
476
477static int
478giant_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot)
479{
480 struct cdevsw *dsw;
406 int retval;
407
481 int retval;
482
483 dsw = dev_refthread(dev);
484 if (dsw == NULL)
485 return (ENXIO);
408 mtx_lock(&Giant);
486 mtx_lock(&Giant);
409 retval = dev->si_devsw->d_gianttrick->
410 d_mmap(dev, offset, paddr, nprot);
487 retval = dsw->d_gianttrick->d_mmap(dev, offset, paddr, nprot);
411 mtx_unlock(&Giant);
488 mtx_unlock(&Giant);
489 dev_relthread(dev);
412 return (retval);
413}
414
415
416/*
417 * struct cdev * and u_dev_t primitives
418 */
419

--- 65 unchanged lines hidden (view full) ---

485static void
486fini_cdevsw(struct cdevsw *devsw)
487{
488 struct cdevsw *gt;
489
490 if (devsw->d_gianttrick != NULL) {
491 gt = devsw->d_gianttrick;
492 memcpy(devsw, gt, sizeof *devsw);
490 return (retval);
491}
492
493
494/*
495 * struct cdev * and u_dev_t primitives
496 */
497

--- 65 unchanged lines hidden (view full) ---

563static void
564fini_cdevsw(struct cdevsw *devsw)
565{
566 struct cdevsw *gt;
567
568 if (devsw->d_gianttrick != NULL) {
569 gt = devsw->d_gianttrick;
570 memcpy(devsw, gt, sizeof *devsw);
493 free(gt, M_DEVT);
571 cdevsw_free_devlocked(gt);
494 devsw->d_gianttrick = NULL;
495 }
496 devsw->d_flags &= ~D_INIT;
497}
498
499static void
500prep_cdevsw(struct cdevsw *devsw)
501{
502 struct cdevsw *dsw2;
503
572 devsw->d_gianttrick = NULL;
573 }
574 devsw->d_flags &= ~D_INIT;
575}
576
577static void
578prep_cdevsw(struct cdevsw *devsw)
579{
580 struct cdevsw *dsw2;
581
504 if (devsw->d_flags & D_NEEDGIANT)
582 mtx_assert(&devmtx, MA_OWNED);
583 if (devsw->d_flags & D_INIT)
584 return;
585 if (devsw->d_flags & D_NEEDGIANT) {
586 dev_unlock();
505 dsw2 = malloc(sizeof *dsw2, M_DEVT, M_WAITOK);
587 dsw2 = malloc(sizeof *dsw2, M_DEVT, M_WAITOK);
506 else
588 dev_lock();
589 } else
507 dsw2 = NULL;
590 dsw2 = NULL;
508 dev_lock();
591 if (devsw->d_flags & D_INIT) {
592 if (dsw2 != NULL)
593 cdevsw_free_devlocked(dsw2);
594 return;
595 }
509
510 if (devsw->d_version != D_VERSION_01) {
511 printf(
512 "WARNING: Device driver \"%s\" has wrong version %s\n",
513 devsw->d_name == NULL ? "???" : devsw->d_name,
514 "and is disabled. Recompile KLD module.");
515 devsw->d_open = dead_open;
516 devsw->d_close = dead_close;

--- 14 unchanged lines hidden (view full) ---

531 if (devsw->d_kqfilter == NULL) devsw->d_kqfilter = ttykqfilter;
532 if (devsw->d_poll == NULL) devsw->d_poll = ttypoll;
533 }
534
535 if (devsw->d_flags & D_NEEDGIANT) {
536 if (devsw->d_gianttrick == NULL) {
537 memcpy(dsw2, devsw, sizeof *dsw2);
538 devsw->d_gianttrick = dsw2;
596
597 if (devsw->d_version != D_VERSION_01) {
598 printf(
599 "WARNING: Device driver \"%s\" has wrong version %s\n",
600 devsw->d_name == NULL ? "???" : devsw->d_name,
601 "and is disabled. Recompile KLD module.");
602 devsw->d_open = dead_open;
603 devsw->d_close = dead_close;

--- 14 unchanged lines hidden (view full) ---

618 if (devsw->d_kqfilter == NULL) devsw->d_kqfilter = ttykqfilter;
619 if (devsw->d_poll == NULL) devsw->d_poll = ttypoll;
620 }
621
622 if (devsw->d_flags & D_NEEDGIANT) {
623 if (devsw->d_gianttrick == NULL) {
624 memcpy(dsw2, devsw, sizeof *dsw2);
625 devsw->d_gianttrick = dsw2;
539 } else
540 free(dsw2, M_DEVT);
626 dsw2 = NULL;
627 }
541 }
542
543#define FIXUP(member, noop, giant) \
544 do { \
545 if (devsw->member == NULL) { \
546 devsw->member = noop; \
547 } else if (devsw->d_flags & D_NEEDGIANT) \
548 devsw->member = giant; \

--- 12 unchanged lines hidden (view full) ---

561 FIXUP(d_kqfilter, no_kqfilter, giant_kqfilter);
562
563 if (devsw->d_dump == NULL) devsw->d_dump = no_dump;
564
565 LIST_INIT(&devsw->d_devs);
566
567 devsw->d_flags |= D_INIT;
568
628 }
629
630#define FIXUP(member, noop, giant) \
631 do { \
632 if (devsw->member == NULL) { \
633 devsw->member = noop; \
634 } else if (devsw->d_flags & D_NEEDGIANT) \
635 devsw->member = giant; \

--- 12 unchanged lines hidden (view full) ---

648 FIXUP(d_kqfilter, no_kqfilter, giant_kqfilter);
649
650 if (devsw->d_dump == NULL) devsw->d_dump = no_dump;
651
652 LIST_INIT(&devsw->d_devs);
653
654 devsw->d_flags |= D_INIT;
655
569 dev_unlock();
656 if (dsw2 != NULL)
657 cdevsw_free_devlocked(dsw2);
570}
571
572struct cdev *
573make_dev_credv(int flags, struct cdevsw *devsw, int minornr,
574 struct ucred *cr, uid_t uid,
575 gid_t gid, int mode, const char *fmt, va_list ap)
576{
577 struct cdev *dev;
578 int i;
579
580 KASSERT((minornr & ~MAXMINOR) == 0,
581 ("Invalid minor (0x%x) in make_dev", minornr));
582
658}
659
660struct cdev *
661make_dev_credv(int flags, struct cdevsw *devsw, int minornr,
662 struct ucred *cr, uid_t uid,
663 gid_t gid, int mode, const char *fmt, va_list ap)
664{
665 struct cdev *dev;
666 int i;
667
668 KASSERT((minornr & ~MAXMINOR) == 0,
669 ("Invalid minor (0x%x) in make_dev", minornr));
670
583 if (!(devsw->d_flags & D_INIT))
584 prep_cdevsw(devsw);
585 dev = devfs_alloc();
586 dev_lock();
671 dev = devfs_alloc();
672 dev_lock();
673 prep_cdevsw(devsw);
587 dev = newdev(devsw, minornr, dev);
588 if (flags & MAKEDEV_REF)
589 dev_refl(dev);
590 if (dev->si_flags & SI_CHEAPCLONE &&
591 dev->si_flags & SI_NAMED) {
592 /*
593 * This is allowed as it removes races and generally
594 * simplifies cloning devices.

--- 20 unchanged lines hidden (view full) ---

615#endif
616 dev->si_cred = NULL;
617 dev->si_uid = uid;
618 dev->si_gid = gid;
619 dev->si_mode = mode;
620
621 devfs_create(dev);
622 clean_unrhdrl(devfs_inos);
674 dev = newdev(devsw, minornr, dev);
675 if (flags & MAKEDEV_REF)
676 dev_refl(dev);
677 if (dev->si_flags & SI_CHEAPCLONE &&
678 dev->si_flags & SI_NAMED) {
679 /*
680 * This is allowed as it removes races and generally
681 * simplifies cloning devices.

--- 20 unchanged lines hidden (view full) ---

702#endif
703 dev->si_cred = NULL;
704 dev->si_uid = uid;
705 dev->si_gid = gid;
706 dev->si_mode = mode;
707
708 devfs_create(dev);
709 clean_unrhdrl(devfs_inos);
623 dev_unlock();
710 dev_unlock_and_free();
624 return (dev);
625}
626
627struct cdev *
628make_dev(struct cdevsw *devsw, int minornr, uid_t uid, gid_t gid, int mode,
629 const char *fmt, ...)
630{
631 struct cdev *dev;

--- 247 unchanged lines hidden (view full) ---

879
880 KASSERT(*cdp != NULL,
881 ("clone_setup() not called in driver \"%s\"", csw->d_name));
882 KASSERT(!(extra & CLONE_UNITMASK),
883 ("Illegal extra bits (0x%x) in clone_create", extra));
884 KASSERT(*up <= CLONE_UNITMASK,
885 ("Too high unit (0x%x) in clone_create", *up));
886
711 return (dev);
712}
713
714struct cdev *
715make_dev(struct cdevsw *devsw, int minornr, uid_t uid, gid_t gid, int mode,
716 const char *fmt, ...)
717{
718 struct cdev *dev;

--- 247 unchanged lines hidden (view full) ---

966
967 KASSERT(*cdp != NULL,
968 ("clone_setup() not called in driver \"%s\"", csw->d_name));
969 KASSERT(!(extra & CLONE_UNITMASK),
970 ("Illegal extra bits (0x%x) in clone_create", extra));
971 KASSERT(*up <= CLONE_UNITMASK,
972 ("Too high unit (0x%x) in clone_create", *up));
973
887 if (!(csw->d_flags & D_INIT))
888 prep_cdevsw(csw);
889
890 /*
891 * Search the list for a lot of things in one go:
892 * A preexisting match is returned immediately.
893 * The lowest free unit number if we are passed -1, and the place
894 * in the list where we should insert that new element.
895 * The place to insert a specified unit number, if applicable
896 * the end of the list.
897 */
898 unit = *up;
899 ndev = devfs_alloc();
900 dev_lock();
974
975 /*
976 * Search the list for a lot of things in one go:
977 * A preexisting match is returned immediately.
978 * The lowest free unit number if we are passed -1, and the place
979 * in the list where we should insert that new element.
980 * The place to insert a specified unit number, if applicable
981 * the end of the list.
982 */
983 unit = *up;
984 ndev = devfs_alloc();
985 dev_lock();
986 prep_cdevsw(csw);
901 low = extra;
902 de = dl = NULL;
903 cd = *cdp;
904 LIST_FOREACH(dev, &cd->head, si_clone) {
905 KASSERT(dev->si_flags & SI_CLONELIST,
906 ("Dev %p(%s) should be on clonelist", dev, dev->si_name));
907 u = dev2unit(dev);
908 if (u == (unit | extra)) {

--- 63 unchanged lines hidden (view full) ---

972 cp = dev->si_priv;
973 if (!(cp->cdp_flags & CDP_SCHED_DTR)) {
974 cp->cdp_flags |= CDP_SCHED_DTR;
975 KASSERT(dev->si_flags & SI_NAMED,
976 ("Driver has goofed in cloning underways udev %x", dev->si_drv0));
977 destroy_devl(dev);
978 }
979 }
987 low = extra;
988 de = dl = NULL;
989 cd = *cdp;
990 LIST_FOREACH(dev, &cd->head, si_clone) {
991 KASSERT(dev->si_flags & SI_CLONELIST,
992 ("Dev %p(%s) should be on clonelist", dev, dev->si_name));
993 u = dev2unit(dev);
994 if (u == (unit | extra)) {

--- 63 unchanged lines hidden (view full) ---

1058 cp = dev->si_priv;
1059 if (!(cp->cdp_flags & CDP_SCHED_DTR)) {
1060 cp->cdp_flags |= CDP_SCHED_DTR;
1061 KASSERT(dev->si_flags & SI_NAMED,
1062 ("Driver has goofed in cloning underways udev %x", dev->si_drv0));
1063 destroy_devl(dev);
1064 }
1065 }
980 dev_unlock();
1066 dev_unlock_and_free();
981 free(cd, M_DEVBUF);
982 *cdp = NULL;
983}
984
985static TAILQ_HEAD(, cdev_priv) dev_ddtr =
986 TAILQ_HEAD_INITIALIZER(dev_ddtr);
987static struct task dev_dtr_task;
988

--- 10 unchanged lines hidden (view full) ---

999 cp = TAILQ_FIRST(&dev_ddtr);
1000 dev = &cp->cdp_c;
1001 KASSERT(cp->cdp_flags & CDP_SCHED_DTR,
1002 ("cdev %p in dev_destroy_tq without CDP_SCHED_DTR", cp));
1003 TAILQ_REMOVE(&dev_ddtr, cp, cdp_dtr_list);
1004 cb = cp->cdp_dtr_cb;
1005 cb_arg = cp->cdp_dtr_cb_arg;
1006 destroy_devl(dev);
1067 free(cd, M_DEVBUF);
1068 *cdp = NULL;
1069}
1070
1071static TAILQ_HEAD(, cdev_priv) dev_ddtr =
1072 TAILQ_HEAD_INITIALIZER(dev_ddtr);
1073static struct task dev_dtr_task;
1074

--- 10 unchanged lines hidden (view full) ---

1085 cp = TAILQ_FIRST(&dev_ddtr);
1086 dev = &cp->cdp_c;
1087 KASSERT(cp->cdp_flags & CDP_SCHED_DTR,
1088 ("cdev %p in dev_destroy_tq without CDP_SCHED_DTR", cp));
1089 TAILQ_REMOVE(&dev_ddtr, cp, cdp_dtr_list);
1090 cb = cp->cdp_dtr_cb;
1091 cb_arg = cp->cdp_dtr_cb_arg;
1092 destroy_devl(dev);
1007 dev_unlock();
1093 dev_unlock_and_free();
1008 dev_rel(dev);
1009 if (cb != NULL)
1010 cb(cb_arg);
1011 dev_lock();
1012 }
1013 dev_unlock();
1014}
1015

--- 65 unchanged lines hidden ---
1094 dev_rel(dev);
1095 if (cb != NULL)
1096 cb(cb_arg);
1097 dev_lock();
1098 }
1099 dev_unlock();
1100}
1101

--- 65 unchanged lines hidden ---