See comments in ext4_free_clusters_after_init:
/* Return the number of free blocks in a block group. It is used when
* the block bitmap is uninitialized, so we can't just count the bits
* in the bitmap. */
So extra check we enhanced here is wrong if this block group
bitmap is uninitialized, since we only check bitmaps here.
Further, Looking at EXT4_BG_BLOCK_UNINIT clear codes, Kernel
will reinit free_clusters_count when tried to clear the flag, so
extra check for uninited block bitmaps dosen't make much sense.
Let's skip uninited block bitmap check if EXT4_BG_BLOCK_UNINIT
is set, whatever free count group desc recorded is untrustable somehow
Change-Id: I845f2e0e17e53b7e3073399bd8b0a85e3db66ef8
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Reviewed-on: https://review.whamcloud.com/31720
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
+ unsigned short i, first, free = 0;
+ unsigned short free_in_gdp = ext4_free_blks_count(sb, gdp);
+
+ 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))
++ if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ unsigned short i, first, free = 0;
+ unsigned short free_in_gdp = ext4_free_group_clusters(sb, gdp);
+
+ 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))
++ if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ unsigned short i, first, free = 0;
+ unsigned short free_in_gdp = ext4_free_blks_count(sb, gdp);
+
+ 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))
++ if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ unsigned short i, first, free = 0;
+ unsigned short free_in_gdp = ext4_free_group_clusters(sb, gdp);
+
+ 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))
++ if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ unsigned short i, first, free = 0;
+ unsigned short free_in_gdp = ext4_free_group_clusters(sb, gdp);
+
+ 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))
++ if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);
+ return 0;
+
+ i = mb_find_next_zero_bit(bitmap, max, 0);