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-head
mailing list