Commit 63b999685cb372e24eb73f255cd73547026370fd
1 parent
76828c8826
Exists in
master
and in
20 other branches
ext4: call ext4_es_lru_add() after handling cache miss
If there are no items in the extent status tree, ext4_es_lru_add() is a no-op. So it is not sufficient to call ext4_es_lru_add() before we try to lookup an entry in the extent status tree. We also need to call it at the end of ext4_ext_map_blocks(), after items have been added to the extent status tree. This could lead to inodes with that have extent status trees but which are not in the LRU list, which means they won't get considered for eviction by the es_shrinker. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: Zheng Liu <wenqing.lz@taobao.com> Cc: stable@vger.kernel.org
Showing 2 changed files with 5 additions and 7 deletions Side-by-side Diff
fs/ext4/extents.c
... | ... | @@ -4385,8 +4385,9 @@ |
4385 | 4385 | } |
4386 | 4386 | |
4387 | 4387 | out3: |
4388 | - trace_ext4_ext_map_blocks_exit(inode, flags, map, err ? err : allocated); | |
4389 | - | |
4388 | + trace_ext4_ext_map_blocks_exit(inode, flags, map, | |
4389 | + err ? err : allocated); | |
4390 | + ext4_es_lru_add(inode); | |
4390 | 4391 | return err ? err : allocated; |
4391 | 4392 | } |
4392 | 4393 |
fs/ext4/inode.c
... | ... | @@ -514,10 +514,9 @@ |
514 | 514 | "logical block %lu\n", inode->i_ino, flags, map->m_len, |
515 | 515 | (unsigned long) map->m_lblk); |
516 | 516 | |
517 | - ext4_es_lru_add(inode); | |
518 | - | |
519 | 517 | /* Lookup extent status tree firstly */ |
520 | 518 | if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) { |
519 | + ext4_es_lru_add(inode); | |
521 | 520 | if (ext4_es_is_written(&es) || ext4_es_is_unwritten(&es)) { |
522 | 521 | map->m_pblk = ext4_es_pblock(&es) + |
523 | 522 | map->m_lblk - es.es_lblk; |
524 | 523 | |
... | ... | @@ -1529,11 +1528,9 @@ |
1529 | 1528 | "logical block %lu\n", inode->i_ino, map->m_len, |
1530 | 1529 | (unsigned long) map->m_lblk); |
1531 | 1530 | |
1532 | - ext4_es_lru_add(inode); | |
1533 | - | |
1534 | 1531 | /* Lookup extent status tree firstly */ |
1535 | 1532 | if (ext4_es_lookup_extent(inode, iblock, &es)) { |
1536 | - | |
1533 | + ext4_es_lru_add(inode); | |
1537 | 1534 | if (ext4_es_is_hole(&es)) { |
1538 | 1535 | retval = 0; |
1539 | 1536 | down_read((&EXT4_I(inode)->i_data_sem)); |