From: Eric Biggers Date: Sat, 3 Dec 2016 20:13:15 +0000 (-0500) Subject: mbcache: correctly handle 'e_referenced' bit X-Git-Tag: v4.10-rc1~130^2~12 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=918b7306edacbcc8a9ca318a5a34d73954e1705d;p=linux.git 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 --- 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);