Index: kern/kern_conf.c =================================================================== --- kern/kern_conf.c (revision 221375) +++ kern/kern_conf.c (working copy) @@ -893,35 +893,69 @@ dev_unlock(); } -struct cdev * -make_dev_alias(struct cdev *pdev, const char *fmt, ...) +static int +make_dev_alias_v(int flags, struct cdev **cdev, struct cdev *pdev, + const char *fmt, va_list ap) { struct cdev *dev; - va_list ap; int error; KASSERT(pdev != NULL, ("NULL pdev")); - dev = devfs_alloc(MAKEDEV_WAITOK); + KASSERT((flags & MAKEDEV_WAITOK) == 0 || (flags & MAKEDEV_NOWAIT) == 0, + ("make_dev_alias_v: both WAITOK and NOWAIT specified")); + + dev = devfs_alloc(flags); + if (dev == NULL) + return (ENOMEM); dev_lock(); dev->si_flags |= SI_ALIAS; - va_start(ap, fmt); error = prep_devname(dev, fmt, ap); - va_end(ap); if (error != 0) { - panic("make_dev_alias: bad si_name (error=%d, si_name=%s)", - error, dev->si_name); + if ((flags & MAKEDEV_CHECKNAME) == 0) { + panic("make_dev_alias_v: bad si_name " + "(error=%d, si_name=%s)", error, dev->si_name); + } + dev_unlock(); + devfs_free(dev); + } else { + dev->si_flags |= SI_NAMED; + devfs_create(dev); + dev_dependsl(pdev, dev); + clean_unrhdrl(devfs_inos); + dev_unlock(); + notify_create(dev, flags); + *cdev = dev; } - dev->si_flags |= SI_NAMED; - devfs_create(dev); - dev_dependsl(pdev, dev); - clean_unrhdrl(devfs_inos); - dev_unlock(); - notify_create(dev, MAKEDEV_WAITOK); + return (error); +} - return (dev); +struct cdev * +make_dev_alias(struct cdev *pdev, const char *fmt, ...) +{ + struct cdev *dev; + va_list ap; + int res; + + va_start(ap, fmt); + res = make_dev_alias_v(MAKEDEV_WAITOK, &dev, pdev, fmt, ap); + va_end(ap); + return (res == 0 ? dev: NULL); } +int +make_dev_alias_p(int flags, struct cdev **cdev, struct cdev *pdev, + const char *fmt, ...) +{ + va_list ap; + int res; + + va_start(ap, fmt); + res = make_dev_alias_v(flags, cdev, pdev, fmt, ap); + va_end(ap); + return (res); +} + static void destroy_devl(struct cdev *dev) { Index: geom/geom_dev.c =================================================================== --- geom/geom_dev.c (revision 221375) +++ geom/geom_dev.c (working copy) @@ -148,7 +148,8 @@ snprintf(buf, sizeof(buf), "%s%s", val, gp->name + len); freeenv(val); - adev = make_dev_alias(dev, buf); + make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, + &adev, dev, "%s", buf); break; } } Index: sys/conf.h =================================================================== --- sys/conf.h (revision 221375) +++ sys/conf.h (working copy) @@ -278,6 +278,8 @@ const char *_fmt, ...) __printflike(8, 9); struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3); +int make_dev_alias_p(int _flags, struct cdev **_cdev, struct cdev *_pdev, + const char *_fmt, ...) __printflike(4, 5); void dev_lock(void); void dev_unlock(void); void setconf(void);