diff options
Diffstat (limited to 'fs/ext4/mballoc.c')
| -rw-r--r-- | fs/ext4/mballoc.c | 26 | 
1 files changed, 17 insertions, 9 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 9f86dd947032..67ac95c4cd9b 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5753,7 +5753,8 @@ static ext4_fsblk_t ext4_mb_new_blocks_simple(handle_t *handle,  	struct super_block *sb = ar->inode->i_sb;  	ext4_group_t group;  	ext4_grpblk_t blkoff; -	int i = sb->s_blocksize; +	ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); +	ext4_grpblk_t i = 0;  	ext4_fsblk_t goal, block;  	struct ext4_super_block *es = EXT4_SB(sb)->s_es; @@ -5775,19 +5776,26 @@ static ext4_fsblk_t ext4_mb_new_blocks_simple(handle_t *handle,  		ext4_get_group_no_and_offset(sb,  			max(ext4_group_first_block_no(sb, group), goal),  			NULL, &blkoff); -		i = mb_find_next_zero_bit(bitmap_bh->b_data, sb->s_blocksize, +		while (1) { +			i = mb_find_next_zero_bit(bitmap_bh->b_data, max,  						blkoff); +			if (i >= max) +				break; +			if (ext4_fc_replay_check_excluded(sb, +				ext4_group_first_block_no(sb, group) + i)) { +				blkoff = i + 1; +			} else +				break; +		}  		brelse(bitmap_bh); -		if (i >= sb->s_blocksize) -			continue; -		if (ext4_fc_replay_check_excluded(sb, -			ext4_group_first_block_no(sb, group) + i)) -			continue; -		break; +		if (i < max) +			break;  	} -	if (group >= ext4_get_groups_count(sb) && i >= sb->s_blocksize) +	if (group >= ext4_get_groups_count(sb) || i >= max) { +		*errp = -ENOSPC;  		return 0; +	}  	block = ext4_group_first_block_no(sb, group) + i;  	ext4_mb_mark_bb(sb, block, 1, 1);  | 
