diff options
author | dillon <dillon@FreeBSD.org> | 2001-12-19 23:58:09 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2001-12-19 23:58:09 +0000 |
commit | 904bfa6fcee7c2c29977854c568a85874a781855 (patch) | |
tree | 8f5cdcce47814a8ae5ad5c7a7b5a8466c7b755be /sys/fs/pseudofs/pseudofs_vnops.c | |
parent | 6200d265d7e3baf9994c84a7aaaf71334dd74939 (diff) | |
download | FreeBSD-src-904bfa6fcee7c2c29977854c568a85874a781855.zip FreeBSD-src-904bfa6fcee7c2c29977854c568a85874a781855.tar.gz |
Pseudofs was leaking VFS cache entries badly due to its cache and use of
the wrong VOP descriptor. This misuse caused VFS-cached vnodes to be
re-cached, resulting in the leak. This commit is an interim fix until DES
has a chance to rework the code involved.
Diffstat (limited to 'sys/fs/pseudofs/pseudofs_vnops.c')
-rw-r--r-- | sys/fs/pseudofs/pseudofs_vnops.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c index e7741b8..769ff30 100644 --- a/sys/fs/pseudofs/pseudofs_vnops.c +++ b/sys/fs/pseudofs/pseudofs_vnops.c @@ -293,6 +293,15 @@ pfs_getextattr(struct vop_getextattr_args *va) /* * Look up a file or directory + * + * XXX NOTE! pfs_lookup() has been hooked into vop_lookup_desc! This + * will result in a lookup operation for a vnode which may already be + * cached, therefore we have to be careful to purge the VFS cache when + * reusing a vnode. + * + * This code will work, but is not really correct. Normally we would hook + * vfs_cache_lookup() into vop_lookup_desc and hook pfs_lookup() into + * vop_cachedlookup_desc. */ static int pfs_lookup(struct vop_lookup_args *va) @@ -385,6 +394,9 @@ pfs_lookup(struct vop_lookup_args *va) error = pfs_vncache_alloc(vn->v_mount, vpp, pn, pid); if (error) PFS_RETURN (error); + /* + * XXX See comment at top of the routine. + */ if (cnp->cn_flags & MAKEENTRY) cache_enter(vn, *vpp, cnp); PFS_RETURN (0); @@ -693,7 +705,7 @@ static int pfs_reclaim(struct vop_reclaim_args *va) { PFS_TRACE((((struct pfs_vdata *)va->a_vp->v_data)->pvd_pn->pn_name)); - + return (pfs_vncache_free(va->a_vp)); } |