From 293b5b0279ba758f081c6444569cbff7f167800c Mon Sep 17 00:00:00 2001 From: Yongqiang Yang Date: Tue, 3 Jan 2012 23:18:50 -0500 Subject: [PATCH] --- yaml --- r: 282967 b: refs/heads/master c: 18e3143848f1abdd07e7d9879cf67f4e147ff8b7 h: refs/heads/master i: 282965: f85ae78f7b02673c37f687d3dafb0c8e6c6e5bc7 282963: 7212e7afa6760fd28a5fd7a1fa1775eeb352a2e2 282959: 8610f76a0417aba8b2c219a704fab4446ac322c1 v: v3 --- [refs] | 2 +- trunk/fs/ext4/resize.c | 51 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 56e810bc2595..5338f8ca8057 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 597d508c17a6dcd17770f4dd9da873d93cc15493 +refs/heads/master: 18e3143848f1abdd07e7d9879cf67f4e147ff8b7 diff --git a/trunk/fs/ext4/resize.c b/trunk/fs/ext4/resize.c index 996780ab4f4e..1c3c2b56049d 100644 --- a/trunk/fs/ext4/resize.c +++ b/trunk/fs/ext4/resize.c @@ -968,6 +968,57 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) return err; } /* ext4_group_add */ +/* + * extend a group without checking assuming that checking has been done. + */ +static int ext4_group_extend_no_check(struct super_block *sb, + ext4_fsblk_t o_blocks_count, ext4_grpblk_t add) +{ + struct ext4_super_block *es = EXT4_SB(sb)->s_es; + handle_t *handle; + int err = 0, err2; + + /* We will update the superblock, one block bitmap, and + * one group descriptor via ext4_group_add_blocks(). + */ + handle = ext4_journal_start_sb(sb, 3); + if (IS_ERR(handle)) { + err = PTR_ERR(handle); + ext4_warning(sb, "error %d on journal start", err); + return err; + } + + err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh); + if (err) { + ext4_warning(sb, "error %d on journal write access", err); + goto errout; + } + + ext4_blocks_count_set(es, o_blocks_count + add); + ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count, + o_blocks_count + add); + /* We add the blocks to the bitmap and set the group need init bit */ + err = ext4_group_add_blocks(handle, sb, o_blocks_count, add); + if (err) + goto errout; + ext4_handle_dirty_super(handle, sb); + ext4_debug("freed blocks %llu through %llu\n", o_blocks_count, + o_blocks_count + add); +errout: + err2 = ext4_journal_stop(handle); + if (err2 && !err) + err = err2; + + if (!err) { + if (test_opt(sb, DEBUG)) + printk(KERN_DEBUG "EXT4-fs: extended group to %llu " + "blocks\n", ext4_blocks_count(es)); + update_backups(sb, EXT4_SB(sb)->s_sbh->b_blocknr, (char *)es, + sizeof(struct ext4_super_block)); + } + return err; +} + /* * Extend the filesystem to the new number of blocks specified. This entry * point is only used to extend the current filesystem to the end of the last