+@@ -1101,7 +1109,7 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
+ int block;
+ int pnum;
+ int poff;
+- struct page *page;
++ struct page *page = NULL;
+ int ret;
+ struct ext4_group_info *grp;
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
+@@ -1127,7 +1135,7 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
+ */
+ ret = ext4_mb_init_group(sb, group);
+ if (ret)
+- return ret;
++ goto err;
+ }
+
+ /*
+@@ -1227,6 +1235,7 @@ err:
+ page_cache_release(e4b->bd_buddy_page);
+ e4b->bd_buddy = NULL;
+ e4b->bd_bitmap = NULL;
++ ext4_warning(sb, "Error loading buddy information for %u", group);
+ return ret;
+ }
+
+@@ -3599,9 +3608,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
+ }
+
+ if (free != ext4_free_group_clusters(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_group_clusters(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_group_clusters(sb, gdp));
+ return -EIO;
+ }
+ return 0;
+@@ -3962,16 +3973,8 @@ 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, pa->pa_free);
+ /*
+ * pa is already deleted so we use the value obtained
+ * from the bitmap and continue.
+@@ -4031,14 +4034,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;
+ }
+@@ -4198,16 +4198,11 @@ repeat:
+ group = ext4_get_group_number(sb, pa->pa_pstart);
+
+ 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;
+ }
+@@ -4467,11 +4462,8 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
+ list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
+
+ group = ext4_get_group_number(sb, pa->pa_pstart);
+- 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--;
+@@ -4742,17 +4734,18 @@ errout:
+ * been updated or not when fail case. So can
+ * not revert pa_free back, just mark pa_error*/
+ pa->pa_error++;
+- ext4_error(sb,
+- "Updating bitmap error: [err %d] "
+- "[pa %p] [phy %lu] [logic %lu] "
+- "[len %u] [free %u] [error %u] "
+- "[inode %lu]", *errp, 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 ? pa->pa_inode->i_ino : 0);
++ ext4_corrupted_block_group(sb, 0, 0,
++ "Updating bitmap error: [err %d] "
++ "[pa %p] [phy %lu] [logic %lu] "
++ "[len %u] [free %u] [error %u] "
++ "[inode %lu]", *errp, 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 ?
++ pa->pa_inode->i_ino : 0);
+ }
+ }
+ ext4_mb_release_context(ac);
+@@ -5037,7 +5030,7 @@ do_more:
+
+ err = ext4_mb_load_buddy(sb, block_group, &e4b);
+ if (err)
+- goto error_return;
++ goto error_brelse;
+
+ if ((flags & EXT4_FREE_BLOCKS_METADATA) && ext4_handle_valid(handle)) {
+ struct ext4_free_data *new_entry;
+@@ -5119,8 +5112,9 @@ do_more:
+ goto do_more;
+ }
+ error_return:
+- brelse(bitmap_bh);
+ ext4_std_error(sb, err);
++error_brelse:
++ brelse(bitmap_bh);
+ return;
+ }
+
+@@ -5216,7 +5210,7 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
+
+ err = ext4_mb_load_buddy(sb, block_group, &e4b);
+ if (err)
+- goto error_return;
++ goto error_brelse;
+
+ /*
+ * need to update group_info->bb_free and bitmap
+@@ -5253,8 +5247,9 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
+ err = ret;
+
+ error_return:
+- brelse(bitmap_bh);
+ ext4_std_error(sb, err);
++error_brelse:
++ brelse(bitmap_bh);
+ return err;
+ }
+
+@@ -5329,11 +5324,9 @@ ext4_trim_all_free(struct super_block *sb, ext4_group_t group,
+ trace_ext4_trim_all_free(sb, group, start, max);
+
+ ret = ext4_mb_load_buddy(sb, group, &e4b);
+- if (ret) {
+- ext4_error(sb, "Error in loading buddy "
+- "information for %u", group);
++ if (ret)
+ return ret;
+- }
++
+ bitmap = e4b.bd_bitmap;
+
+ ext4_lock_group(sb, group);
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index c625960..0de22f2 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -633,6 +633,37 @@ void __ext4_warning(struct super_block *sb, const char *function,
+ va_end(args);
+ }