From 6bad412525aca72f3c4b4d706db249c402952055 Mon Sep 17 00:00:00 2001 From: green Date: Wed, 26 Apr 2000 11:57:45 +0000 Subject: Move procfs_fullpath() to vfs_cache.c, with a rename to textvp_fullpath(). There's no excuse to have code in synthetic filestores that allows direct references to the textvp anymore. Feature requested by: msmith Feature agreed to by: warner Move requested by: phk Move agreed to by: bde --- sys/fs/procfs/procfs.h | 1 - sys/fs/procfs/procfs_subr.c | 96 -------------------------------------------- sys/fs/procfs/procfs_vnops.c | 4 +- 3 files changed, 2 insertions(+), 99 deletions(-) (limited to 'sys/fs/procfs') diff --git a/sys/fs/procfs/procfs.h b/sys/fs/procfs/procfs.h index ebeea31..f000026 100644 --- a/sys/fs/procfs/procfs.h +++ b/sys/fs/procfs/procfs.h @@ -140,7 +140,6 @@ int procfs_domap __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct int procfs_dotype __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); int procfs_docmdline __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); int procfs_dorlimit __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio)); -int procfs_fullpath __P((struct proc *p, char **retbuf, char **retfreebuf)); /* Return 1 if process has special kernel digging privileges */ int procfs_kmemaccess __P((struct proc *)); diff --git a/sys/fs/procfs/procfs_subr.c b/sys/fs/procfs/procfs_subr.c index 053a620..c86c6c8 100644 --- a/sys/fs/procfs/procfs_subr.c +++ b/sys/fs/procfs/procfs_subr.c @@ -410,99 +410,3 @@ procfs_exit(struct proc *p) pfs = pfs->pfs_next; } } - -/* - * Thus begins the fullpath magic. - */ - -SYSCTL_DECL(_vfs_cache); - -#define STATNODE(name) \ - static u_int name; \ - SYSCTL_INT(_vfs_cache, OID_AUTO, name, CTLFLAG_RD, &name, 0, "") - -static int disablefullpath; -SYSCTL_INT(_debug, OID_AUTO, disablefullpath, CTLFLAG_RW, - &disablefullpath, 0, ""); - -STATNODE(numfullpathcalls); -STATNODE(numfullpathfail1); -STATNODE(numfullpathfail2); -STATNODE(numfullpathfail3); -STATNODE(numfullpathfail4); -STATNODE(numfullpathfound); - -int -procfs_fullpath(struct proc *p, char **retbuf, char **retfreebuf) { - char *bp, *buf; - int i, slash_prefixed; - struct filedesc *fdp; - struct namecache *ncp; - struct vnode *vp, *textvp; - - numfullpathcalls++; - if (disablefullpath) - return (ENODEV); - textvp = p->p_textvp; - if (textvp == NULL) - return (EINVAL); - buf = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); - bp = buf + MAXPATHLEN - 1; - *bp = '\0'; - fdp = p->p_fd; - slash_prefixed = 0; - for (vp = textvp; vp != fdp->fd_rdir && vp != rootvnode;) { - if (vp->v_flag & VROOT) { - if (vp->v_mount == NULL) { /* forced unmount */ - free(buf, M_TEMP); - return (EBADF); - } - vp = vp->v_mount->mnt_vnodecovered; - continue; - } - if (vp != textvp && vp->v_dd->v_id != vp->v_ddid) { - numfullpathfail1++; - free(buf, M_TEMP); - return (ENOTDIR); - } - ncp = TAILQ_FIRST(&vp->v_cache_dst); - if (!ncp) { - numfullpathfail2++; - free(buf, M_TEMP); - return (ENOENT); - } - if (vp != textvp && ncp->nc_dvp != vp->v_dd) { - numfullpathfail3++; - free(buf, M_TEMP); - return (EBADF); - } - for (i = ncp->nc_nlen - 1; i >= 0; i--) { - if (bp == buf) { - numfullpathfail4++; - free(buf, M_TEMP); - return (ENOMEM); - } - *--bp = ncp->nc_name[i]; - } - if (bp == buf) { - numfullpathfail4++; - free(buf, M_TEMP); - return (ENOMEM); - } - *--bp = '/'; - slash_prefixed = 1; - vp = ncp->nc_dvp; - } - if (!slash_prefixed) { - if (bp == buf) { - numfullpathfail4++; - free(buf, M_TEMP); - return (ENOMEM); - } - *--bp = '/'; - } - numfullpathfound++; - *retbuf = bp; - *retfreebuf = buf; - return (0); -} diff --git a/sys/fs/procfs/procfs_vnops.c b/sys/fs/procfs/procfs_vnops.c index 8c7ff20..0d72522 100644 --- a/sys/fs/procfs/procfs_vnops.c +++ b/sys/fs/procfs/procfs_vnops.c @@ -534,7 +534,7 @@ procfs_getattr(ap) case Pfile: { char *fullpath, *freepath; - error = procfs_fullpath(procp, &fullpath, &freepath); + error = textvp_fullpath(procp, &fullpath, &freepath); if (error == 0) { vap->va_size = strlen(fullpath); free(freepath, M_TEMP); @@ -968,7 +968,7 @@ procfs_readlink(ap) return (uiomove("unknown", sizeof("unknown") - 1, ap->a_uio)); } - error = procfs_fullpath(procp, &fullpath, &freepath); + error = textvp_fullpath(procp, &fullpath, &freepath); if (error != 0) return (uiomove("unknown", sizeof("unknown") - 1, ap->a_uio)); -- cgit v1.1