diff options
author | ae <ae@FreeBSD.org> | 2011-05-03 18:54:18 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2011-05-03 18:54:18 +0000 |
commit | c39b1f9995d954b90c834369644dbc3ba44b4586 (patch) | |
tree | 9c931f11b2794651f194e935edf72fba1d4c892c /sys/kern/kern_conf.c | |
parent | f4c1badc8dba1e2799b19b6107079ff48dd0c903 (diff) | |
download | FreeBSD-src-c39b1f9995d954b90c834369644dbc3ba44b4586.zip FreeBSD-src-c39b1f9995d954b90c834369644dbc3ba44b4586.tar.gz |
Add make_dev_alias_p() function. It is similar to make_dev_alias(),
but it may return an error like make_dev_p() does.
Reviewed by: kib (previous version)
MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r-- | sys/kern/kern_conf.c | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 721c01e..b2be5cc 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -893,23 +893,34 @@ dev_depends(struct cdev *pdev, struct cdev *cdev) 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(pdev != NULL, ("make_dev_alias_v: pdev is NULL")); + KASSERT((flags & MAKEDEV_WAITOK) == 0 || (flags & MAKEDEV_NOWAIT) == 0, + ("make_dev_alias_v: both WAITOK and NOWAIT specified")); + KASSERT((flags & ~(MAKEDEV_WAITOK | MAKEDEV_NOWAIT | + MAKEDEV_CHECKNAME)) == 0, + ("make_dev_alias_v: invalid flags specified (flags=%02x)", flags)); + + 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); + return (error); } dev->si_flags |= SI_NAMED; devfs_create(dev); @@ -917,11 +928,41 @@ make_dev_alias(struct cdev *pdev, const char *fmt, ...) clean_unrhdrl(devfs_inos); dev_unlock(); - notify_create(dev, MAKEDEV_WAITOK); + notify_create(dev, flags); + *cdev = dev; + + return (0); +} + +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); + KASSERT(res == 0 && dev != NULL, + ("make_dev_alias: failed make_dev_alias_v (error=%d)", res)); return (dev); } +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) { |