From de8e3749bfc54556c3b9a40534fc2d3309ec84e6 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 00:26:07 -0700 Subject: [PATCH] [PATCH] dentry_stat accounting fix From: Maneesh Soni This patch the corrects the dentry_stat.nr_unused calculation. In select_parent() and shrink_dcache_anon() we were not doing any adjustments to the nr_unused count after manipulating the dentry_unused list. Now the nr_unused count is decremented if the dentry is on dentry_unused list and is removed from there. Further in the same routines, we have to adjust the nr_unused count again if the dentry is moved to the end of d_lru list for pruning. --- fs/dcache.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index efc51c38ea25d..59480fedd61ab 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -538,13 +538,18 @@ resume: struct list_head *tmp = next; struct dentry *dentry = list_entry(tmp, struct dentry, d_child); next = tmp->next; - list_del_init(&dentry->d_lru); - /* don't add non zero d_count dentries - * back to d_lru list + if (!list_empty(&dentry->d_lru)) { + dentry_stat.nr_unused--; + list_del_init(&dentry->d_lru); + } + /* + * move only zero ref count dentries to the end + * of the unused list for prune_dcache */ if (!atomic_read(&dentry->d_count)) { list_add(&dentry->d_lru, dentry_unused.prev); + dentry_stat.nr_unused++; found++; } /* @@ -609,13 +614,18 @@ void shrink_dcache_anon(struct hlist_head *head) spin_lock(&dcache_lock); hlist_for_each(lp, head) { struct dentry *this = hlist_entry(lp, struct dentry, d_hash); - list_del(&this->d_lru); + if (!list_empty(&this->d_lru)) { + dentry_stat.nr_unused--; + list_del(&this->d_lru); + } - /* don't add non zero d_count dentries - * back to d_lru list + /* + * move only zero ref count dentries to the end + * of the unused list for prune_dcache */ if (!atomic_read(&this->d_count)) { list_add_tail(&this->d_lru, &dentry_unused); + dentry_stat.nr_unused++; found++; } } -- 2.53.0