git: kernel - namecache - fix deadlock
Matthew Dillon
dillon at crater.dragonflybsd.org
Thu Dec 31 19:34:13 PST 2009
commit 65870584d7f6f8000fd009bdb787409342fbc995
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Thu Dec 31 19:08:48 2009 -0800
kernel - namecache - fix deadlock
* cache_drop() can be called in numerous situations where unrelated
vnode or namecache locks are held, particularly in the
allocfreevnode() path when it calls cache_inval_vp_nonblock().
* If cache_drop() is transitioning a nc_refs from 1 to 0 it will call
cache_zap() to free the (now untracked) ncp. Adjust cache_zap() to
leave the namecache entry alone if a lock on ncp->nc_parent
cannot be acquired, instead of blocking (and potentially deadlocking).
* Add _cache_cleandefered() (part of cache_hysteresis()) to handle
any buildup. It is expensive but the race occurs at a low rate
under moderate load so it should hardly ever have to be run.
Summary of changes:
sys/kern/vfs_cache.c | 136 ++++++++++++++++++++++++++++++++++++++++----------
sys/kern/vfs_mount.c | 2 +-
sys/sys/namecache.h | 4 +-
3 files changed, 113 insertions(+), 29 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/65870584d7f6f8000fd009bdb787409342fbc995
--
DragonFly BSD source repository
More information about the Commits
mailing list