diff options
author | green <green@FreeBSD.org> | 2000-04-26 11:57:45 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 2000-04-26 11:57:45 +0000 |
commit | 6bad412525aca72f3c4b4d706db249c402952055 (patch) | |
tree | cc8b18ca8a121d2db24fa3bdfc4f4d04970aaba6 /sys | |
parent | 9bef7c0136ba2ed59a50715ad48c304dc5ebdfb1 (diff) | |
download | FreeBSD-src-6bad412525aca72f3c4b4d706db249c402952055.zip FreeBSD-src-6bad412525aca72f3c4b4d706db249c402952055.tar.gz |
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
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/procfs/procfs.h | 1 | ||||
-rw-r--r-- | sys/fs/procfs/procfs_subr.c | 96 | ||||
-rw-r--r-- | sys/fs/procfs/procfs_vnops.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_cache.c | 110 | ||||
-rw-r--r-- | sys/miscfs/procfs/procfs.h | 1 | ||||
-rw-r--r-- | sys/miscfs/procfs/procfs_subr.c | 96 | ||||
-rw-r--r-- | sys/miscfs/procfs/procfs_vnops.c | 4 | ||||
-rw-r--r-- | sys/sys/vnode.h | 20 |
8 files changed, 116 insertions, 216 deletions
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)); diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index f9d3e13..99e0821 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -50,6 +50,22 @@ #include <sys/filedesc.h> /* + * This structure describes the elements in the cache of recent + * names looked up by namei. + */ + +struct namecache { + LIST_ENTRY(namecache) nc_hash; /* hash chain */ + LIST_ENTRY(namecache) nc_src; /* source vnode list */ + TAILQ_ENTRY(namecache) nc_dst; /* destination vnode list */ + struct vnode *nc_dvp; /* vnode of parent of name */ + struct vnode *nc_vp; /* vnode the name refers to */ + u_char nc_flag; /* flag bits */ + u_char nc_nlen; /* length of name */ + char nc_name[0]; /* segment name */ +}; + +/* * Name caching works as follows: * * Names found by directory scans are retained in a cache @@ -571,3 +587,97 @@ __getcwd(p, uap) return (error); } +/* + * Thus begins the fullpath magic. + */ + +#undef STATNODE +#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 +textvp_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/miscfs/procfs/procfs.h b/sys/miscfs/procfs/procfs.h index ebeea31..f000026 100644 --- a/sys/miscfs/procfs/procfs.h +++ b/sys/miscfs/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/miscfs/procfs/procfs_subr.c b/sys/miscfs/procfs/procfs_subr.c index 053a620..c86c6c8 100644 --- a/sys/miscfs/procfs/procfs_subr.c +++ b/sys/miscfs/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/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index 8c7ff20..0d72522 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/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)); diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 38cddb9..4938dca 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -74,24 +74,7 @@ enum vtagtype { TAILQ_HEAD(buflists, buf); typedef int vop_t __P((void *)); - -/* - * This structure describes the elements in the cache of recent - * names looked up by namei. - */ - -struct vnode; - -struct namecache { - LIST_ENTRY(namecache) nc_hash; /* hash chain */ - LIST_ENTRY(namecache) nc_src; /* source vnode list */ - TAILQ_ENTRY(namecache) nc_dst; /* destination vnode list */ - struct vnode *nc_dvp; /* vnode of parent of name */ - struct vnode *nc_vp; /* vnode the name refers to */ - u_char nc_flag; /* flag bits */ - u_char nc_nlen; /* length of name */ - char nc_name[0]; /* segment name */ -}; +struct namecache; /* * Reading or writing any of these items requires holding the appropriate lock. @@ -567,6 +550,7 @@ int getnewvnode __P((enum vtagtype tag, int lease_check __P((struct vop_lease_args *ap)); int spec_vnoperate __P((struct vop_generic_args *)); int speedup_syncer __P((void)); +int textvp_fullpath __P((struct proc *p, char **retbuf, char **retfreebuf)); void vattr_null __P((struct vattr *vap)); int vcount __P((struct vnode *vp)); void vdrop __P((struct vnode *)); |