From 918b7306edacbcc8a9ca318a5a34d73954e1705d Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 3 Dec 2016 15:13:15 -0500 Subject: mbcache: correctly handle 'e_referenced' bit mbcache entries have an 'e_referenced' bit which users can set with mb_cache_entry_touch() to indicate that an entry should be given another pass through the LRU list before the shrinker can delete it. However, mb_cache_shrink() actually would, when seeing an e_referenced entry at the front of the list (the least-recently used end), place it right at the front of the list again. The next iteration would then remove the entry from the list and delete it. Consequently, e_referenced had essentially no effect, so ext2/ext4 xattr blocks would sometimes not be reused as often as expected. Fix this by making the shrinker move e_referenced entries to the back of the list rather than the front. Signed-off-by: Eric Biggers Signed-off-by: Theodore Ts'o Reviewed-by: Jan Kara --- fs/mbcache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/mbcache.c') diff --git a/fs/mbcache.c b/fs/mbcache.c index c5bd19ffa326..31e54c25d16f 100644 --- a/fs/mbcache.c +++ b/fs/mbcache.c @@ -286,7 +286,7 @@ static unsigned long mb_cache_shrink(struct mb_cache *cache, struct mb_cache_entry, e_list); if (entry->e_referenced) { entry->e_referenced = 0; - list_move_tail(&cache->c_list, &entry->e_list); + list_move_tail(&entry->e_list, &cache->c_list); continue; } list_del_init(&entry->e_list); -- cgit v1.2.1