diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 9087183602e4..f1a2eeabc02f 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5291,6 +5291,25 @@ 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) { + kmem_cache_free(ext4_pspace_cachep, pa); + ac->ac_pa = NULL; + + ac->ac_b_ex.fe_logical = ac->ac_o_ex.fe_logical; + ac->ac_b_ex.fe_len = ac->ac_o_ex.fe_len; + 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);