svn commit: r212966 - head/sys/fs/devfs

Jaakko Heinonen jh at FreeBSD.org
Tue Sep 21 16:49:03 UTC 2010


Author: jh
Date: Tue Sep 21 16:49:02 2010
New Revision: 212966
URL: http://svn.freebsd.org/changeset/base/212966

Log:
  Modify devfs_fqpn() for future use in devfs path reference counting
  code:
  
  - Accept devfs_mount and devfs_dirent as the arguments instead of a
    vnode. This generalizes the function so that it can be used from
    contexts where vnode references are not available.
  - Accept NULL cnp argument. No '/' will be appended, if a NULL cnp is
    provided.
  - Make the function global and add its prototype to devfs.h.
  
  Reviewed by:	kib

Modified:
  head/sys/fs/devfs/devfs.h
  head/sys/fs/devfs/devfs_vnops.c

Modified: head/sys/fs/devfs/devfs.h
==============================================================================
--- head/sys/fs/devfs/devfs.h	Tue Sep 21 16:24:51 2010	(r212965)
+++ head/sys/fs/devfs/devfs.h	Tue Sep 21 16:49:02 2010	(r212966)
@@ -122,6 +122,8 @@ struct devfs_rule {
 MALLOC_DECLARE(M_DEVFS);
 #endif
 
+struct componentname;
+
 struct devfs_dirent {
 	struct cdev_priv	*de_cdp;
 	int			de_inode;
@@ -178,6 +180,8 @@ void devfs_rules_cleanup (struct devfs_m
 int devfs_rules_ioctl(struct devfs_mount *dm, u_long cmd, caddr_t data, struct thread *td);
 int devfs_allocv(struct devfs_dirent *de, struct mount *mp, int lockmode,
     struct vnode **vpp);
+char *devfs_fqpn(char *, struct devfs_mount *, struct devfs_dirent *,
+    struct componentname *);
 void devfs_delete(struct devfs_mount *dm, struct devfs_dirent *de, int flags);
 void devfs_dirent_free(struct devfs_dirent *de);
 void devfs_populate (struct devfs_mount *dm);

Modified: head/sys/fs/devfs/devfs_vnops.c
==============================================================================
--- head/sys/fs/devfs/devfs_vnops.c	Tue Sep 21 16:24:51 2010	(r212965)
+++ head/sys/fs/devfs/devfs_vnops.c	Tue Sep 21 16:49:02 2010	(r212966)
@@ -299,29 +299,34 @@ finished:
 }
 
 /*
- * Construct the fully qualified path name relative to the mountpoint
+ * Construct the fully qualified path name relative to the mountpoint.
+ * If a NULL cnp is provided, no '/' is appended to the resulting path.
  */
-static char *
-devfs_fqpn(char *buf, struct vnode *dvp, struct componentname *cnp)
+char *
+devfs_fqpn(char *buf, struct devfs_mount *dmp, struct devfs_dirent *dd,
+    struct componentname *cnp)
 {
 	int i;
-	struct devfs_dirent *de, *dd;
-	struct devfs_mount *dmp;
+	struct devfs_dirent *de;
+
+	sx_assert(&dmp->dm_lock, SA_LOCKED);
 
-	dmp = VFSTODEVFS(dvp->v_mount);
-	dd = dvp->v_data;
 	i = SPECNAMELEN;
 	buf[i] = '\0';
-	i -= cnp->cn_namelen;
+	if (cnp != NULL)
+		i -= cnp->cn_namelen;
 	if (i < 0)
 		 return (NULL);
-	bcopy(cnp->cn_nameptr, buf + i, cnp->cn_namelen);
+	if (cnp != NULL)
+		bcopy(cnp->cn_nameptr, buf + i, cnp->cn_namelen);
 	de = dd;
 	while (de != dmp->dm_rootdir) {
-		i--;
-		if (i < 0)
-			 return (NULL);
-		buf[i] = '/';
+		if (cnp != NULL || i < SPECNAMELEN) {
+			i--;
+			if (i < 0)
+				 return (NULL);
+			buf[i] = '/';
+		}
 		i -= de->de_dirent->d_namlen;
 		if (i < 0)
 			 return (NULL);
@@ -878,7 +883,7 @@ devfs_lookupx(struct vop_lookup_args *ap
 		 * OK, we didn't have an entry for the name we were asked for
 		 * so we try to see if anybody can create it on demand.
 		 */
-		pname = devfs_fqpn(specname, dvp, cnp);
+		pname = devfs_fqpn(specname, dmp, dd, cnp);
 		if (pname == NULL)
 			break;
 


More information about the svn-src-all mailing list