case 0:
                BUG_ON(ac->ac_2order == 0);
 
-               if (grp->bb_largest_free_order < ac->ac_2order)
-                       return 0;
-
                /* Avoid using the first bg of a flexgroup for data files */
                if ((ac->ac_flags & EXT4_MB_HINT_DATA) &&
                    (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) &&
                    ((group % flex_size) == 0))
                        return 0;
 
+               if ((ac->ac_2order > ac->ac_sb->s_blocksize_bits+1) ||
+                   (free / fragments) >= ac->ac_g_ex.fe_len)
+                       return 1;
+
+               if (grp->bb_largest_free_order < ac->ac_2order)
+                       return 0;
+
                return 1;
        case 1:
                if ((free / fragments) >= ac->ac_g_ex.fe_len)
                        }
 
                        ac->ac_groups_scanned++;
-                       if (cr == 0)
+                       if (cr == 0 && ac->ac_2order < sb->s_blocksize_bits+2)
                                ext4_mb_simple_scan_group(ac, &e4b);
                        else if (cr == 1 && sbi->s_stripe &&
                                        !(ac->ac_g_ex.fe_len % sbi->s_stripe))
        len = ar->len;
 
        /* just a dirty hack to filter too big requests  */
-       if (len >= EXT4_CLUSTERS_PER_GROUP(sb) - 10)
-               len = EXT4_CLUSTERS_PER_GROUP(sb) - 10;
+       if (len >= EXT4_CLUSTERS_PER_GROUP(sb))
+               len = EXT4_CLUSTERS_PER_GROUP(sb);
 
        /* start searching from the goal */
        goal = ar->goal;