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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to