Before determining that the goal length is a multiple of the stripe size, check CR_GOAL_LEN_FAST and CR_BEST_AVAIL_LEN first. Fixes: 1f6bc02f1848 ("ext4: fallback to complex scan if aligned scan doesn't work") Reported-by: syzbot+1ad8bac5af24d01e2cbd@xxxxxxxxxxxxxxxxxxxxxxxxx #syz test: upstream ee9a43b7cfe2 diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 9dda9cd68ab2..451f92cde461 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -2928,13 +2928,12 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) if (cr == CR_POWER2_ALIGNED) ext4_mb_simple_scan_group(ac, &e4b); else { - bool is_stripe_aligned = sbi->s_stripe && + bool is_stripe_aligned = (cr == CR_GOAL_LEN_FAST || + cr == CR_BEST_AVAIL_LEN) && sbi->s_stripe && !(ac->ac_g_ex.fe_len % EXT4_B2C(sbi, sbi->s_stripe)); - if ((cr == CR_GOAL_LEN_FAST || - cr == CR_BEST_AVAIL_LEN) && - is_stripe_aligned) + if (is_stripe_aligned) ext4_mb_scan_aligned(ac, &e4b); if (ac->ac_status == AC_STATUS_CONTINUE)