summaryrefslogtreecommitdiffstats
path: root/fs/dcache.c
diff options
context:
space:
mode:
authorWaiman Long <longman@redhat.com>2019-01-30 13:52:36 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2019-01-30 14:02:11 -0500
commit1dbd449c9943e3145148cc893c2461b72ba6fef0 (patch)
tree77e131da335779311538ba4f7325190db2ec0ea0 /fs/dcache.c
parent1c0490ce902206f4685f812fa81304fd1adf4e35 (diff)
fs/dcache: Fix incorrect nr_dentry_unused accounting in shrink_dcache_sb()
The nr_dentry_unused per-cpu counter tracks dentries in both the LRU lists and the shrink lists where the DCACHE_LRU_LIST bit is set. The shrink_dcache_sb() function moves dentries from the LRU list to a shrink list and subtracts the dentry count from nr_dentry_unused. This is incorrect as the nr_dentry_unused count will also be decremented in shrink_dentry_list() via d_shrink_del(). To fix this double decrement, the decrement in the shrink_dcache_sb() function is taken out. Fixes: 4e717f5c1083 ("list_lru: remove special case function list_lru_dispose_all." Cc: stable@kernel.org Signed-off-by: Waiman Long <longman@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r--fs/dcache.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 2593153471cf..44e5652b2664 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1188,15 +1188,11 @@ static enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
1188 */ 1188 */
1189void shrink_dcache_sb(struct super_block *sb) 1189void shrink_dcache_sb(struct super_block *sb)
1190{ 1190{
1191 long freed;
1192
1193 do { 1191 do {
1194 LIST_HEAD(dispose); 1192 LIST_HEAD(dispose);
1195 1193
1196 freed = list_lru_walk(&sb->s_dentry_lru, 1194 list_lru_walk(&sb->s_dentry_lru,
1197 dentry_lru_isolate_shrink, &dispose, 1024); 1195 dentry_lru_isolate_shrink, &dispose, 1024);
1198
1199 this_cpu_sub(nr_dentry_unused, freed);
1200 shrink_dentry_list(&dispose); 1196 shrink_dentry_list(&dispose);
1201 } while (list_lru_count(&sb->s_dentry_lru) > 0); 1197 } while (list_lru_count(&sb->s_dentry_lru) > 0);
1202} 1198}