diff options
Diffstat (limited to 'fs/btrfs/delalloc-space.c')
| -rw-r--r-- | fs/btrfs/delalloc-space.c | 34 | 
1 files changed, 22 insertions, 12 deletions
diff --git a/fs/btrfs/delalloc-space.c b/fs/btrfs/delalloc-space.c index 17f7c0d38768..d949d7d2abed 100644 --- a/fs/btrfs/delalloc-space.c +++ b/fs/btrfs/delalloc-space.c @@ -7,6 +7,7 @@  #include "space-info.h"  #include "transaction.h"  #include "qgroup.h" +#include "block-group.h"  int btrfs_alloc_data_chunk_ondemand(struct btrfs_inode *inode, u64 bytes)  { @@ -129,8 +130,6 @@ commit_trans:  		return -ENOSPC;  	}  	btrfs_space_info_update_bytes_may_use(fs_info, data_sinfo, bytes); -	trace_btrfs_space_reservation(fs_info, "space_info", -				      data_sinfo->flags, bytes, 1);  	spin_unlock(&data_sinfo->lock);  	return 0; @@ -182,8 +181,6 @@ void btrfs_free_reserved_data_space_noquota(struct inode *inode, u64 start,  	data_sinfo = fs_info->data_sinfo;  	spin_lock(&data_sinfo->lock);  	btrfs_space_info_update_bytes_may_use(fs_info, data_sinfo, -len); -	trace_btrfs_space_reservation(fs_info, "space_info", -				      data_sinfo->flags, len, 0);  	spin_unlock(&data_sinfo->lock);  } @@ -254,13 +251,20 @@ static void btrfs_calculate_inode_block_rsv_size(struct btrfs_fs_info *fs_info,  	lockdep_assert_held(&inode->lock);  	outstanding_extents = inode->outstanding_extents; -	if (outstanding_extents) -		reserve_size = btrfs_calc_trans_metadata_size(fs_info, -						outstanding_extents + 1); + +	/* +	 * Insert size for the number of outstanding extents, 1 normal size for +	 * updating the inode. +	 */ +	if (outstanding_extents) { +		reserve_size = btrfs_calc_insert_metadata_size(fs_info, +						outstanding_extents); +		reserve_size += btrfs_calc_metadata_size(fs_info, 1); +	}  	csum_leaves = btrfs_csum_bytes_to_leaves(fs_info,  						 inode->csum_bytes); -	reserve_size += btrfs_calc_trans_metadata_size(fs_info, -						       csum_leaves); +	reserve_size += btrfs_calc_insert_metadata_size(fs_info, +							csum_leaves);  	/*  	 * For qgroup rsv, the calculation is very simple:  	 * account one nodesize for each outstanding extent @@ -281,10 +285,16 @@ static void calc_inode_reservations(struct btrfs_fs_info *fs_info,  {  	u64 nr_extents = count_max_extents(num_bytes);  	u64 csum_leaves = btrfs_csum_bytes_to_leaves(fs_info, num_bytes); +	u64 inode_update = btrfs_calc_metadata_size(fs_info, 1); -	/* We add one for the inode update at finish ordered time */ -	*meta_reserve = btrfs_calc_trans_metadata_size(fs_info, -						nr_extents + csum_leaves + 1); +	*meta_reserve = btrfs_calc_insert_metadata_size(fs_info, +						nr_extents + csum_leaves); + +	/* +	 * finish_ordered_io has to update the inode, so add the space required +	 * for an inode update. +	 */ +	*meta_reserve += inode_update;  	*qgroup_reserve = nr_extents * fs_info->nodesize;  }  |