PERFORCE change 145206 for review

Hans Petter Selasky hselasky at FreeBSD.org
Mon Jul 14 10:21:55 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=145206

Change 145206 by hselasky at hselasky_laptop001 on 2008/07/14 10:21:08

	
	Revert changes to devfs after advice from PHK.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#11 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#16 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#9 edit
.. //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#9 integrate
.. //depot/projects/usb/src/sys/kern/kern_conf.c#9 integrate
.. //depot/projects/usb/src/sys/sys/conf.h#9 integrate

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#11 (text+ko) ====

@@ -376,6 +376,7 @@
 MALLOC_DECLARE(M_USBHC);
 
 extern struct mtx usb2_ref_lock;
+extern struct mtx usb2_sym_lock;
 
 /* typedefs */
 

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#16 (text+ko) ====

@@ -52,6 +52,8 @@
 #include <sys/ttycom.h>
 #include <sys/syscallsubr.h>
 
+#include <machine/stdarg.h>
+
 #ifdef USB_DEBUG
 static int usb2_fifo_debug = 0;
 
@@ -133,8 +135,10 @@
 static eventhandler_tag usb2_clone_tag;
 static void *usb2_old_f_data;
 static struct fileops *usb2_old_f_ops;
+static TAILQ_HEAD(, usb2_symlink) usb2_sym_head;
 
 struct mtx usb2_ref_lock;
+struct mtx usb2_sym_lock;
 
 static uint32_t
 usb2_path_convert_one(const char **pp)
@@ -653,7 +657,7 @@
 	/* destroy symlink devices, if any */
 	for (n = 0; n != 2; n++) {
 		if (f->symlink[n]) {
-			destroy_dev(f->symlink[n]);
+			usb2_free_symlink(f->symlink[n]);
 			f->symlink[n] = NULL;
 		}
 	}
@@ -1093,14 +1097,14 @@
 static void
 usb2_clone(void *arg, USB_UCRED char *name, int namelen, struct cdev **dev)
 {
+	enum {
+		USB_DNAME_LEN = sizeof(USB_DEVICE_NAME) - 1,
+	};
+
 	if (*dev) {
 		/* someone else has created a device */
 		return;
 	}
-	if (strncmp(name, USB_DEVICE_NAME,
-	    sizeof(USB_DEVICE_NAME) - 1)) {
-		return;
-	}
 	if (usb2_last_devloc != (uint32_t)(0 - 1)) {
 		/*
 		 * XXX can we assume that the clone and open operation is
@@ -1108,8 +1112,13 @@
 		 */
 		DPRINTF(1, "Clone race!\n");
 	}
-	usb2_last_devloc = usb2_path_convert(name +
-	    sizeof(USB_DEVICE_NAME) - 1);
+	if (strcmp(name, USB_DEVICE_NAME)) {
+		usb2_last_devloc =
+		    usb2_lookup_symlink(name, namelen);
+	} else {
+		usb2_last_devloc =
+		    usb2_path_convert(name + USB_DNAME_LEN);
+	}
 
 	if (usb2_last_devloc == (uint32_t)(0 - 1)) {
 		/* invalid location */
@@ -1124,6 +1133,9 @@
 usb2_dev_init(void *arg)
 {
 	mtx_init(&usb2_ref_lock, "USB ref mutex", NULL, MTX_DEF);
+	mtx_init(&usb2_sym_lock, "USB sym mutex", NULL, MTX_DEF);
+	TAILQ_INIT(&usb2_sym_head);
+
 	/* check the UGEN methods */
 	usb2_fifo_check_methods(&usb2_ugen_methods);
 	return;
@@ -1939,10 +1951,10 @@
 		 */
 		if (n & 1) {
 			f_rx->symlink[n / 2] =
-			    make_dev_symlink(src, "%s", buf);
+			    usb2_alloc_symlink(src, "%s", buf);
 		} else {
 			f_tx->symlink[n / 2] =
-			    make_dev_symlink(src, "%s", buf);
+			    usb2_alloc_symlink(src, "%s", buf);
 		}
 		DPRINTF(0, "Symlink: %s -> %s\n", buf, src);
 	}
@@ -2259,3 +2271,92 @@
 	usb2_fifo_wakeup(f);
 	return;
 }
+
+/*------------------------------------------------------------------------*
+ *	usb2_alloc_symlink
+ *
+ * Return values:
+ * NULL: Failure
+ * Else: Pointer to symlink entry
+ *------------------------------------------------------------------------*/
+struct usb2_symlink *
+usb2_alloc_symlink(const char *target, const char *fmt,...)
+{
+	struct usb2_symlink *ps;
+	va_list ap;
+
+	ps = malloc(sizeof(*ps), M_USBDEV, M_WAITOK);
+	if (ps == NULL) {
+		return (ps);
+	}
+	strlcpy(ps->dst_path, target, sizeof(ps->dst_path));
+	ps->dst_len = strlen(ps->dst_path);
+
+	va_start(ap, fmt);
+	vsnrprintf(ps->src_path,
+	    sizeof(ps->src_path), 32, fmt, ap);
+	va_end(ap);
+	ps->src_len = strlen(ps->src_path);
+
+	mtx_lock(&usb2_sym_lock);
+	TAILQ_INSERT_TAIL(&usb2_sym_head, ps, sym_entry);
+	mtx_unlock(&usb2_sym_lock);
+	return (ps);
+}
+
+/*------------------------------------------------------------------------*
+ *	usb2_free_symlink
+ *------------------------------------------------------------------------*/
+void
+usb2_free_symlink(struct usb2_symlink *ps)
+{
+	if (ps == NULL) {
+		return;
+	}
+	mtx_lock(&usb2_sym_lock);
+	TAILQ_REMOVE(&usb2_sym_head, ps, sym_entry);
+	mtx_unlock(&usb2_sym_lock);
+
+	free(ps, M_USBDEV);
+	return;
+}
+
+/*------------------------------------------------------------------------*
+ *	usb2_lookup_symlink
+ *
+ * Return value:
+ * Numerical device location
+ *------------------------------------------------------------------------*/
+uint32_t
+usb2_lookup_symlink(const char *src_ptr, uint8_t src_len)
+{
+	enum {
+		USB_DNAME_LEN = sizeof(USB_DEVICE_NAME) - 1,
+	};
+	struct usb2_symlink *ps;
+	uint32_t temp;
+
+	mtx_lock(&usb2_sym_lock);
+
+	TAILQ_FOREACH(ps, &usb2_sym_head, sym_entry) {
+
+		if (src_len != ps->src_len)
+			continue;
+
+		if (memcmp(ps->src_path, src_ptr, src_len))
+			continue;
+
+		if (USB_DNAME_LEN > ps->dst_len)
+			continue;
+
+		if (strncmp(ps->dst_path, USB_DEVICE_NAME, USB_DNAME_LEN))
+			continue;
+
+		temp = usb2_path_convert(ps->dst_path + USB_DNAME_LEN);
+		mtx_unlock(&usb2_sym_lock);
+
+		return (temp);
+	}
+	mtx_unlock(&usb2_sym_lock);
+	return (0 - 1);
+}

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#9 (text+ko) ====

@@ -44,6 +44,16 @@
 typedef int (usb2_fifo_ioctl_t)(struct usb2_fifo *fifo, u_long cmd, void *addr, int fflags, struct thread *td);
 typedef void (usb2_fifo_cmd_t)(struct usb2_fifo *fifo);
 
+struct usb2_symlink {
+	TAILQ_ENTRY(usb2_symlink) sym_entry;
+	char	src_path[32];		/* Source path - including terminating
+					 * zero */
+	char	dst_path[32];		/* Destination path - including
+					 * terminating zero */
+	uint8_t	src_len;		/* String length */
+	uint8_t	dst_len;		/* String length */
+};
+
 /*
  * Locking note for the following functions.  All the
  * "usb2_fifo_cmd_t" functions are called locked. The others are
@@ -72,7 +82,7 @@
 	struct cv cv_io;
 	struct cv cv_drain;
 	struct usb2_fifo_methods *methods;
-	struct cdev *symlink[2];	/* our symlinks */
+	struct usb2_symlink *symlink[2];/* our symlinks */
 	struct proc *async_p;		/* process that wants SIGIO */
 	struct usb2_fs_endpoint *fs_ep_ptr;
 	struct usb2_device *udev;
@@ -127,5 +137,8 @@
 void	usb2_fifo_reset(struct usb2_fifo *f);
 int	usb2_check_thread_perm(struct usb2_device *udev, struct thread *td, int fflags, uint8_t iface_index, uint8_t ep_index);
 void	usb2_fifo_wakeup(struct usb2_fifo *f);
+struct usb2_symlink *usb2_alloc_symlink(const char *target, const char *fmt,...);
+void	usb2_free_symlink(struct usb2_symlink *ps);
+uint32_t usb2_lookup_symlink(const char *src_ptr, uint8_t src_len);
 
 #endif					/* _USB2_DEV_H_ */

==== //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#9 (text+ko) ====

@@ -350,6 +350,7 @@
 	struct cdev_priv *cdp;
 	struct devfs_dirent *de;
 	struct devfs_dirent *dd;
+	struct cdev *pdev;
 	int j;
 	char *q, *s;
 
@@ -435,9 +436,10 @@
 			de->de_gid = 0;
 			de->de_mode = 0755;
 			de->de_dirent->d_type = DT_LNK;
-			j = strlen(cdp->cdp_c.si_symlink) + 1;
+			pdev = cdp->cdp_c.si_parent;
+			j = strlen(pdev->si_name) + 1;
 			de->de_symlink = malloc(j, M_DEVFS, M_WAITOK);
-			bcopy(cdp->cdp_c.si_symlink, de->de_symlink, j);
+			bcopy(pdev->si_name, de->de_symlink, j);
 		} else {
 			de->de_uid = cdp->cdp_c.si_uid;
 			de->de_gid = cdp->cdp_c.si_gid;

==== //depot/projects/usb/src/sys/kern/kern_conf.c#9 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_conf.c,v 1.218 2008/06/16 17:34:59 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_conf.c,v 1.219 2008/07/11 11:22:19 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -690,7 +690,7 @@
 		printf("WARNING: Device name truncated! (%s)\n", 
 		    dev->__si_namebuf);
 	}
-
+		
 	dev->si_flags |= SI_NAMED;
 #ifdef MAC
 	if (cr != NULL)
@@ -758,6 +758,7 @@
 dev_dependsl(struct cdev *pdev, struct cdev *cdev)
 {
 
+	cdev->si_parent = pdev;
 	cdev->si_flags |= SI_CHILD;
 	LIST_INSERT_HEAD(&pdev->si_children, cdev, si_siblings);
 }
@@ -772,81 +773,36 @@
 	dev_unlock();
 }
 
-static struct cdev *
-make_dev_alias_symlink(const char *target, struct cdev *pdev, const char *fmt, va_list ap)
+struct cdev *
+make_dev_alias(struct cdev *pdev, const char *fmt, ...)
 {
 	struct cdev *dev;
+	va_list ap;
 	int i;
 
+	KASSERT(pdev != NULL, ("NULL pdev"));
 	dev = devfs_alloc();
 	dev_lock();
 	dev->si_flags |= SI_ALIAS;
 	dev->si_flags |= SI_NAMED;
-	i = sizeof(dev->__si_namebuf);
-	i -= vsnrprintf(dev->__si_namebuf, i, 32, fmt, ap);
-	if (i < 1) {
+	va_start(ap, fmt);
+	i = vsnrprintf(dev->__si_namebuf, sizeof dev->__si_namebuf, 32, fmt, ap);
+	if (i > (sizeof dev->__si_namebuf - 1)) {
 		printf("WARNING: Device name truncated! (%s)\n", 
 		    dev->__si_namebuf);
-		i = 1;
 	}
+	va_end(ap);
 
-	if (target == NULL) {
-		/* use parent device name */
-		dev->si_symlink = pdev->si_name;
-	} else {
-		if (i < 2) {
-			i = 1;
-		} else {
-			/* make sure there is a NUL between the strings */
-			i --;
-		}
-		/* use specified target name */
-		dev->si_symlink = dev->__si_namebuf + 
-		  sizeof(dev->__si_namebuf) - i;
-		i -= strlcpy(dev->si_symlink, target, i);
-		if (i < 1) {
-			printf("WARNING: Symlink name truncated! (%s)\n",
-			    dev->si_symlink);
-			i = 1;
-		}
-	}
 	devfs_create(dev);
+	dev_dependsl(pdev, dev);
 	clean_unrhdrl(devfs_inos);
 	dev_unlock();
 
-	if (pdev != NULL) {
-		dev_depends(pdev, dev);
-	}
-
 	notify_create(dev);
 
 	return (dev);
 }
 
-struct cdev *
-make_dev_alias(struct cdev *pdev, const char *fmt, ...)
-{
-	struct cdev *dev;
-	va_list ap;
-
-	va_start(ap, fmt);
-	dev = make_dev_alias_symlink(NULL, pdev, fmt, ap);
-	va_end(ap);
-	return (dev);
-}
-
-struct cdev *
-make_dev_symlink(const char *target, const char *fmt, ...)
-{
-	struct cdev *dev;
-	va_list ap;
-
-	va_start(ap, fmt);
-	dev = make_dev_alias_symlink(target, NULL, fmt, ap);
-	va_end(ap);
-	return (dev);
-}
-
 static void
 destroy_devl(struct cdev *dev)
 {

==== //depot/projects/usb/src/sys/sys/conf.h#9 (text+ko) ====

@@ -77,7 +77,7 @@
 	LIST_ENTRY(cdev)	si_clone;
 	LIST_HEAD(, cdev)	si_children;
 	LIST_ENTRY(cdev)	si_siblings;
-	char		*si_symlink; /* symbolic link name */
+	struct cdev *si_parent;
 	char		*si_name;
 	void		*si_drv1, *si_drv2;
 	struct cdevsw	*si_devsw;
@@ -273,8 +273,6 @@
 		struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode,
 		const char *_fmt, ...) __printflike(8, 9);
 struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3);
-struct cdev *make_dev_symlink(const char *target, const char *fmt, ...) __printflike(2, 3);
-
 void	dev_lock(void);
 void	dev_unlock(void);
 void	setconf(void);


More information about the p4-projects mailing list