diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 16 | 
1 files changed, 10 insertions, 6 deletions
| diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 3fd736a02c1e..25ef6e3fd306 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3275,20 +3275,20 @@ out_delayed_unlock:  }  void btrfs_free_tree_block(struct btrfs_trans_handle *trans, -			   struct btrfs_root *root, +			   u64 root_id,  			   struct extent_buffer *buf,  			   u64 parent, int last_ref)  { -	struct btrfs_fs_info *fs_info = root->fs_info; +	struct btrfs_fs_info *fs_info = trans->fs_info;  	struct btrfs_ref generic_ref = { 0 };  	int ret;  	btrfs_init_generic_ref(&generic_ref, BTRFS_DROP_DELAYED_REF,  			       buf->start, buf->len, parent);  	btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf), -			    root->root_key.objectid, 0, false); +			    root_id, 0, false); -	if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) { +	if (root_id != BTRFS_TREE_LOG_OBJECTID) {  		btrfs_ref_tree_mod(fs_info, &generic_ref);  		ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);  		BUG_ON(ret); /* -ENOMEM */ @@ -3298,7 +3298,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,  		struct btrfs_block_group *cache;  		bool must_pin = false; -		if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) { +		if (root_id != BTRFS_TREE_LOG_OBJECTID) {  			ret = check_ref_cleanup(trans, buf->start);  			if (!ret) {  				btrfs_redirty_list_add(trans->transaction, buf); @@ -5472,7 +5472,8 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,  			goto owner_mismatch;  	} -	btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1); +	btrfs_free_tree_block(trans, btrfs_root_id(root), eb, parent, +			      wc->refs[level] == 1);  out:  	wc->refs[level] = 0;  	wc->flags[level] = 0; @@ -6051,6 +6052,9 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)  	int dev_ret = 0;  	int ret = 0; +	if (range->start == U64_MAX) +		return -EINVAL; +  	/*  	 * Check range overflow if range->len is set.  	 * The default range->len is U64_MAX. |