From 4a6a53db5d0c2f9d223999533572dc7a2d62942d Mon Sep 17 00:00:00 2001 From: David Howells Date: Sat, 28 Oct 2006 10:38:46 -0700 Subject: [PATCH] --- yaml --- r: 40406 b: refs/heads/master c: f87135762de4328c6f17897e803e6909bc056feb h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/dcache.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 9973d8d88487..37de77195231 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6eac3f93f5e6b7256fb20b7608d62ec192da12be +refs/heads/master: f87135762de4328c6f17897e803e6909bc056feb diff --git a/trunk/fs/dcache.c b/trunk/fs/dcache.c index a5b76b647c6d..fd4a428998ef 100644 --- a/trunk/fs/dcache.c +++ b/trunk/fs/dcache.c @@ -557,6 +557,7 @@ void shrink_dcache_sb(struct super_block * sb) static void shrink_dcache_for_umount_subtree(struct dentry *dentry) { struct dentry *parent; + unsigned detached = 0; BUG_ON(!IS_ROOT(dentry)); @@ -621,7 +622,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) atomic_dec(&parent->d_count); list_del(&dentry->d_u.d_child); - dentry_stat.nr_dentry--; /* For d_free, below */ + detached++; inode = dentry->d_inode; if (inode) { @@ -639,7 +640,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) * otherwise we ascend to the parent and move to the * next sibling if there is one */ if (!parent) - return; + goto out; dentry = parent; @@ -648,6 +649,11 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) dentry = list_entry(dentry->d_subdirs.next, struct dentry, d_u.d_child); } +out: + /* several dentries were freed, need to correct nr_dentry */ + spin_lock(&dcache_lock); + dentry_stat.nr_dentry -= detached; + spin_unlock(&dcache_lock); } /*