| 773 | } |
| 774 | |
| 775 | static int |
| 776 | make_dev_sv(struct make_dev_args *args1, struct cdev **dres, |
| 777 | const char *fmt, va_list ap) |
| 778 | { |
| 779 | struct cdev *dev, *dev_new; |
| 780 | struct make_dev_args args; |
| 781 | int res; |
| 782 | |
| 783 | bzero(&args, sizeof(args)); |
| 784 | if (sizeof(args) < args1->mda_size) |
| 785 | return (EINVAL); |
| 786 | bcopy(args1, &args, args1->mda_size); |
| 787 | KASSERT((args.mda_flags & MAKEDEV_WAITOK) == 0 || |
| 788 | (args.mda_flags & MAKEDEV_NOWAIT) == 0, |
| 789 | ("make_dev_sv: both WAITOK and NOWAIT specified")); |
| 790 | dev_new = devfs_alloc(args.mda_flags); |
| 791 | if (dev_new == NULL) |
| 792 | return (ENOMEM); |
| 793 | dev_lock(); |
| 794 | res = prep_cdevsw(args.mda_devsw, args.mda_flags); |
| 795 | if (res != 0) { |
| 796 | dev_unlock(); |
| 797 | devfs_free(dev_new); |
| 798 | return (res); |
| 799 | } |
| 800 | dev = newdev(&args, dev_new); |
| 801 | if ((dev->si_flags & SI_NAMED) == 0) { |
| 802 | res = prep_devname(dev, fmt, ap); |
| 803 | if (res != 0) { |
| 804 | if ((args.mda_flags & MAKEDEV_CHECKNAME) == 0) { |
| 805 | panic( |
| 806 | "make_dev_sv: bad si_name (error=%d, si_name=%s)", |
| 807 | res, dev->si_name); |
| 808 | } |
| 809 | if (dev == dev_new) { |
| 810 | LIST_REMOVE(dev, si_list); |
| 811 | dev_unlock(); |
| 812 | devfs_free(dev); |
| 813 | } else |
| 814 | dev_unlock(); |
| 815 | return (res); |
| 816 | } |
| 817 | } |
| 818 | if ((args.mda_flags & MAKEDEV_REF) != 0) |
| 819 | dev_refl(dev); |
| 820 | if ((args.mda_flags & MAKEDEV_ETERNAL) != 0) |
| 821 | dev->si_flags |= SI_ETERNAL; |
| 822 | KASSERT(!(dev->si_flags & SI_NAMED), |
| 823 | ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)", |
| 824 | args.mda_devsw->d_name, dev2unit(dev), devtoname(dev))); |
| 825 | dev->si_flags |= SI_NAMED; |
| 826 | if (args.mda_cr != NULL) |
| 827 | dev->si_cred = crhold(args.mda_cr); |
| 828 | dev->si_uid = args.mda_uid; |
| 829 | dev->si_gid = args.mda_gid; |
| 830 | dev->si_mode = args.mda_mode; |
| 831 | |
| 832 | devfs_create(dev); |
no test coverage detected