kern_conf.c (416ba5c74546f32a993436a99516d35008e9f384) kern_conf.c (48ce5d4cac7dc3c2160ea69dc550e218fbc0e697)
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

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

561static void
562notify_destroy(struct cdev *dev)
563{
564
565 notify(dev, "DESTROY", MAKEDEV_WAITOK);
566}
567
568static struct cdev *
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

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

561static void
562notify_destroy(struct cdev *dev)
563{
564
565 notify(dev, "DESTROY", MAKEDEV_WAITOK);
566}
567
568static struct cdev *
569newdev(struct cdevsw *csw, int unit, struct cdev *si)
569newdev(struct make_dev_args *args, struct cdev *si)
570{
571 struct cdev *si2;
570{
571 struct cdev *si2;
572 struct cdevsw *csw;
572
573 mtx_assert(&devmtx, MA_OWNED);
573
574 mtx_assert(&devmtx, MA_OWNED);
575 csw = args->mda_devsw;
574 if (csw->d_flags & D_NEEDMINOR) {
575 /* We may want to return an existing device */
576 LIST_FOREACH(si2, &csw->d_devs, si_list) {
576 if (csw->d_flags & D_NEEDMINOR) {
577 /* We may want to return an existing device */
578 LIST_FOREACH(si2, &csw->d_devs, si_list) {
577 if (dev2unit(si2) == unit) {
579 if (dev2unit(si2) == args->mda_unit) {
578 dev_free_devlocked(si);
579 return (si2);
580 }
581 }
582 }
580 dev_free_devlocked(si);
581 return (si2);
582 }
583 }
584 }
583 si->si_drv0 = unit;
585 si->si_drv0 = args->mda_unit;
584 si->si_devsw = csw;
586 si->si_devsw = csw;
587 si->si_drv1 = args->mda_si_drv1;
588 si->si_drv2 = args->mda_si_drv2;
585 LIST_INSERT_HEAD(&csw->d_devs, si, si_list);
586 return (si);
587}
588
589static void
590fini_cdevsw(struct cdevsw *devsw)
591{
592 struct cdevsw *gt;

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

732 }
733
734 if (devfs_dev_exists(dev->si_name) != 0)
735 return (EEXIST);
736
737 return (0);
738}
739
589 LIST_INSERT_HEAD(&csw->d_devs, si, si_list);
590 return (si);
591}
592
593static void
594fini_cdevsw(struct cdevsw *devsw)
595{
596 struct cdevsw *gt;

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

736 }
737
738 if (devfs_dev_exists(dev->si_name) != 0)
739 return (EEXIST);
740
741 return (0);
742}
743
744void
745make_dev_args_init_impl(struct make_dev_args *args, size_t sz)
746{
747
748 bzero(args, sz);
749 args->mda_size = sz;
750}
751
740static int
752static int
741make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit,
742 struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
743 va_list ap)
753make_dev_sv(struct make_dev_args *args1, struct cdev **dres,
754 const char *fmt, va_list ap)
744{
745 struct cdev *dev, *dev_new;
755{
756 struct cdev *dev, *dev_new;
757 struct make_dev_args args;
746 int res;
747
758 int res;
759
748 KASSERT((flags & MAKEDEV_WAITOK) == 0 || (flags & MAKEDEV_NOWAIT) == 0,
749 ("make_dev_credv: both WAITOK and NOWAIT specified"));
750 dev_new = devfs_alloc(flags);
760 bzero(&args, sizeof(args));
761 if (sizeof(args) < args1->mda_size)
762 return (EINVAL);
763 bcopy(args1, &args, args1->mda_size);
764 KASSERT((args.mda_flags & MAKEDEV_WAITOK) == 0 ||
765 (args.mda_flags & MAKEDEV_NOWAIT) == 0,
766 ("make_dev_sv: both WAITOK and NOWAIT specified"));
767 dev_new = devfs_alloc(args.mda_flags);
751 if (dev_new == NULL)
752 return (ENOMEM);
753 dev_lock();
768 if (dev_new == NULL)
769 return (ENOMEM);
770 dev_lock();
754 res = prep_cdevsw(devsw, flags);
771 res = prep_cdevsw(args.mda_devsw, args.mda_flags);
755 if (res != 0) {
756 dev_unlock();
757 devfs_free(dev_new);
758 return (res);
759 }
772 if (res != 0) {
773 dev_unlock();
774 devfs_free(dev_new);
775 return (res);
776 }
760 dev = newdev(devsw, unit, dev_new);
777 dev = newdev(&args, dev_new);
761 if ((dev->si_flags & SI_NAMED) == 0) {
762 res = prep_devname(dev, fmt, ap);
763 if (res != 0) {
778 if ((dev->si_flags & SI_NAMED) == 0) {
779 res = prep_devname(dev, fmt, ap);
780 if (res != 0) {
764 if ((flags & MAKEDEV_CHECKNAME) == 0) {
781 if ((args.mda_flags & MAKEDEV_CHECKNAME) == 0) {
765 panic(
782 panic(
766 "make_dev_credv: bad si_name (error=%d, si_name=%s)",
783 "make_dev_sv: bad si_name (error=%d, si_name=%s)",
767 res, dev->si_name);
768 }
769 if (dev == dev_new) {
770 LIST_REMOVE(dev, si_list);
771 dev_unlock();
772 devfs_free(dev);
773 } else
774 dev_unlock();
775 return (res);
776 }
777 }
784 res, dev->si_name);
785 }
786 if (dev == dev_new) {
787 LIST_REMOVE(dev, si_list);
788 dev_unlock();
789 devfs_free(dev);
790 } else
791 dev_unlock();
792 return (res);
793 }
794 }
778 if (flags & MAKEDEV_REF)
795 if ((args.mda_flags & MAKEDEV_REF) != 0)
779 dev_refl(dev);
796 dev_refl(dev);
780 if (flags & MAKEDEV_ETERNAL)
797 if ((args.mda_flags & MAKEDEV_ETERNAL) != 0)
781 dev->si_flags |= SI_ETERNAL;
782 if (dev->si_flags & SI_CHEAPCLONE &&
783 dev->si_flags & SI_NAMED) {
784 /*
785 * This is allowed as it removes races and generally
786 * simplifies cloning devices.
787 * XXX: still ??
788 */
789 dev_unlock_and_free();
790 *dres = dev;
791 return (0);
792 }
793 KASSERT(!(dev->si_flags & SI_NAMED),
794 ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)",
798 dev->si_flags |= SI_ETERNAL;
799 if (dev->si_flags & SI_CHEAPCLONE &&
800 dev->si_flags & SI_NAMED) {
801 /*
802 * This is allowed as it removes races and generally
803 * simplifies cloning devices.
804 * XXX: still ??
805 */
806 dev_unlock_and_free();
807 *dres = dev;
808 return (0);
809 }
810 KASSERT(!(dev->si_flags & SI_NAMED),
811 ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)",
795 devsw->d_name, dev2unit(dev), devtoname(dev)));
812 args.mda_devsw->d_name, dev2unit(dev), devtoname(dev)));
796 dev->si_flags |= SI_NAMED;
813 dev->si_flags |= SI_NAMED;
797 if (cr != NULL)
798 dev->si_cred = crhold(cr);
799 dev->si_uid = uid;
800 dev->si_gid = gid;
801 dev->si_mode = mode;
814 if (args.mda_cr != NULL)
815 dev->si_cred = crhold(args.mda_cr);
816 dev->si_uid = args.mda_uid;
817 dev->si_gid = args.mda_gid;
818 dev->si_mode = args.mda_mode;
802
803 devfs_create(dev);
804 clean_unrhdrl(devfs_inos);
805 dev_unlock_and_free();
806
819
820 devfs_create(dev);
821 clean_unrhdrl(devfs_inos);
822 dev_unlock_and_free();
823
807 notify_create(dev, flags);
824 notify_create(dev, args.mda_flags);
808
809 *dres = dev;
810 return (0);
811}
812
825
826 *dres = dev;
827 return (0);
828}
829
830int
831make_dev_s(struct make_dev_args *args, struct cdev **dres,
832 const char *fmt, ...)
833{
834 va_list ap;
835 int res;
836
837 va_start(ap, fmt);
838 res = make_dev_sv(args, dres, fmt, ap);
839 va_end(ap);
840 return (res);
841}
842
843static int
844make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit,
845 struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt,
846 va_list ap)
847{
848 struct make_dev_args args;
849
850 make_dev_args_init(&args);
851 args.mda_flags = flags;
852 args.mda_devsw = devsw;
853 args.mda_cr = cr;
854 args.mda_uid = uid;
855 args.mda_gid = gid;
856 args.mda_mode = mode;
857 args.mda_unit = unit;
858 return (make_dev_sv(&args, dres, fmt, ap));
859}
860
813struct cdev *
814make_dev(struct cdevsw *devsw, int unit, uid_t uid, gid_t gid, int mode,
815 const char *fmt, ...)
816{
817 struct cdev *dev;
818 va_list ap;
819 int res;
820

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

1242}
1243
1244int
1245clone_create(struct clonedevs **cdp, struct cdevsw *csw, int *up,
1246 struct cdev **dp, int extra)
1247{
1248 struct clonedevs *cd;
1249 struct cdev *dev, *ndev, *dl, *de;
861struct cdev *
862make_dev(struct cdevsw *devsw, int unit, uid_t uid, gid_t gid, int mode,
863 const char *fmt, ...)
864{
865 struct cdev *dev;
866 va_list ap;
867 int res;
868

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

1290}
1291
1292int
1293clone_create(struct clonedevs **cdp, struct cdevsw *csw, int *up,
1294 struct cdev **dp, int extra)
1295{
1296 struct clonedevs *cd;
1297 struct cdev *dev, *ndev, *dl, *de;
1298 struct make_dev_args args;
1250 int unit, low, u;
1251
1252 KASSERT(*cdp != NULL,
1253 ("clone_setup() not called in driver \"%s\"", csw->d_name));
1254 KASSERT(!(extra & CLONE_UNITMASK),
1255 ("Illegal extra bits (0x%x) in clone_create", extra));
1256 KASSERT(*up <= CLONE_UNITMASK,
1257 ("Too high unit (0x%x) in clone_create", *up));

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

1293 continue;
1294 } else if (u > (unit | extra)) {
1295 dl = dev;
1296 break;
1297 }
1298 }
1299 if (unit == -1)
1300 unit = low & CLONE_UNITMASK;
1299 int unit, low, u;
1300
1301 KASSERT(*cdp != NULL,
1302 ("clone_setup() not called in driver \"%s\"", csw->d_name));
1303 KASSERT(!(extra & CLONE_UNITMASK),
1304 ("Illegal extra bits (0x%x) in clone_create", extra));
1305 KASSERT(*up <= CLONE_UNITMASK,
1306 ("Too high unit (0x%x) in clone_create", *up));

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

1342 continue;
1343 } else if (u > (unit | extra)) {
1344 dl = dev;
1345 break;
1346 }
1347 }
1348 if (unit == -1)
1349 unit = low & CLONE_UNITMASK;
1301 dev = newdev(csw, unit | extra, ndev);
1350 make_dev_args_init(&args);
1351 args.mda_unit = unit | extra;
1352 args.mda_devsw = csw;
1353 dev = newdev(&args, ndev);
1302 if (dev->si_flags & SI_CLONELIST) {
1303 printf("dev %p (%s) is on clonelist\n", dev, dev->si_name);
1304 printf("unit=%d, low=%d, extra=0x%x\n", unit, low, extra);
1305 LIST_FOREACH(dev, &cd->head, si_clone) {
1306 printf("\t%p %s\n", dev, dev->si_name);
1307 }
1308 panic("foo");
1309 }

--- 203 unchanged lines hidden ---
1354 if (dev->si_flags & SI_CLONELIST) {
1355 printf("dev %p (%s) is on clonelist\n", dev, dev->si_name);
1356 printf("unit=%d, low=%d, extra=0x%x\n", unit, low, extra);
1357 LIST_FOREACH(dev, &cd->head, si_clone) {
1358 printf("\t%p %s\n", dev, dev->si_name);
1359 }
1360 panic("foo");
1361 }

--- 203 unchanged lines hidden ---