diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.c')
| -rw-r--r-- | fs/btrfs/delayed-ref.c | 51 | 
1 files changed, 8 insertions, 43 deletions
| diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 6cc80fb10da2..2ac9296edccb 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -195,48 +195,6 @@ void btrfs_dec_delayed_refs_rsv_bg_updates(struct btrfs_fs_info *fs_info)  }  /* - * Transfer bytes to our delayed refs rsv. - * - * @fs_info:   the filesystem - * @num_bytes: number of bytes to transfer - * - * This transfers up to the num_bytes amount, previously reserved, to the - * delayed_refs_rsv.  Any extra bytes are returned to the space info. - */ -void btrfs_migrate_to_delayed_refs_rsv(struct btrfs_fs_info *fs_info, -				       u64 num_bytes) -{ -	struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv; -	u64 to_free = 0; - -	spin_lock(&delayed_refs_rsv->lock); -	if (delayed_refs_rsv->size > delayed_refs_rsv->reserved) { -		u64 delta = delayed_refs_rsv->size - -			delayed_refs_rsv->reserved; -		if (num_bytes > delta) { -			to_free = num_bytes - delta; -			num_bytes = delta; -		} -	} else { -		to_free = num_bytes; -		num_bytes = 0; -	} - -	if (num_bytes) -		delayed_refs_rsv->reserved += num_bytes; -	if (delayed_refs_rsv->reserved >= delayed_refs_rsv->size) -		delayed_refs_rsv->full = true; -	spin_unlock(&delayed_refs_rsv->lock); - -	if (num_bytes) -		trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv", -					      0, num_bytes, 1); -	if (to_free) -		btrfs_space_info_free_bytes_may_use(fs_info, -				delayed_refs_rsv->space_info, to_free); -} - -/*   * Refill based on our delayed refs usage.   *   * @fs_info: the filesystem @@ -861,6 +819,12 @@ static void init_delayed_ref_head(struct btrfs_delayed_ref_head *head_ref,  	spin_lock_init(&head_ref->lock);  	mutex_init(&head_ref->mutex); +	/* If not metadata set an impossible level to help debugging. */ +	if (generic_ref->type == BTRFS_REF_METADATA) +		head_ref->level = generic_ref->tree_ref.level; +	else +		head_ref->level = U8_MAX; +  	if (qrecord) {  		if (generic_ref->ref_root && reserved) {  			qrecord->data_rsv = reserved; @@ -1114,7 +1078,7 @@ int btrfs_add_delayed_data_ref(struct btrfs_trans_handle *trans,  }  int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans, -				u64 bytenr, u64 num_bytes, +				u64 bytenr, u64 num_bytes, u8 level,  				struct btrfs_delayed_extent_op *extent_op)  {  	struct btrfs_delayed_ref_head *head_ref; @@ -1124,6 +1088,7 @@ int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans,  		.action = BTRFS_UPDATE_DELAYED_HEAD,  		.bytenr = bytenr,  		.num_bytes = num_bytes, +		.tree_ref.level = level,  	};  	head_ref = kmem_cache_alloc(btrfs_delayed_ref_head_cachep, GFP_NOFS); |