Commit 63b999685cb372e24eb73f255cd73547026370fd

Authored by Theodore Ts'o
1 parent 76828c8826

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

... ... @@ -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  
... ... @@ -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));