diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 06ec8ab6d9ba..a8d492dbd3e7 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -556,6 +556,12 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,  	dst_rsv = &fs_info->delayed_block_rsv;  	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); + +	/* +	 * Here we migrate space rsv from transaction rsv, since have already +	 * reserved space when starting a transaction.  So no need to reserve +	 * qgroup space here. +	 */  	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1);  	if (!ret) {  		trace_btrfs_space_reservation(fs_info, "delayed_item", @@ -577,7 +583,10 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root,  		return;  	rsv = &fs_info->delayed_block_rsv; -	btrfs_qgroup_convert_reserved_meta(root, item->bytes_reserved); +	/* +	 * Check btrfs_delayed_item_reserve_metadata() to see why we don't need +	 * to release/reserve qgroup space. +	 */  	trace_btrfs_space_reservation(fs_info, "delayed_item",  				      item->key.objectid, item->bytes_reserved,  				      0); @@ -602,9 +611,6 @@ static int btrfs_delayed_inode_reserve_metadata(  	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); -	ret = btrfs_qgroup_reserve_meta_prealloc(root, num_bytes, true); -	if (ret < 0) -		return ret;  	/*  	 * btrfs_dirty_inode will update the inode under btrfs_join_transaction  	 * which doesn't reserve space for speed.  This is a problem since we @@ -616,6 +622,10 @@ static int btrfs_delayed_inode_reserve_metadata(  	 */  	if (!src_rsv || (!trans->bytes_reserved &&  			 src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) { +		ret = btrfs_qgroup_reserve_meta_prealloc(root, +				fs_info->nodesize, true); +		if (ret < 0) +			return ret;  		ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes,  					  BTRFS_RESERVE_NO_FLUSH);  		/* @@ -634,6 +644,8 @@ static int btrfs_delayed_inode_reserve_metadata(  						      "delayed_inode",  						      btrfs_ino(inode),  						      num_bytes, 1); +		} else { +			btrfs_qgroup_free_meta_prealloc(root, fs_info->nodesize);  		}  		return ret;  	}  | 
