diff options
Diffstat (limited to 'fs/ext4/resize.c')
| -rw-r--r-- | fs/ext4/resize.c | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index ebbc663d0798..a5efee34415f 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c @@ -459,16 +459,18 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle,  		BUFFER_TRACE(bh, "get_write_access");  		err = ext4_journal_get_write_access(handle, bh); -		if (err) +		if (err) { +			brelse(bh);  			return err; +		}  		ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n",  			   first_cluster, first_cluster - start, count2);  		ext4_set_bits(bh->b_data, first_cluster - start, count2);  		err = ext4_handle_dirty_metadata(handle, NULL, bh); +		brelse(bh);  		if (unlikely(err))  			return err; -		brelse(bh);  	}  	return 0; @@ -605,7 +607,6 @@ handle_bb:  		bh = bclean(handle, sb, block);  		if (IS_ERR(bh)) {  			err = PTR_ERR(bh); -			bh = NULL;  			goto out;  		}  		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),  				     sb->s_blocksize * 8, bh->b_data);  		err = ext4_handle_dirty_metadata(handle, NULL, bh); +		brelse(bh);  		if (err)  			goto out; -		brelse(bh);  handle_ib:  		if (bg_flags[i] & EXT4_BG_INODE_UNINIT) @@ -635,18 +636,16 @@ handle_ib:  		bh = bclean(handle, sb, block);  		if (IS_ERR(bh)) {  			err = PTR_ERR(bh); -			bh = NULL;  			goto out;  		}  		ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb),  				     sb->s_blocksize * 8, bh->b_data);  		err = ext4_handle_dirty_metadata(handle, NULL, bh); +		brelse(bh);  		if (err)  			goto out; -		brelse(bh);  	} -	bh = NULL;  	/* Mark group tables in block bitmap */  	for (j = 0; j < GROUP_TABLE_COUNT; j++) { @@ -685,7 +684,6 @@ handle_ib:  	}  out: -	brelse(bh);  	err2 = ext4_journal_stop(handle);  	if (err2 && !err)  		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);  	if (unlikely(err)) {  		ext4_std_error(sb, err); +		iloc.bh = NULL;  		goto exit_inode;  	}  	brelse(dind); @@ -924,6 +923,7 @@ static int add_new_gdb_meta_bg(struct super_block *sb,  				     sizeof(struct buffer_head *),  				     GFP_NOFS);  	if (!n_group_desc) { +		brelse(gdb_bh);  		err = -ENOMEM;  		ext4_warning(sb, "not enough memory for %lu groups",  			     gdb_num + 1); @@ -939,8 +939,6 @@ static int add_new_gdb_meta_bg(struct super_block *sb,  	kvfree(o_group_desc);  	BUFFER_TRACE(gdb_bh, "get_write_access");  	err = ext4_journal_get_write_access(handle, gdb_bh); -	if (unlikely(err)) -		brelse(gdb_bh);  	return err;  } @@ -1124,8 +1122,10 @@ static void update_backups(struct super_block *sb, sector_t blk_off, char *data,  			   backup_block, backup_block -  			   ext4_group_first_block_no(sb, group));  		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; +		}  		lock_buffer(bh);  		memcpy(bh->b_data, data, size);  		if (rest) @@ -2023,7 +2023,7 @@ retry:  	err = ext4_alloc_flex_bg_array(sb, n_group + 1);  	if (err) -		return err; +		goto out;  	err = ext4_mb_alloc_groupinfo(sb, n_group + 1);  	if (err) @@ -2059,6 +2059,10 @@ retry:  		n_blocks_count_retry = 0;  		free_flex_gd(flex_gd);  		flex_gd = NULL; +		if (resize_inode) { +			iput(resize_inode); +			resize_inode = NULL; +		}  		goto retry;  	}  | 
