diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 9087183602e4..65318ab8112d 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5291,6 +5291,36 @@ 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; + + printk(KERN_ERR "EXT4-DBG: Inode %lu Check. Cluster=%u\n", + ac->ac_inode->i_ino, sbi->s_cluster_ratio); + printk(KERN_ERR "EXT4-DBG: Goal Start: %u, Aligned Try: %lld\n", + ac->ac_g_ex.fe_logical, aligned_start); + if (aligned_start < ac->ac_g_ex.fe_logical) { + printk(KERN_ERR "EXT4-DBG: !!! COLLISION !!! Aligned < Goal. Aborting PA.\n"); + 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; + printk(KERN_ERR "EXT4-DBG: Fallback applied. Returning Original: Start=%u Len=%u\n", + ac->ac_b_ex.fe_logical, ac->ac_b_ex.fe_len); + return; + } + printk(KERN_ERR "EXT4-DBG: No Collision. Aligning...\n"); + printk(KERN_ERR "EXT4-DBG: Before: Start=%u Len=%u\n", ex.fe_logical, ex.fe_len); + ex.fe_len += (ex.fe_logical - aligned_start); + ex.fe_logical = aligned_start; + + if (ex.fe_logical + ex.fe_len > orig_goal_end) { + printk(KERN_ERR "EXT4-DBG: Clamping Length to Goal End.\n"); + ex.fe_len = orig_goal_end - ex.fe_logical; + } + printk(KERN_ERR "EXT4-DBG: After : Start=%u Len=%u\n", ex.fe_logical, ex.fe_len); + } ac->ac_b_ex.fe_logical = ex.fe_logical; BUG_ON(ac->ac_o_ex.fe_logical < ac->ac_b_ex.fe_logical);