When initializes (reformat) the filesystem, the number of
free blocks in the group descriptor is calculated via the
ext2fs_reserve_super_and_bgd() (e2fsprogs). As commented
in such function: "This is not necessarily the case when
the flex_bg feature is enabled, so callers should take care!".
So it is normal that we may find the block group descriptor
that has LDISKFS_BG_BLOCK_UNINIT flag but with 0 free blocks.
The ldiskfs_mb_check_ondisk_bitmap() should NOT report error
for such block group, instead, skip the check directly.
Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: Iba0fb2bf0632a6e54222472bc724a8ea0478e9ae
Reviewed-on: https://review.whamcloud.com/28566
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
+{
+ unsigned short max = EXT4_BLOCKS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
+{
+ unsigned short max = EXT4_BLOCKS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
++ unsigned short free_in_gdp = ext4_free_blks_count(sb, gdp);
++
++ if (free_in_gdp == 0 && gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
++ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
-+ if (free != ext4_free_blks_count(sb, gdp)) {
++ if (free != free_in_gdp) {
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
-+ group, free, ext4_free_blks_count(sb, gdp));
++ group, free, free_in_gdp);
+ return -EIO;
+ }
+ return 0;
+ return -EIO;
+ }
+ return 0;
@@ -3382,9 +3401,10 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
@@ -3382,9 +3401,10 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
- if (free != ext4_free_blks_count(sb, gdp)) {
+ if (free != free_in_gdp) {
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
-- group, free, ext4_free_blks_count(sb, gdp));
+- group, free, free_in_gdp);
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
-+ group, free, ext4_free_blks_count(sb, gdp));
++ group, free, free_in_gdp);
@@ -3598,9 +3607,11 @@ int ext4_mb_check_ondisk_bitmap(struct s
}
@@ -3598,9 +3607,11 @@ int ext4_mb_check_ondisk_bitmap(struct s
}
- if (free != ext4_free_group_clusters(sb, gdp)) {
+ if (free != free_in_gdp) {
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
-- group, free, ext4_free_group_clusters(sb, gdp));
+- group, free, free_in_gdp);
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
-+ ext4_free_group_clusters(sb, gdp));
@@ -3599,9 +3608,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
@@ -3599,9 +3608,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
- if (free != ext4_free_group_clusters(sb, gdp)) {
+ if (free != free_in_gdp) {
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
-- group, free, ext4_free_group_clusters(sb, gdp));
+- group, free, free_in_gdp);
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
-+ ext4_free_group_clusters(sb, gdp));
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
-@@ -3507,22 +3517,67 @@ static void ext4_mb_generate_from_freeli
+@@ -3507,22 +3517,71 @@ static void ext4_mb_generate_from_freeli
+{
+ unsigned short max = EXT4_CLUSTERS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
+{
+ unsigned short max = EXT4_CLUSTERS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
++ unsigned short free_in_gdp = ext4_free_group_clusters(sb, gdp);
++
++ if (free_in_gdp == 0 && gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
++ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
-+ if (free != ext4_free_group_clusters(sb, gdp)) {
++ if (free != free_in_gdp) {
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
-+ group, free, ext4_free_group_clusters(sb, gdp));
++ group, free, free_in_gdp);
+ return -EIO;
+ }
+ return 0;
+ return -EIO;
+ }
+ return 0;
@@ -3458,9 +3471,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
@@ -3458,9 +3471,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
- if (free != ext4_free_blks_count(sb, gdp)) {
+ if (free != free_in_gdp) {
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
-- group, free, ext4_free_blks_count(sb, gdp));
+- group, free, free_in_gdp);
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
-+ ext4_free_blks_count(sb, gdp));
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
-@@ -3417,23 +3434,68 @@ static void ext4_mb_generate_from_freeli
+@@ -3417,23 +3434,72 @@ static void ext4_mb_generate_from_freeli
+{
+ unsigned short max = EXT4_BLOCKS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
+{
+ unsigned short max = EXT4_BLOCKS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
++ unsigned short free_in_gdp = ext4_free_blks_count(sb, gdp);
++
++ if (free_in_gdp == 0 && gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
++ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
-+ if (free != ext4_free_blks_count(sb, gdp)) {
++ if (free != free_in_gdp) {
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
-+ group, free, ext4_free_blks_count(sb, gdp));
++ group, free, free_in_gdp);
+ return -EIO;
+ }
+ return 0;
+ return -EIO;
+ }
+ return 0;
@@ -3599,9 +3608,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
@@ -3599,9 +3608,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
}
- if (free != ext4_free_group_clusters(sb, gdp)) {
+ if (free != free_in_gdp) {
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
- ext4_error(sb, "on-disk bitmap for group %d"
- "corrupted: %u blocks free in bitmap, %u - in gd\n",
-- group, free, ext4_free_group_clusters(sb, gdp));
+- group, free, free_in_gdp);
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
+ ext4_corrupted_block_group(sb, group,
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT,
+ "on-disk bitmap for group %d corrupted: %u blocks free in bitmap, %u - in gd\n",
+ group, free,
-+ ext4_free_group_clusters(sb, gdp));
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
for (i = 0; i <= 13; i++)
seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ?
sg.info.bb_counters[i] : 0);
-@@ -3507,22 +3517,67 @@ static void ext4_mb_generate_from_freeli
+@@ -3507,22 +3517,71 @@ static void ext4_mb_generate_from_freeli
+{
+ unsigned short max = EXT4_CLUSTERS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
+{
+ unsigned short max = EXT4_CLUSTERS_PER_GROUP(sb);
+ unsigned short i, first, free = 0;
++ unsigned short free_in_gdp = ext4_free_group_clusters(sb, gdp);
++
++ if (free_in_gdp == 0 && gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
++ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
+ i = mb_find_next_zero_bit(bitmap, max, i);
+ }
+
-+ if (free != ext4_free_group_clusters(sb, gdp)) {
++ if (free != free_in_gdp) {
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
+ ext4_error(sb, "on-disk bitmap for group %d"
+ "corrupted: %u blocks free in bitmap, %u - in gd\n",
-+ group, free, ext4_free_group_clusters(sb, gdp));
++ group, free, free_in_gdp);
+ return -EIO;
+ }
+ return 0;
+ return -EIO;
+ }
+ return 0;