diff options
Diffstat (limited to 'fs/btrfs/backref.c')
| -rw-r--r-- | fs/btrfs/backref.c | 38 | 
1 files changed, 24 insertions, 14 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 11459fe84a29..982152d3f920 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -791,7 +791,7 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info,  			count = node->ref_mod * -1;  			break;  		default: -			BUG_ON(1); +			BUG();  		}  		*total_refs += count;  		switch (node->type) { @@ -1460,8 +1460,8 @@ int btrfs_find_all_roots(struct btrfs_trans_handle *trans,   * callers (such as fiemap) which want to know whether the extent is   * shared but do not need a ref count.   * - * This attempts to allocate a transaction in order to account for - * delayed refs, but continues on even when the alloc fails. + * This attempts to attach to the running transaction in order to account for + * delayed refs, but continues on even when no running transaction exists.   *   * Return: 0 if extent is not shared, 1 if it is shared, < 0 on error.   */ @@ -1484,13 +1484,16 @@ int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr)  	tmp = ulist_alloc(GFP_NOFS);  	roots = ulist_alloc(GFP_NOFS);  	if (!tmp || !roots) { -		ulist_free(tmp); -		ulist_free(roots); -		return -ENOMEM; +		ret = -ENOMEM; +		goto out;  	} -	trans = btrfs_join_transaction(root); +	trans = btrfs_attach_transaction(root);  	if (IS_ERR(trans)) { +		if (PTR_ERR(trans) != -ENOENT && PTR_ERR(trans) != -EROFS) { +			ret = PTR_ERR(trans); +			goto out; +		}  		trans = NULL;  		down_read(&fs_info->commit_root_sem);  	} else { @@ -1523,6 +1526,7 @@ int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr)  	} else {  		up_read(&fs_info->commit_root_sem);  	} +out:  	ulist_free(tmp);  	ulist_free(roots);  	return ret; @@ -1747,7 +1751,7 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,  		else if (flags & BTRFS_EXTENT_FLAG_DATA)  			*flags_ret = BTRFS_EXTENT_FLAG_DATA;  		else -			BUG_ON(1); +			BUG();  		return 0;  	} @@ -1912,13 +1916,19 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info,  			extent_item_objectid);  	if (!search_commit_root) { -		trans = btrfs_join_transaction(fs_info->extent_root); -		if (IS_ERR(trans)) -			return PTR_ERR(trans); +		trans = btrfs_attach_transaction(fs_info->extent_root); +		if (IS_ERR(trans)) { +			if (PTR_ERR(trans) != -ENOENT && +			    PTR_ERR(trans) != -EROFS) +				return PTR_ERR(trans); +			trans = NULL; +		} +	} + +	if (trans)  		btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); -	} else { +	else  		down_read(&fs_info->commit_root_sem); -	}  	ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,  				   tree_mod_seq_elem.seq, &refs, @@ -1951,7 +1961,7 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info,  	free_leaf_list(refs);  out: -	if (!search_commit_root) { +	if (trans) {  		btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);  		btrfs_end_transaction(trans);  	} else {  | 
