Commit 6d40bc5a authored by Yongqiang Yang's avatar Yongqiang Yang Committed by Theodore Ts'o

ext4: simplify journal handling in setup_new_group_blocks()

This patch simplifies journal handling in setup_new_group_blocks().

In previous code, block bitmap is modified everywhere in
setup_new_group_blocks(), ext4_get_write_access() in
extend_or_restart_transaction() is used to guarantee that the block
bitmap stays in the new handle, this makes things complicated.

The previous commit changed things so that the modifications on the
block bitmap are batched and done by ext4_set_bits() at the end of the
for loop.  This allows us to simplify things.
Signed-off-by: default avatarYongqiang Yang <xiaoqiangnk@gmail.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent c3e94d1d
...@@ -161,8 +161,7 @@ static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, ...@@ -161,8 +161,7 @@ static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
* If that fails, restart the transaction & regain write access for the * If that fails, restart the transaction & regain write access for the
* buffer head which is used for block_bitmap modifications. * buffer head which is used for block_bitmap modifications.
*/ */
static int extend_or_restart_transaction(handle_t *handle, int thresh, static int extend_or_restart_transaction(handle_t *handle, int thresh)
struct buffer_head *bh)
{ {
int err; int err;
...@@ -173,9 +172,8 @@ static int extend_or_restart_transaction(handle_t *handle, int thresh, ...@@ -173,9 +172,8 @@ static int extend_or_restart_transaction(handle_t *handle, int thresh,
if (err < 0) if (err < 0)
return err; return err;
if (err) { if (err) {
if ((err = ext4_journal_restart(handle, EXT4_MAX_TRANS_DATA))) err = ext4_journal_restart(handle, EXT4_MAX_TRANS_DATA);
return err; if (err)
if ((err = ext4_journal_get_write_access(handle, bh)))
return err; return err;
} }
...@@ -212,29 +210,24 @@ static int setup_new_group_blocks(struct super_block *sb, ...@@ -212,29 +210,24 @@ static int setup_new_group_blocks(struct super_block *sb,
BUG_ON(input->group != sbi->s_groups_count); BUG_ON(input->group != sbi->s_groups_count);
if (IS_ERR(bh = bclean(handle, sb, input->block_bitmap))) {
err = PTR_ERR(bh);
goto exit_journal;
}
/* Copy all of the GDT blocks into the backup in this group */ /* Copy all of the GDT blocks into the backup in this group */
for (i = 0, bit = 1, block = start + 1; for (i = 0, bit = 1, block = start + 1;
i < gdblocks; i++, block++, bit++) { i < gdblocks; i++, block++, bit++) {
struct buffer_head *gdb; struct buffer_head *gdb;
ext4_debug("update backup group %#04llx (+%d)\n", block, bit); ext4_debug("update backup group %#04llx (+%d)\n", block, bit);
err = extend_or_restart_transaction(handle, 1);
if ((err = extend_or_restart_transaction(handle, 1, bh))) if (err)
goto exit_bh; goto exit_journal;
gdb = sb_getblk(sb, block); gdb = sb_getblk(sb, block);
if (!gdb) { if (!gdb) {
err = -EIO; err = -EIO;
goto exit_bh; goto exit_journal;
} }
if ((err = ext4_journal_get_write_access(handle, gdb))) { if ((err = ext4_journal_get_write_access(handle, gdb))) {
brelse(gdb); brelse(gdb);
goto exit_bh; goto exit_journal;
} }
lock_buffer(gdb); lock_buffer(gdb);
memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size);
...@@ -243,7 +236,7 @@ static int setup_new_group_blocks(struct super_block *sb, ...@@ -243,7 +236,7 @@ static int setup_new_group_blocks(struct super_block *sb,
err = ext4_handle_dirty_metadata(handle, NULL, gdb); err = ext4_handle_dirty_metadata(handle, NULL, gdb);
if (unlikely(err)) { if (unlikely(err)) {
brelse(gdb); brelse(gdb);
goto exit_bh; goto exit_journal;
} }
brelse(gdb); brelse(gdb);
} }
...@@ -254,7 +247,17 @@ static int setup_new_group_blocks(struct super_block *sb, ...@@ -254,7 +247,17 @@ static int setup_new_group_blocks(struct super_block *sb,
err = sb_issue_zeroout(sb, gdblocks + start + 1, reserved_gdb, err = sb_issue_zeroout(sb, gdblocks + start + 1, reserved_gdb,
GFP_NOFS); GFP_NOFS);
if (err) if (err)
goto exit_bh; goto exit_journal;
err = extend_or_restart_transaction(handle, 2);
if (err)
goto exit_journal;
bh = bclean(handle, sb, input->block_bitmap);
if (IS_ERR(bh)) {
err = PTR_ERR(bh);
goto exit_journal;
}
if (ext4_bg_has_super(sb, input->group)) { if (ext4_bg_has_super(sb, input->group)) {
ext4_debug("mark backup group tables %#04llx (+0)\n", start); ext4_debug("mark backup group tables %#04llx (+0)\n", start);
...@@ -278,8 +281,6 @@ static int setup_new_group_blocks(struct super_block *sb, ...@@ -278,8 +281,6 @@ static int setup_new_group_blocks(struct super_block *sb,
ext4_set_bits(bh->b_data, input->inode_table - start, ext4_set_bits(bh->b_data, input->inode_table - start,
sbi->s_itb_per_group); sbi->s_itb_per_group);
if ((err = extend_or_restart_transaction(handle, 2, bh)))
goto exit_bh;
ext4_mark_bitmap_end(input->blocks_count, sb->s_blocksize * 8, ext4_mark_bitmap_end(input->blocks_count, sb->s_blocksize * 8,
bh->b_data); bh->b_data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment