struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct ext4_group_info *grp = ext4_get_group_info(sb, group);
        struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL);
+       int ret;
 
-       if ((flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) &&
-           !EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) {
-               percpu_counter_sub(&sbi->s_freeclusters_counter,
-                                       grp->bb_free);
-               set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT,
-                       &grp->bb_state);
+       if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) {
+               ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT,
+                                           &grp->bb_state);
+               if (!ret)
+                       percpu_counter_sub(&sbi->s_freeclusters_counter,
+                                          grp->bb_free);
        }
 
-       if ((flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) &&
-           !EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
-               if (gdp) {
+       if (flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) {
+               ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT,
+                                           &grp->bb_state);
+               if (!ret && gdp) {
                        int count;
 
                        count = ext4_free_inodes_count(sb, gdp);
                        percpu_counter_sub(&sbi->s_freeinodes_counter,
                                           count);
                }
-               set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT,
-                       &grp->bb_state);
        }
 }