diff options
| author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2008-07-23 14:09:29 -0400 |
|---|---|---|
| committer | Theodore Ts'o <tytso@mit.edu> | 2008-07-23 14:09:29 -0400 |
| commit | ce89f46cb833f89c58a08240faa6b5e963086b8a (patch) | |
| tree | c5743d9b16622610595db5fad891ae9f088d04ee | |
| parent | b5f10eed8125702929e57cca7e5956b1b9b6d015 (diff) | |
ext4: Improve error handling in mballoc
Don't call BUG_ON on file system failures. Instead use ext4_error and
also handle the continue case properly.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
| -rw-r--r-- | fs/ext4/mballoc.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 4258d3289a6f..500d3920d41d 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
| @@ -3736,20 +3736,23 @@ ext4_mb_discard_group_preallocations(struct super_block *sb, | |||
| 3736 | 3736 | ||
| 3737 | bitmap_bh = ext4_read_block_bitmap(sb, group); | 3737 | bitmap_bh = ext4_read_block_bitmap(sb, group); |
| 3738 | if (bitmap_bh == NULL) { | 3738 | if (bitmap_bh == NULL) { |
| 3739 | /* error handling here */ | 3739 | ext4_error(sb, __func__, "Error in reading block " |
| 3740 | ext4_mb_release_desc(&e4b); | 3740 | "bitmap for %lu\n", group); |
| 3741 | BUG_ON(bitmap_bh == NULL); | 3741 | return 0; |
| 3742 | } | 3742 | } |
| 3743 | 3743 | ||
| 3744 | err = ext4_mb_load_buddy(sb, group, &e4b); | 3744 | err = ext4_mb_load_buddy(sb, group, &e4b); |
| 3745 | BUG_ON(err != 0); /* error handling here */ | 3745 | if (err) { |
| 3746 | ext4_error(sb, __func__, "Error in loading buddy " | ||
| 3747 | "information for %lu\n", group); | ||
| 3748 | put_bh(bitmap_bh); | ||
| 3749 | return 0; | ||
| 3750 | } | ||
| 3746 | 3751 | ||
| 3747 | if (needed == 0) | 3752 | if (needed == 0) |
| 3748 | needed = EXT4_BLOCKS_PER_GROUP(sb) + 1; | 3753 | needed = EXT4_BLOCKS_PER_GROUP(sb) + 1; |
| 3749 | 3754 | ||
| 3750 | grp = ext4_get_group_info(sb, group); | ||
| 3751 | INIT_LIST_HEAD(&list); | 3755 | INIT_LIST_HEAD(&list); |
| 3752 | |||
| 3753 | ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS); | 3756 | ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS); |
| 3754 | repeat: | 3757 | repeat: |
| 3755 | ext4_lock_group(sb, group); | 3758 | ext4_lock_group(sb, group); |
| @@ -3906,13 +3909,18 @@ repeat: | |||
| 3906 | ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL); | 3909 | ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL); |
| 3907 | 3910 | ||
| 3908 | err = ext4_mb_load_buddy(sb, group, &e4b); | 3911 | err = ext4_mb_load_buddy(sb, group, &e4b); |
| 3909 | BUG_ON(err != 0); /* error handling here */ | 3912 | if (err) { |
| 3913 | ext4_error(sb, __func__, "Error in loading buddy " | ||
| 3914 | "information for %lu\n", group); | ||
| 3915 | continue; | ||
| 3916 | } | ||
| 3910 | 3917 | ||
| 3911 | bitmap_bh = ext4_read_block_bitmap(sb, group); | 3918 | bitmap_bh = ext4_read_block_bitmap(sb, group); |
| 3912 | if (bitmap_bh == NULL) { | 3919 | if (bitmap_bh == NULL) { |
| 3913 | /* error handling here */ | 3920 | ext4_error(sb, __func__, "Error in reading block " |
| 3921 | "bitmap for %lu\n", group); | ||
| 3914 | ext4_mb_release_desc(&e4b); | 3922 | ext4_mb_release_desc(&e4b); |
| 3915 | BUG_ON(bitmap_bh == NULL); | 3923 | continue; |
| 3916 | } | 3924 | } |
| 3917 | 3925 | ||
| 3918 | ext4_lock_group(sb, group); | 3926 | ext4_lock_group(sb, group); |
| @@ -4423,11 +4431,15 @@ do_more: | |||
| 4423 | count -= overflow; | 4431 | count -= overflow; |
| 4424 | } | 4432 | } |
| 4425 | bitmap_bh = ext4_read_block_bitmap(sb, block_group); | 4433 | bitmap_bh = ext4_read_block_bitmap(sb, block_group); |
| 4426 | if (!bitmap_bh) | 4434 | if (!bitmap_bh) { |
| 4435 | err = -EIO; | ||
| 4427 | goto error_return; | 4436 | goto error_return; |
| 4437 | } | ||
| 4428 | gdp = ext4_get_group_desc(sb, block_group, &gd_bh); | 4438 | gdp = ext4_get_group_desc(sb, block_group, &gd_bh); |
| 4429 | if (!gdp) | 4439 | if (!gdp) { |
| 4440 | err = -EIO; | ||
| 4430 | goto error_return; | 4441 | goto error_return; |
| 4442 | } | ||
| 4431 | 4443 | ||
| 4432 | if (in_range(ext4_block_bitmap(sb, gdp), block, count) || | 4444 | if (in_range(ext4_block_bitmap(sb, gdp), block, count) || |
| 4433 | in_range(ext4_inode_bitmap(sb, gdp), block, count) || | 4445 | in_range(ext4_inode_bitmap(sb, gdp), block, count) || |
