diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 9087183602e4..9784f4cd3a5f 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5291,6 +5291,20 @@ ext4_mb_new_inode_pa(struct ext4_allocation_context *ac) ex.fe_logical = ac->ac_o_ex.fe_logical; adjust_bex: + if (sbi->s_cluster_ratio > 1) { + loff_t mask = ~(sbi->s_cluster_ratio - 1); + loff_t aligned_start = ex.fe_logical & mask; + + if (aligned_start < ac->ac_g_ex.fe_logical) { + ac->ac_status = AC_STATUS_BREAK; + return; + } + ex.fe_len += (ex.fe_logical - aligned_start); + ex.fe_logical = aligned_start; + + if (ex.fe_logical + ex.fe_len > orig_goal_end) + ex.fe_len = orig_goal_end - ex.fe_logical; + } ac->ac_b_ex.fe_logical = ex.fe_logical; BUG_ON(ac->ac_o_ex.fe_logical < ac->ac_b_ex.fe_logical);