Unverified Commit f1527444 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!4861 ext4: regenerate buddy after block freeing failed if under fc replay

parents 84f30849 f0c411a3
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -822,6 +822,24 @@ void ext4_mb_generate_buddy(struct super_block *sb,
	atomic64_add(period, &sbi->s_mb_generation_time);
}

static void mb_regenerate_buddy(struct ext4_buddy *e4b)
{
	int count;
	int order = 1;
	void *buddy;

	while ((buddy = mb_find_buddy(e4b, order++, &count)))
		ext4_set_bits(buddy, 0, count);

	e4b->bd_info->bb_fragments = 0;
	memset(e4b->bd_info->bb_counters, 0,
		sizeof(*e4b->bd_info->bb_counters) *
		(e4b->bd_sb->s_blocksize_bits + 2));

	ext4_mb_generate_buddy(e4b->bd_sb, e4b->bd_buddy,
		e4b->bd_bitmap, e4b->bd_group, e4b->bd_info);
}

/* The buddy information is attached the buddy cache inode
 * for convenience. The information regarding each group
 * is loaded via ext4_mb_load_buddy. The information involve
@@ -1504,6 +1522,8 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b,
			ext4_mark_group_bitmap_corrupted(
				sb, e4b->bd_group,
				EXT4_GROUP_INFO_BBITMAP_CORRUPT);
		} else {
			mb_regenerate_buddy(e4b);
		}
		goto done;
	}