struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
        int bsbits = ac->ac_sb->s_blocksize_bits;
        loff_t size, isize;
+       bool inode_pa_eligible, group_pa_eligible;
 
        if (!(ac->ac_flags & EXT4_MB_HINT_DATA))
                return;
        if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY))
                return;
 
+       group_pa_eligible = sbi->s_mb_group_prealloc > 0;
+       inode_pa_eligible = true;
        size = ac->ac_o_ex.fe_logical + EXT4_C2B(sbi, ac->ac_o_ex.fe_len);
        isize = (i_size_read(ac->ac_inode) + ac->ac_sb->s_blocksize - 1)
                >> bsbits;
 
+       /* No point in using inode preallocation for closed files */
        if ((size == isize) && !ext4_fs_is_busy(sbi) &&
-           !inode_is_open_for_write(ac->ac_inode)) {
-               ac->ac_flags |= EXT4_MB_HINT_NOPREALLOC;
-               return;
-       }
+           !inode_is_open_for_write(ac->ac_inode))
+               inode_pa_eligible = false;
 
-       if (sbi->s_mb_group_prealloc <= 0) {
-               ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
-               return;
-       }
-
-       /* don't use group allocation for large files */
        size = max(size, isize);
-       if (size > sbi->s_mb_stream_request) {
-               ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
+       /* Don't use group allocation for large files */
+       if (size > sbi->s_mb_stream_request)
+               group_pa_eligible = false;
+
+       if (!group_pa_eligible) {
+               if (inode_pa_eligible)
+                       ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
+               else
+                       ac->ac_flags |= EXT4_MB_HINT_NOPREALLOC;
                return;
        }