Commit 918b7306 authored by Eric Biggers's avatar Eric Biggers Committed by Theodore Ts'o

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: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
parent 4db0d88e
...@@ -286,7 +286,7 @@ static unsigned long mb_cache_shrink(struct mb_cache *cache, ...@@ -286,7 +286,7 @@ static unsigned long mb_cache_shrink(struct mb_cache *cache,
struct mb_cache_entry, e_list); struct mb_cache_entry, e_list);
if (entry->e_referenced) { if (entry->e_referenced) {
entry->e_referenced = 0; entry->e_referenced = 0;
list_move_tail(&cache->c_list, &entry->e_list); list_move_tail(&entry->e_list, &cache->c_list);
continue; continue;
} }
list_del_init(&entry->e_list); list_del_init(&entry->e_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment