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 --- |