There are only very few filesystems using generic metadata buffer head tracking and everybody is paying the overhead. When we remove this tracking for inode reclaim code .evict will start to see inodes with metadata buffers attached so write them out and prune them. Signed-off-by: Jan Kara --- fs/ext4/inode.c | 4 +++- fs/ext4/super.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 396dc3a5d16b..c2692b9c7123 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -185,7 +185,9 @@ void ext4_evict_inode(struct inode *inode) ext4_evict_ea_inode(inode); if (inode->i_nlink) { truncate_inode_pages_final(&inode->i_data); - + /* Avoid mballoc special inode which has no proper iops */ + if (!EXT4_SB(inode->i_sb)->s_journal) + sync_mapping_buffers(&inode->i_data); goto no_delete; } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 43f680c750ae..ea827b0ecc8d 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1524,7 +1524,8 @@ static void destroy_inodecache(void) void ext4_clear_inode(struct inode *inode) { ext4_fc_del(inode); - invalidate_inode_buffers(inode); + if (!EXT4_SB(inode->i_sb)->s_journal) + invalidate_inode_buffers(inode); clear_inode(inode); ext4_discard_preallocations(inode); ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); -- 2.51.0