aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authorAndrey V. Elsukov <ae@FreeBSD.org>2011-05-03 18:54:18 +0000
committerAndrey V. Elsukov <ae@FreeBSD.org>2011-05-03 18:54:18 +0000
commitb50a7799b886eadf799cb1702eaf333821883390 (patch)
tree9c931f11b2794651f194e935edf72fba1d4c892c /sys/kern/kern_conf.c
parent6162795be06879f34c61a72afae9290e96778597 (diff)
downloadsrc-b50a7799b886eadf799cb1702eaf333821883390.tar.gz
src-b50a7799b886eadf799cb1702eaf333821883390.zip
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
Notes
Notes: svn path=/head/; revision=221397
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c61
1 files changed, 51 insertions, 10 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 721c01edbaa4..b2be5cc12d1a 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)
{