svn commit: r221397 - in head/sys: kern sys

Andrey V. Elsukov ae at FreeBSD.org
Tue May 3 18:54:19 UTC 2011


Author: ae
Date: Tue May  3 18:54:18 2011
New Revision: 221397
URL: http://svn.freebsd.org/changeset/base/221397

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

Modified:
  head/sys/kern/kern_conf.c
  head/sys/sys/conf.h

Modified: head/sys/kern/kern_conf.c
==============================================================================
--- head/sys/kern/kern_conf.c	Tue May  3 18:48:06 2011	(r221396)
+++ head/sys/kern/kern_conf.c	Tue May  3 18:54:18 2011	(r221397)
@@ -893,23 +893,34 @@ dev_depends(struct cdev *pdev, struct cd
 	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 
 	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)
 {

Modified: head/sys/sys/conf.h
==============================================================================
--- head/sys/sys/conf.h	Tue May  3 18:48:06 2011	(r221396)
+++ head/sys/sys/conf.h	Tue May  3 18:54:18 2011	(r221397)
@@ -278,6 +278,8 @@ int	make_dev_p(int _flags, struct cdev *
 		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);


More information about the svn-src-head mailing list