|
@@ -459,16 +459,18 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle,
|
|
|
|
|
|
BUFFER_TRACE(bh, "get_write_access");
|
|
BUFFER_TRACE(bh, "get_write_access");
|
|
err = ext4_journal_get_write_access(handle, bh);
|
|
err = ext4_journal_get_write_access(handle, bh);
|
|
- if (err)
|
|
|
|
|
|
+ if (err) {
|
|
|
|
+ brelse(bh);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n",
|
|
ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n",
|
|
first_cluster, first_cluster - start, count2);
|
|
first_cluster, first_cluster - start, count2);
|
|
ext4_set_bits(bh->b_data, first_cluster - start, count2);
|
|
ext4_set_bits(bh->b_data, first_cluster - start, count2);
|
|
|
|
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
|
|
+ brelse(bh);
|
|
if (unlikely(err))
|
|
if (unlikely(err))
|
|
return err;
|
|
return err;
|
|
- brelse(bh);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -605,7 +607,6 @@ handle_bb:
|
|
bh = bclean(handle, sb, block);
|
|
bh = bclean(handle, sb, block);
|
|
if (IS_ERR(bh)) {
|
|
if (IS_ERR(bh)) {
|
|
err = PTR_ERR(bh);
|
|
err = PTR_ERR(bh);
|
|
- bh = NULL;
|
|
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
overhead = ext4_group_overhead_blocks(sb, group);
|
|
overhead = ext4_group_overhead_blocks(sb, group);
|
|
@@ -618,9 +619,9 @@ handle_bb:
|
|
ext4_mark_bitmap_end(EXT4_B2C(sbi, group_data[i].blocks_count),
|
|
ext4_mark_bitmap_end(EXT4_B2C(sbi, group_data[i].blocks_count),
|
|
sb->s_blocksize * 8, bh->b_data);
|
|
sb->s_blocksize * 8, bh->b_data);
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
|
|
+ brelse(bh);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
- brelse(bh);
|
|
|
|
|
|
|
|
handle_ib:
|
|
handle_ib:
|
|
if (bg_flags[i] & EXT4_BG_INODE_UNINIT)
|
|
if (bg_flags[i] & EXT4_BG_INODE_UNINIT)
|
|
@@ -635,18 +636,16 @@ handle_ib:
|
|
bh = bclean(handle, sb, block);
|
|
bh = bclean(handle, sb, block);
|
|
if (IS_ERR(bh)) {
|
|
if (IS_ERR(bh)) {
|
|
err = PTR_ERR(bh);
|
|
err = PTR_ERR(bh);
|
|
- bh = NULL;
|
|
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb),
|
|
ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb),
|
|
sb->s_blocksize * 8, bh->b_data);
|
|
sb->s_blocksize * 8, bh->b_data);
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
|
|
|
+ brelse(bh);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
- brelse(bh);
|
|
|
|
}
|
|
}
|
|
- bh = NULL;
|
|
|
|
|
|
|
|
/* Mark group tables in block bitmap */
|
|
/* Mark group tables in block bitmap */
|
|
for (j = 0; j < GROUP_TABLE_COUNT; j++) {
|
|
for (j = 0; j < GROUP_TABLE_COUNT; j++) {
|
|
@@ -685,7 +684,6 @@ handle_ib:
|
|
}
|
|
}
|
|
|
|
|
|
out:
|
|
out:
|
|
- brelse(bh);
|
|
|
|
err2 = ext4_journal_stop(handle);
|
|
err2 = ext4_journal_stop(handle);
|
|
if (err2 && !err)
|
|
if (err2 && !err)
|
|
err = err2;
|
|
err = err2;
|
|
@@ -873,6 +871,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
|
|
err = ext4_handle_dirty_metadata(handle, NULL, gdb_bh);
|
|
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);
|
|
|
|
+ iloc.bh = NULL;
|
|
goto exit_inode;
|
|
goto exit_inode;
|
|
}
|
|
}
|
|
brelse(dind);
|
|
brelse(dind);
|
|
@@ -924,6 +923,7 @@ static int add_new_gdb_meta_bg(struct super_block *sb,
|
|
sizeof(struct buffer_head *),
|
|
sizeof(struct buffer_head *),
|
|
GFP_NOFS);
|
|
GFP_NOFS);
|
|
if (!n_group_desc) {
|
|
if (!n_group_desc) {
|
|
|
|
+ brelse(gdb_bh);
|
|
err = -ENOMEM;
|
|
err = -ENOMEM;
|
|
ext4_warning(sb, "not enough memory for %lu groups",
|
|
ext4_warning(sb, "not enough memory for %lu groups",
|
|
gdb_num + 1);
|
|
gdb_num + 1);
|
|
@@ -939,8 +939,6 @@ static int add_new_gdb_meta_bg(struct super_block *sb,
|
|
kvfree(o_group_desc);
|
|
kvfree(o_group_desc);
|
|
BUFFER_TRACE(gdb_bh, "get_write_access");
|
|
BUFFER_TRACE(gdb_bh, "get_write_access");
|
|
err = ext4_journal_get_write_access(handle, gdb_bh);
|
|
err = ext4_journal_get_write_access(handle, gdb_bh);
|
|
- if (unlikely(err))
|
|
|
|
- brelse(gdb_bh);
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1124,8 +1122,10 @@ static void update_backups(struct super_block *sb, sector_t blk_off, char *data,
|
|
backup_block, backup_block -
|
|
backup_block, backup_block -
|
|
ext4_group_first_block_no(sb, group));
|
|
ext4_group_first_block_no(sb, group));
|
|
BUFFER_TRACE(bh, "get_write_access");
|
|
BUFFER_TRACE(bh, "get_write_access");
|
|
- if ((err = ext4_journal_get_write_access(handle, bh)))
|
|
|
|
|
|
+ if ((err = ext4_journal_get_write_access(handle, bh))) {
|
|
|
|
+ brelse(bh);
|
|
break;
|
|
break;
|
|
|
|
+ }
|
|
lock_buffer(bh);
|
|
lock_buffer(bh);
|
|
memcpy(bh->b_data, data, size);
|
|
memcpy(bh->b_data, data, size);
|
|
if (rest)
|
|
if (rest)
|
|
@@ -2023,7 +2023,7 @@ retry:
|
|
|
|
|
|
err = ext4_alloc_flex_bg_array(sb, n_group + 1);
|
|
err = ext4_alloc_flex_bg_array(sb, n_group + 1);
|
|
if (err)
|
|
if (err)
|
|
- return err;
|
|
|
|
|
|
+ goto out;
|
|
|
|
|
|
err = ext4_mb_alloc_groupinfo(sb, n_group + 1);
|
|
err = ext4_mb_alloc_groupinfo(sb, n_group + 1);
|
|
if (err)
|
|
if (err)
|
|
@@ -2059,6 +2059,10 @@ retry:
|
|
n_blocks_count_retry = 0;
|
|
n_blocks_count_retry = 0;
|
|
free_flex_gd(flex_gd);
|
|
free_flex_gd(flex_gd);
|
|
flex_gd = NULL;
|
|
flex_gd = NULL;
|
|
|
|
+ if (resize_inode) {
|
|
|
|
+ iput(resize_inode);
|
|
|
|
+ resize_inode = NULL;
|
|
|
|
+ }
|
|
goto retry;
|
|
goto retry;
|
|
}
|
|
}
|
|
|
|
|