Fix a case that can prevent the vnlru_proc vnode recycler from operating.
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 9 Feb 2005 02:51:04 +0000 (02:51 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 9 Feb 2005 02:51:04 +0000 (02:51 +0000)
commit250d127ca3bd1be6d2d999ed48747985c99b15e0
treec246282b9559a1d937a4c9d54f8f816624aea6ca
parent285332f0e4b23850f3795a80abec6f3d67dc6cb0
Fix a case that can prevent the vnlru_proc vnode recycler from operating.
The vnode recycler is not allowed to recycle 'internal' directory nodes
in the namecache topology.  i.e. if the path A/B/C/D is cached, then the
recycler is not allowed to remove A, B, or C.  The recycler checks
this condition by checking the vnode's v_holdcnt.  The recycler also tries
to recycle vnodes with little or no cached data rather then the vnodes
with a great deal of cached data.

However, the buffer cache now uses v_holdcnt as well.  If the buffer cache
is large enough and maxvnodes is small enough the recycler can wind up not
finding any vnodes to recycle.

The fix is clean out the buffers with the candidate vnode and then make a
final v_holdcnt check.

Reported-by: Gary Allan <dragonfly@gallan.plus.com>
sys/kern/vfs_mount.c