diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
| -rw-r--r-- | fs/btrfs/root-tree.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index f4099904565..24fb8ce4e07 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c @@ -93,10 +93,14 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root  	unsigned long ptr;  	path = btrfs_alloc_path(); -	BUG_ON(!path); +	if (!path) +		return -ENOMEM; +  	ret = btrfs_search_slot(trans, root, key, path, 0, 1); -	if (ret < 0) +	if (ret < 0) { +		btrfs_abort_transaction(trans, root, ret);  		goto out; +	}  	if (ret != 0) {  		btrfs_print_leaf(root, path->nodes[0]); @@ -116,13 +120,10 @@ out:  	return ret;  } -int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root -		      *root, struct btrfs_key *key, struct btrfs_root_item -		      *item) +int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, +		      struct btrfs_key *key, struct btrfs_root_item *item)  { -	int ret; -	ret = btrfs_insert_item(trans, root, key, item, sizeof(*item)); -	return ret; +	return btrfs_insert_item(trans, root, key, item, sizeof(*item));  }  /* @@ -384,6 +385,8 @@ int btrfs_find_root_ref(struct btrfs_root *tree_root,   *   * For a back ref the root_id is the id of the subvol or snapshot and   * ref_id is the id of the tree referencing it. + * + * Will return 0, -ENOMEM, or anything from the CoW path   */  int btrfs_add_root_ref(struct btrfs_trans_handle *trans,  		       struct btrfs_root *tree_root, @@ -407,7 +410,11 @@ int btrfs_add_root_ref(struct btrfs_trans_handle *trans,  again:  	ret = btrfs_insert_empty_item(trans, tree_root, path, &key,  				      sizeof(*ref) + name_len); -	BUG_ON(ret); +	if (ret) { +		btrfs_abort_transaction(trans, tree_root, ret); +		btrfs_free_path(path); +		return ret; +	}  	leaf = path->nodes[0];  	ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref);  |