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
This commit is contained in:
Jaakko Heinonen 2010-09-21 16:49:02 +00:00
parent 8f7f5a7f26
commit 6adc52306a
2 changed files with 23 additions and 14 deletions

View File

@ -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_mount *dm);
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);

View File

@ -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, int *dm_unlock)
* 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;