|
@@ -1884,15 +1884,19 @@ static int ext4_mb_good_group(struct ext4_allocation_context *ac,
|
|
|
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)
|
|
@@ -2007,7 +2011,7 @@ repeat:
|
|
|
}
|
|
|
|
|
|
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))
|
|
@@ -4005,8 +4009,8 @@ ext4_mb_initialize_context(struct ext4_allocation_context *ac,
|
|
|
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;
|