OSDN Git Service

HACK: ext4: make bitmap corruption not fatal
[android-x86/kernel.git] / fs / ext4 / mballoc.c
index c281050..3acf68f 100644 (file)
@@ -1116,7 +1116,7 @@ ext4_mb_load_buddy_gfp(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);
@@ -1142,7 +1142,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
                 */
                ret = ext4_mb_init_group(sb, group, gfp);
                if (ret)
-                       return ret;
+                       goto err;
        }
 
        /*
@@ -1245,6 +1245,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;
 }
 
@@ -3866,14 +3867,14 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
        bitmap_bh = ext4_read_block_bitmap(sb, group);
        if (IS_ERR(bitmap_bh)) {
                err = PTR_ERR(bitmap_bh);
-               ext4_error(sb, "Error %d reading block bitmap for %u",
+               ext4_warning(sb, "Error %d reading block bitmap for %u",
                           err, group);
                return 0;
        }
 
        err = ext4_mb_load_buddy(sb, group, &e4b);
        if (err) {
-               ext4_error(sb, "Error loading buddy information for %u", group);
+               ext4_warning(sb, "Error loading buddy information for %u", group);
                put_bh(bitmap_bh);
                return 0;
        }
@@ -4032,7 +4033,7 @@ repeat:
 
                err = ext4_mb_load_buddy(sb, group, &e4b);
                if (err) {
-                       ext4_error(sb, "Error loading buddy information for %u",
+                       ext4_warning(sb, "Error loading buddy information for %u",
                                        group);
                        continue;
                }
@@ -4040,7 +4041,7 @@ repeat:
                bitmap_bh = ext4_read_block_bitmap(sb, group);
                if (IS_ERR(bitmap_bh)) {
                        err = PTR_ERR(bitmap_bh);
-                       ext4_error(sb, "Error %d reading block bitmap for %u",
+                       ext4_warning(sb, "Error %d reading block bitmap for %u",
                                        err, group);
                        ext4_mb_unload_buddy(&e4b);
                        continue;
@@ -4292,7 +4293,7 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
 
                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",
+                       ext4_warning(sb, "Error loading buddy information for %u",
                                        group);
                        continue;
                }
@@ -4827,7 +4828,7 @@ do_more:
        err = ext4_mb_load_buddy_gfp(sb, block_group, &e4b,
                                     GFP_NOFS|__GFP_NOFAIL);
        if (err)
-               goto error_return;
+               goto error_brelse;
 
        if ((flags & EXT4_FREE_BLOCKS_METADATA) && ext4_handle_valid(handle)) {
                struct ext4_free_data *new_entry;
@@ -4904,8 +4905,9 @@ do_more:
                goto do_more;
        }
 error_return:
-       brelse(bitmap_bh);
        ext4_std_error(sb, err);
+error_brelse:
+       brelse(bitmap_bh);
        return;
 }
 
@@ -5002,7 +5004,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
@@ -5039,8 +5041,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;
 }
 
@@ -5119,7 +5122,7 @@ ext4_trim_all_free(struct super_block *sb, ext4_group_t group,
 
        ret = ext4_mb_load_buddy(sb, group, &e4b);
        if (ret) {
-               ext4_error(sb, "Error in loading buddy "
+               ext4_warning(sb, "Error in loading buddy "
                                "information for %u", group);
                return ret;
        }