Commit 2f919710 authored by Yongqiang Yang's avatar Yongqiang Yang Committed by Theodore Ts'o

ext4: simplify parameters of add_new_gdb()

add_new_gdb() only needs the block group number; there is no need to
pass a pointer to struct ext4_new_group_data to add_new_gdb().
Instead of filling in a pointer the struct buffer_head in
add_new_gdb(), it's simpler to have the caller fetch it from the
s_group_desc[] array.

[Fixed error path to handle the case where struct buffer_head *primary
 hasn't been set yet. -- Ted]
Signed-off-by: default avatarYongqiang Yang <xiaoqiangnk@gmail.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent e6075e98
...@@ -394,15 +394,15 @@ static int verify_reserved_gdb(struct super_block *sb, ...@@ -394,15 +394,15 @@ static int verify_reserved_gdb(struct super_block *sb,
* fail once we start modifying the data on disk, because JBD has no rollback. * fail once we start modifying the data on disk, because JBD has no rollback.
*/ */
static int add_new_gdb(handle_t *handle, struct inode *inode, static int add_new_gdb(handle_t *handle, struct inode *inode,
struct ext4_new_group_data *input, ext4_group_t group)
struct buffer_head **primary)
{ {
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct ext4_super_block *es = EXT4_SB(sb)->s_es; struct ext4_super_block *es = EXT4_SB(sb)->s_es;
unsigned long gdb_num = input->group / EXT4_DESC_PER_BLOCK(sb); unsigned long gdb_num = group / EXT4_DESC_PER_BLOCK(sb);
ext4_fsblk_t gdblock = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; ext4_fsblk_t gdblock = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num;
struct buffer_head **o_group_desc, **n_group_desc; struct buffer_head **o_group_desc, **n_group_desc;
struct buffer_head *dind; struct buffer_head *dind;
struct buffer_head *gdb_bh;
int gdbackups; int gdbackups;
struct ext4_iloc iloc; struct ext4_iloc iloc;
__le32 *data; __le32 *data;
...@@ -425,11 +425,12 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -425,11 +425,12 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
return -EPERM; return -EPERM;
} }
*primary = sb_bread(sb, gdblock); gdb_bh = sb_bread(sb, gdblock);
if (!*primary) if (!gdb_bh)
return -EIO; return -EIO;
if ((gdbackups = verify_reserved_gdb(sb, *primary)) < 0) { gdbackups = verify_reserved_gdb(sb, gdb_bh);
if (gdbackups < 0) {
err = gdbackups; err = gdbackups;
goto exit_bh; goto exit_bh;
} }
...@@ -444,7 +445,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -444,7 +445,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
data = (__le32 *)dind->b_data; data = (__le32 *)dind->b_data;
if (le32_to_cpu(data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)]) != gdblock) { if (le32_to_cpu(data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)]) != gdblock) {
ext4_warning(sb, "new group %u GDT block %llu not reserved", ext4_warning(sb, "new group %u GDT block %llu not reserved",
input->group, gdblock); group, gdblock);
err = -EINVAL; err = -EINVAL;
goto exit_dind; goto exit_dind;
} }
...@@ -453,7 +454,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -453,7 +454,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
if (unlikely(err)) if (unlikely(err))
goto exit_dind; goto exit_dind;
err = ext4_journal_get_write_access(handle, *primary); err = ext4_journal_get_write_access(handle, gdb_bh);
if (unlikely(err)) if (unlikely(err))
goto exit_sbh; goto exit_sbh;
...@@ -492,8 +493,8 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -492,8 +493,8 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
} }
inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9;
ext4_mark_iloc_dirty(handle, inode, &iloc); ext4_mark_iloc_dirty(handle, inode, &iloc);
memset((*primary)->b_data, 0, sb->s_blocksize); memset(gdb_bh->b_data, 0, sb->s_blocksize);
err = ext4_handle_dirty_metadata(handle, NULL, *primary); err = ext4_handle_dirty_metadata(handle, NULL, gdb_bh);
if (unlikely(err)) { if (unlikely(err)) {
ext4_std_error(sb, err); ext4_std_error(sb, err);
goto exit_inode; goto exit_inode;
...@@ -503,7 +504,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -503,7 +504,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
o_group_desc = EXT4_SB(sb)->s_group_desc; o_group_desc = EXT4_SB(sb)->s_group_desc;
memcpy(n_group_desc, o_group_desc, memcpy(n_group_desc, o_group_desc,
EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *));
n_group_desc[gdb_num] = *primary; n_group_desc[gdb_num] = gdb_bh;
EXT4_SB(sb)->s_group_desc = n_group_desc; EXT4_SB(sb)->s_group_desc = n_group_desc;
EXT4_SB(sb)->s_gdb_count++; EXT4_SB(sb)->s_gdb_count++;
kfree(o_group_desc); kfree(o_group_desc);
...@@ -525,7 +526,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, ...@@ -525,7 +526,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
exit_dind: exit_dind:
brelse(dind); brelse(dind);
exit_bh: exit_bh:
brelse(*primary); brelse(gdb_bh);
ext4_debug("leaving with error %d\n", err); ext4_debug("leaving with error %d\n", err);
return err; return err;
...@@ -833,8 +834,16 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) ...@@ -833,8 +834,16 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
if (reserved_gdb && ext4_bg_num_gdb(sb, input->group) && if (reserved_gdb && ext4_bg_num_gdb(sb, input->group) &&
(err = reserve_backup_gdb(handle, inode, input))) (err = reserve_backup_gdb(handle, inode, input)))
goto exit_journal; goto exit_journal;
} else if ((err = add_new_gdb(handle, inode, input, &primary))) } else {
goto exit_journal; /*
* Note that we can access new group descriptor block safely
* only if add_new_gdb() succeeds.
*/
err = add_new_gdb(handle, inode, input->group);
if (err)
goto exit_journal;
primary = sbi->s_group_desc[gdb_num];
}
/* /*
* OK, now we've set up the new group. Time to make it active. * OK, now we've set up the new group. Time to make it active.
...@@ -944,7 +953,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) ...@@ -944,7 +953,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
exit_journal: exit_journal:
if ((err2 = ext4_journal_stop(handle)) && !err) if ((err2 = ext4_journal_stop(handle)) && !err)
err = err2; err = err2;
if (!err) { if (!err && primary) {
update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es,
sizeof(struct ext4_super_block)); sizeof(struct ext4_super_block));
update_backups(sb, primary->b_blocknr, primary->b_data, update_backups(sb, primary->b_blocknr, primary->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