Fix a cache_resolve() vs cache_inval() race which can result in a livelock.
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 12 Feb 2005 18:56:47 +0000 (18:56 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 12 Feb 2005 18:56:47 +0000 (18:56 +0000)
commit25cb3304ecee13cdd696e3ef9e37db807bc83ea5
treea9233d8fc679f2d33c85e2261d6dbde931df3449
parent4dbb2acae6b384fddf02ba89ef587cbec1d5ba8c
Fix a cache_resolve() vs cache_inval() race which can result in a livelock.
The namecache invalidation code was being a bit overzealous when asked to
invalidate a subhierarchy.  It was retrying until the subhierarchy was
completely invalidated, re-invalidating new entries created after the initial
call to cache_inval().  This can occur if the filesystem is heavily loaded
and a high level directory is being recursively invalidated.

It is unnecessary to retry in this case... the purpose is to invalidate
as-of the call to cache_inval(), so it is acceptable to allow new entries
to be resolved within the subhierarchy undergoing the invalidation.

Certain higher level entities... rename, and vnode reclamation, require
complete invalidation.  The retry has been moved to a higher level for
these entities.  The basic cache_inval() code is now single-pass.

Reported-by: Richard Nyberg <rnyberg@it.su.se>
sys/kern/vfs_cache.c
sys/kern/vfs_subr.c
sys/sys/namecache.h