diff options
author | Yongqiang Yang <xiaoqiangnk@gmail.com> | 2011-07-26 21:46:07 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-07-26 21:46:07 -0400 |
commit | cc7365dfe48cb2191f1572bf69e30d3e58716313 (patch) | |
tree | 1d0a533d6ffcee71900894741995a1d0cf91ab0f | |
parent | 0529155e8a4bcb77dfc9ceaea19c6501487e452b (diff) |
ext4: let ext4_group_add_blocks() return an error code
This patch lets ext4_group_add_blocks() return an error code if it
fails, so that upper functions can handle error correctly.
Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r-- | fs/ext4/ext4.h | 2 | ||||
-rw-r--r-- | fs/ext4/mballoc.c | 20 | ||||
-rw-r--r-- | fs/ext4/resize.c | 10 |
3 files changed, 23 insertions, 9 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bbe81db76c71..da7ab48948f2 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1799,7 +1799,7 @@ extern void ext4_free_blocks(handle_t *handle, struct inode *inode, | |||
1799 | unsigned long count, int flags); | 1799 | unsigned long count, int flags); |
1800 | extern int ext4_mb_add_groupinfo(struct super_block *sb, | 1800 | extern int ext4_mb_add_groupinfo(struct super_block *sb, |
1801 | ext4_group_t i, struct ext4_group_desc *desc); | 1801 | ext4_group_t i, struct ext4_group_desc *desc); |
1802 | extern void ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | 1802 | extern int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, |
1803 | ext4_fsblk_t block, unsigned long count); | 1803 | ext4_fsblk_t block, unsigned long count); |
1804 | extern int ext4_trim_fs(struct super_block *, struct fstrim_range *); | 1804 | extern int ext4_trim_fs(struct super_block *, struct fstrim_range *); |
1805 | 1805 | ||
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 93035ea70c0b..dbe429567eb3 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -4675,7 +4675,7 @@ error_return: | |||
4675 | * | 4675 | * |
4676 | * This marks the blocks as free in the bitmap and buddy. | 4676 | * This marks the blocks as free in the bitmap and buddy. |
4677 | */ | 4677 | */ |
4678 | void ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | 4678 | int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, |
4679 | ext4_fsblk_t block, unsigned long count) | 4679 | ext4_fsblk_t block, unsigned long count) |
4680 | { | 4680 | { |
4681 | struct buffer_head *bitmap_bh = NULL; | 4681 | struct buffer_head *bitmap_bh = NULL; |
@@ -4696,15 +4696,24 @@ void ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | |||
4696 | * Check to see if we are freeing blocks across a group | 4696 | * Check to see if we are freeing blocks across a group |
4697 | * boundary. | 4697 | * boundary. |
4698 | */ | 4698 | */ |
4699 | if (bit + count > EXT4_BLOCKS_PER_GROUP(sb)) | 4699 | if (bit + count > EXT4_BLOCKS_PER_GROUP(sb)) { |
4700 | ext4_warning(sb, "too much blocks added to group %u\n", | ||
4701 | block_group); | ||
4702 | err = -EINVAL; | ||
4700 | goto error_return; | 4703 | goto error_return; |
4704 | } | ||
4701 | 4705 | ||
4702 | bitmap_bh = ext4_read_block_bitmap(sb, block_group); | 4706 | bitmap_bh = ext4_read_block_bitmap(sb, block_group); |
4703 | if (!bitmap_bh) | 4707 | if (!bitmap_bh) { |
4708 | err = -EIO; | ||
4704 | goto error_return; | 4709 | goto error_return; |
4710 | } | ||
4711 | |||
4705 | desc = ext4_get_group_desc(sb, block_group, &gd_bh); | 4712 | desc = ext4_get_group_desc(sb, block_group, &gd_bh); |
4706 | if (!desc) | 4713 | if (!desc) { |
4714 | err = -EIO; | ||
4707 | goto error_return; | 4715 | goto error_return; |
4716 | } | ||
4708 | 4717 | ||
4709 | if (in_range(ext4_block_bitmap(sb, desc), block, count) || | 4718 | if (in_range(ext4_block_bitmap(sb, desc), block, count) || |
4710 | in_range(ext4_inode_bitmap(sb, desc), block, count) || | 4719 | in_range(ext4_inode_bitmap(sb, desc), block, count) || |
@@ -4714,6 +4723,7 @@ void ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | |||
4714 | ext4_error(sb, "Adding blocks in system zones - " | 4723 | ext4_error(sb, "Adding blocks in system zones - " |
4715 | "Block = %llu, count = %lu", | 4724 | "Block = %llu, count = %lu", |
4716 | block, count); | 4725 | block, count); |
4726 | err = -EINVAL; | ||
4717 | goto error_return; | 4727 | goto error_return; |
4718 | } | 4728 | } |
4719 | 4729 | ||
@@ -4782,7 +4792,7 @@ void ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | |||
4782 | error_return: | 4792 | error_return: |
4783 | brelse(bitmap_bh); | 4793 | brelse(bitmap_bh); |
4784 | ext4_std_error(sb, err); | 4794 | ext4_std_error(sb, err); |
4785 | return; | 4795 | return err; |
4786 | } | 4796 | } |
4787 | 4797 | ||
4788 | /** | 4798 | /** |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index d241ecbb0d53..4c041e37f61f 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -980,7 +980,7 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, | |||
980 | ext4_grpblk_t add; | 980 | ext4_grpblk_t add; |
981 | struct buffer_head *bh; | 981 | struct buffer_head *bh; |
982 | handle_t *handle; | 982 | handle_t *handle; |
983 | int err; | 983 | int err, err2; |
984 | ext4_group_t group; | 984 | ext4_group_t group; |
985 | 985 | ||
986 | o_blocks_count = ext4_blocks_count(es); | 986 | o_blocks_count = ext4_blocks_count(es); |
@@ -1056,11 +1056,15 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, | |||
1056 | ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count, | 1056 | ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count, |
1057 | o_blocks_count + add); | 1057 | o_blocks_count + add); |
1058 | /* We add the blocks to the bitmap and set the group need init bit */ | 1058 | /* We add the blocks to the bitmap and set the group need init bit */ |
1059 | ext4_group_add_blocks(handle, sb, o_blocks_count, add); | 1059 | err = ext4_group_add_blocks(handle, sb, o_blocks_count, add); |
1060 | ext4_handle_dirty_super(handle, sb); | 1060 | ext4_handle_dirty_super(handle, sb); |
1061 | ext4_debug("freed blocks %llu through %llu\n", o_blocks_count, | 1061 | ext4_debug("freed blocks %llu through %llu\n", o_blocks_count, |
1062 | o_blocks_count + add); | 1062 | o_blocks_count + add); |
1063 | if ((err = ext4_journal_stop(handle))) | 1063 | err2 = ext4_journal_stop(handle); |
1064 | if (!err && err2) | ||
1065 | err = err2; | ||
1066 | |||
1067 | if (err) | ||
1064 | goto exit_put; | 1068 | goto exit_put; |
1065 | 1069 | ||
1066 | if (test_opt(sb, DEBUG)) | 1070 | if (test_opt(sb, DEBUG)) |