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 <ebiggers@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Jan Kara <jack@suse.cz>
This commit is contained in:
Родитель
4db0d88e2e
Коммит
918b7306ed
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче