diff options
Diffstat (limited to 'fs/ext4/migrate.c')
| -rw-r--r-- | fs/ext4/migrate.c | 7 | 
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index ec092437d3e0..d3567f27bae7 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c @@ -39,6 +39,8 @@ static int finish_range(handle_t *handle, struct inode *inode,  	newext.ee_block = cpu_to_le32(lb->first_block);  	newext.ee_len   = cpu_to_le16(lb->last_block - lb->first_block + 1);  	ext4_ext_store_pblock(&newext, lb->first_pblock); +	/* Locking only for convinience since we are operating on temp inode */ +	down_write(&EXT4_I(inode)->i_data_sem);  	path = ext4_ext_find_extent(inode, lb->first_block, NULL, 0);  	if (IS_ERR(path)) { @@ -61,7 +63,9 @@ static int finish_range(handle_t *handle, struct inode *inode,  	 */  	if (needed && ext4_handle_has_enough_credits(handle,  						EXT4_RESERVE_TRANS_BLOCKS)) { +		up_write((&EXT4_I(inode)->i_data_sem));  		retval = ext4_journal_restart(handle, needed); +		down_write((&EXT4_I(inode)->i_data_sem));  		if (retval)  			goto err_out;  	} else if (needed) { @@ -70,13 +74,16 @@ static int finish_range(handle_t *handle, struct inode *inode,  			/*  			 * IF not able to extend the journal restart the journal  			 */ +			up_write((&EXT4_I(inode)->i_data_sem));  			retval = ext4_journal_restart(handle, needed); +			down_write((&EXT4_I(inode)->i_data_sem));  			if (retval)  				goto err_out;  		}  	}  	retval = ext4_ext_insert_extent(handle, inode, path, &newext, 0);  err_out: +	up_write((&EXT4_I(inode)->i_data_sem));  	if (path) {  		ext4_ext_drop_refs(path);  		kfree(path);  |