summaryrefslogtreecommitdiff
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c38
1 files changed, 10 insertions, 28 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index a566469ae07a..7510fce3d0f0 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -5148,41 +5148,23 @@ error:
return -EFSCORRUPTED;
}
-static bool ext4_should_enable_large_folio(struct inode *inode)
+void ext4_set_inode_mapping_order(struct inode *inode)
{
struct super_block *sb = inode->i_sb;
+ u16 min_order, max_order;
- if (!S_ISREG(inode->i_mode))
- return false;
- if (ext4_has_feature_encrypt(sb))
- return false;
-
- return true;
-}
-
-/*
- * Limit the maximum folio order to 2048 blocks to prevent overestimation
- * of reserve handle credits during the folio writeback in environments
- * where the PAGE_SIZE exceeds 4KB.
- */
-#define EXT4_MAX_PAGECACHE_ORDER(i) \
- umin(MAX_PAGECACHE_ORDER, (11 + (i)->i_blkbits - PAGE_SHIFT))
-void ext4_set_inode_mapping_order(struct inode *inode)
-{
- u32 max_order;
+ max_order = EXT4_SB(sb)->s_max_folio_order;
+ if (!max_order)
+ return;
- if (!ext4_should_enable_large_folio(inode))
+ min_order = EXT4_SB(sb)->s_min_folio_order;
+ if (!min_order && !S_ISREG(inode->i_mode))
return;
- if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA ||
- ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
- max_order = EXT4_SB(inode->i_sb)->s_min_folio_order;
- else
- max_order = EXT4_MAX_PAGECACHE_ORDER(inode);
+ if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
+ max_order = min_order;
- mapping_set_folio_order_range(inode->i_mapping,
- EXT4_SB(inode->i_sb)->s_min_folio_order,
- max_order);
+ mapping_set_folio_order_range(inode->i_mapping, min_order, max_order);
}
struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,