+@@ -3458,9 +3471,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
+ }
+
+ if (free != ext4_free_blks_count(sb, gdp)) {
+- 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));
++ 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));
+ return -EIO;
+ }
+ return 0;
+@@ -3813,17 +3828,9 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh,
+ /* "free < pa->pa_free" means we maybe double alloc the same blocks,
+ * otherwise maybe leave some free blocks unavailable, no need to BUG.*/
+ if ((free > pa->pa_free && !pa->pa_error) || (free < pa->pa_free)) {
+- ext4_error(sb, "pa free mismatch: [pa %p] "
+- "[phy %lu] [logic %lu] [len %u] [free %u] "
+- "[error %u] [inode %lu] [freed %u]", pa,
+- (unsigned long)pa->pa_pstart,
+- (unsigned long)pa->pa_lstart,
+- (unsigned)pa->pa_len, (unsigned)pa->pa_free,
+- (unsigned)pa->pa_error, pa->pa_inode->i_ino,
+- free);
+ ext4_grp_locked_error(sb, group, 0, 0,
+- "free %u, pa_free %u",
+- free, pa->pa_free);
++ "free %u, pa_free %u",
++ free, pa->pa_free);
+ /*
+ * pa is already deleted so we use the value obtained
+ * from the bitmap and continue.
+@@ -3883,14 +3890,11 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
+ return 0;
+
+ bitmap_bh = ext4_read_block_bitmap(sb, group);
+- if (bitmap_bh == NULL) {
+- ext4_error(sb, "Error reading block bitmap for %u", group);
++ if (bitmap_bh == NULL)
+ return 0;
+- }
+
+ err = ext4_mb_load_buddy(sb, group, &e4b);
+ if (err) {
+- ext4_error(sb, "Error loading buddy information for %u", group);
+ put_bh(bitmap_bh);
+ return 0;
+ }
+@@ -4054,16 +4058,11 @@ repeat:
+ ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
+
+ err = ext4_mb_load_buddy(sb, group, &e4b);
+- if (err) {
+- ext4_error(sb, "Error loading buddy information for %u",
+- group);
++ if (err)
+ return;
+- }
+
+ bitmap_bh = ext4_read_block_bitmap(sb, group);
+ if (bitmap_bh == NULL) {
+- ext4_error(sb, "Error reading block bitmap for %u",
+- group);
+ ext4_mb_unload_buddy(&e4b);
+ continue;
+ }
+@@ -4324,11 +4323,8 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
+ list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
+
+ ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
+- if (ext4_mb_load_buddy(sb, group, &e4b)) {
+- ext4_error(sb, "Error loading buddy information for %u",
+- group);
++ if (ext4_mb_load_buddy(sb, group, &e4b))
+ continue;
+- }
+ ext4_lock_group(sb, group);
+ list_del(&pa->pa_group_list);
+ ext4_get_group_info(sb, group)->bb_prealloc_nr--;
+@@ -4585,7 +4581,7 @@ repeat:
+ * been updated or not when fail case. So can
+ * not revert pa_free back, just mark pa_error*/
+ pa->pa_error++;
+- ext4_error(sb,
++ ext4_corrupted_block_group(sb, 0, 0,
+ "Updating bitmap error: [err %d] "
+ "[pa %p] [phy %lu] [logic %lu] "
+ "[len %u] [free %u] [error %u] "
+@@ -4731,6 +4727,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
+ struct ext4_buddy e4b;
+ int err = 0;
+ int ret;
++ int skip_error = 0;
+
+ if (bh) {
+ if (block)
+@@ -4781,6 +4778,10 @@ do_more: