Really easy to reproduce. ls -lR /proc vmstat -m | fgrep vfscache ls -lR /proc vmstat -m | fgrep vfscache ls -lR /proc vmstat -m | fgrep vfscache
The pseudofs code is using the wrong VOP descriptor, but I'll let DES fix it when he gets back. In the mean time I have added appropriate comments and cache_purge() calls and committed the interim fix to -current. I also adding a missing cache_purge() call to the reclaim code which is required to be there regardless of the VOP descriptor issue. Josef, I believe that this plus the last patch, both of which are now in -current, will solve your problem. Note: cvsup repositories may not have been updated as of the time of this posting. -Matt Index: fs/pseudofs//pseudofs_vncache.c =================================================================== RCS file: /home/ncvs/src/sys/fs/pseudofs/pseudofs_vncache.c,v retrieving revision 1.9 diff -u -r1.9 pseudofs_vncache.c --- fs/pseudofs//pseudofs_vncache.c 3 Nov 2001 03:07:09 -0000 1.9 +++ fs/pseudofs//pseudofs_vncache.c 19 Dec 2001 23:49:48 -0000 @@ -105,9 +105,11 @@ { struct pfs_vdata *pvd; int error; - - /* see if the vnode is in the cache */ - /* XXX linear search... not very efficient */ + + /* + * See if the vnode is in the cache. + * XXX linear search is not very efficient. + */ mtx_lock(&pfs_vncache_mutex); for (pvd = pfs_vncache; pvd; pvd = pvd->pvd_next) { if (pvd->pvd_pn == pn && pvd->pvd_pid == pid) { @@ -115,6 +117,8 @@ ++pfs_vncache_hits; *vpp = pvd->pvd_vnode; mtx_unlock(&pfs_vncache_mutex); + /* XXX see comment at top of pfs_lookup() */ + cache_purge(*vpp); return (0); } /* XXX if this can happen, we're in trouble */ @@ -176,6 +180,8 @@ pfs_vncache_free(struct vnode *vp) { struct pfs_vdata *pvd; + + cache_purge(vp); mtx_lock(&pfs_vncache_mutex); pvd = (struct pfs_vdata *)vp->v_data; Index: fs/pseudofs//pseudofs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/fs/pseudofs/pseudofs_vnops.c,v retrieving revision 1.20 diff -u -r1.20 pseudofs_vnops.c --- fs/pseudofs//pseudofs_vnops.c 11 Dec 2001 20:48:20 -0000 1.20 +++ fs/pseudofs//pseudofs_vnops.c 19 Dec 2001 23:52:06 -0000 @@ -293,6 +293,15 @@ /* * 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 @@ 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 @@ 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)); } To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-current" in the body of the message