diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 49 | 
1 files changed, 21 insertions, 28 deletions
| diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 508bdbae29a0..0b4933c6a889 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -366,40 +366,35 @@ static struct btrfs_delayed_item *__btrfs_lookup_delayed_item(  	return NULL;  } +static int btrfs_delayed_item_cmp(const struct rb_node *new, +				  const struct rb_node *exist) +{ +	const struct btrfs_delayed_item *new_item = +		rb_entry(new, struct btrfs_delayed_item, rb_node); +	const struct btrfs_delayed_item *exist_item = +		rb_entry(exist, struct btrfs_delayed_item, rb_node); + +	if (new_item->index < exist_item->index) +		return -1; +	if (new_item->index > exist_item->index) +		return 1; +	return 0; +} +  static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,  				    struct btrfs_delayed_item *ins)  { -	struct rb_node **p, *node; -	struct rb_node *parent_node = NULL;  	struct rb_root_cached *root; -	struct btrfs_delayed_item *item; -	bool leftmost = true; +	struct rb_node *exist;  	if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)  		root = &delayed_node->ins_root;  	else  		root = &delayed_node->del_root; -	p = &root->rb_root.rb_node; -	node = &ins->rb_node; - -	while (*p) { -		parent_node = *p; -		item = rb_entry(parent_node, struct btrfs_delayed_item, -				 rb_node); - -		if (item->index < ins->index) { -			p = &(*p)->rb_right; -			leftmost = false; -		} else if (item->index > ins->index) { -			p = &(*p)->rb_left; -		} else { -			return -EEXIST; -		} -	} - -	rb_link_node(node, parent_node, p); -	rb_insert_color_cached(node, root, leftmost); +	exist = rb_find_add_cached(&ins->rb_node, root, btrfs_delayed_item_cmp); +	if (exist) +		return -EEXIST;  	if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&  	    ins->index >= delayed_node->index_cnt) @@ -1038,7 +1033,6 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,  				    struct btrfs_inode_item);  	write_extent_buffer(leaf, &node->inode_item, (unsigned long)inode_item,  			    sizeof(struct btrfs_inode_item)); -	btrfs_mark_buffer_dirty(trans, leaf);  	if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags))  		goto out; @@ -1561,8 +1555,7 @@ release_node:  	return ret;  } -static int btrfs_delete_delayed_insertion_item(struct btrfs_fs_info *fs_info, -					       struct btrfs_delayed_node *node, +static int btrfs_delete_delayed_insertion_item(struct btrfs_delayed_node *node,  					       u64 index)  {  	struct btrfs_delayed_item *item; @@ -1620,7 +1613,7 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,  	if (IS_ERR(node))  		return PTR_ERR(node); -	ret = btrfs_delete_delayed_insertion_item(trans->fs_info, node, index); +	ret = btrfs_delete_delayed_insertion_item(node, index);  	if (!ret)  		goto end; | 
