diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 41 | 
1 files changed, 21 insertions, 20 deletions
| diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index f51b509f2d9b..c669f250d4a0 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -42,8 +42,8 @@ static inline void btrfs_init_delayed_node(  	delayed_node->root = root;  	delayed_node->inode_id = inode_id;  	refcount_set(&delayed_node->refs, 0); -	delayed_node->ins_root = RB_ROOT; -	delayed_node->del_root = RB_ROOT; +	delayed_node->ins_root = RB_ROOT_CACHED; +	delayed_node->del_root = RB_ROOT_CACHED;  	mutex_init(&delayed_node->mutex);  	INIT_LIST_HEAD(&delayed_node->n_list);  	INIT_LIST_HEAD(&delayed_node->p_list); @@ -390,7 +390,7 @@ static struct btrfs_delayed_item *__btrfs_lookup_delayed_insertion_item(  					struct btrfs_delayed_node *delayed_node,  					struct btrfs_key *key)  { -	return __btrfs_lookup_delayed_item(&delayed_node->ins_root, key, +	return __btrfs_lookup_delayed_item(&delayed_node->ins_root.rb_root, key,  					   NULL, NULL);  } @@ -400,9 +400,10 @@ static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,  {  	struct rb_node **p, *node;  	struct rb_node *parent_node = NULL; -	struct rb_root *root; +	struct rb_root_cached *root;  	struct btrfs_delayed_item *item;  	int cmp; +	bool leftmost = true;  	if (action == BTRFS_DELAYED_INSERTION_ITEM)  		root = &delayed_node->ins_root; @@ -410,7 +411,7 @@ static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,  		root = &delayed_node->del_root;  	else  		BUG(); -	p = &root->rb_node; +	p = &root->rb_root.rb_node;  	node = &ins->rb_node;  	while (*p) { @@ -419,16 +420,18 @@ static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,  				 rb_node);  		cmp = btrfs_comp_cpu_keys(&item->key, &ins->key); -		if (cmp < 0) +		if (cmp < 0) {  			p = &(*p)->rb_right; -		else if (cmp > 0) +			leftmost = false; +		} else if (cmp > 0) {  			p = &(*p)->rb_left; -		else +		} else {  			return -EEXIST; +		}  	}  	rb_link_node(node, parent_node, p); -	rb_insert_color(node, root); +	rb_insert_color_cached(node, root, leftmost);  	ins->delayed_node = delayed_node;  	ins->ins_or_del = action; @@ -468,7 +471,7 @@ static void finish_one_item(struct btrfs_delayed_root *delayed_root)  static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)  { -	struct rb_root *root; +	struct rb_root_cached *root;  	struct btrfs_delayed_root *delayed_root;  	delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root; @@ -482,7 +485,7 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)  	else  		root = &delayed_item->delayed_node->del_root; -	rb_erase(&delayed_item->rb_node, root); +	rb_erase_cached(&delayed_item->rb_node, root);  	delayed_item->delayed_node->count--;  	finish_one_item(delayed_root); @@ -503,7 +506,7 @@ static struct btrfs_delayed_item *__btrfs_first_delayed_insertion_item(  	struct rb_node *p;  	struct btrfs_delayed_item *item = NULL; -	p = rb_first(&delayed_node->ins_root); +	p = rb_first_cached(&delayed_node->ins_root);  	if (p)  		item = rb_entry(p, struct btrfs_delayed_item, rb_node); @@ -516,7 +519,7 @@ static struct btrfs_delayed_item *__btrfs_first_delayed_deletion_item(  	struct rb_node *p;  	struct btrfs_delayed_item *item = NULL; -	p = rb_first(&delayed_node->del_root); +	p = rb_first_cached(&delayed_node->del_root);  	if (p)  		item = rb_entry(p, struct btrfs_delayed_item, rb_node); @@ -559,7 +562,7 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,  	 * reserved space when starting a transaction.  So no need to reserve  	 * qgroup space here.  	 */ -	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1); +	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true);  	if (!ret) {  		trace_btrfs_space_reservation(fs_info, "delayed_item",  					      item->key.objectid, @@ -647,7 +650,7 @@ static int btrfs_delayed_inode_reserve_metadata(  		return ret;  	} -	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1); +	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true);  	if (!ret) {  		trace_btrfs_space_reservation(fs_info, "delayed_inode",  					      btrfs_ino(inode), num_bytes, 1); @@ -762,9 +765,6 @@ static int btrfs_batch_insert_items(struct btrfs_root *root,  		i++;  	} -	/* reset all the locked nodes in the patch to spinning locks. */ -	btrfs_clear_path_blocking(path, NULL, 0); -  	/* insert the keys of the items */  	setup_items_for_insert(root, path, keys, data_size,  			       total_data_size, total_size, nitems); @@ -1462,7 +1462,7 @@ int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans,  	if (unlikely(ret)) {  		btrfs_err(trans->fs_info,  			  "err add delayed dir index item(name: %.*s) into the insertion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)", -			  name_len, name, delayed_node->root->objectid, +			  name_len, name, delayed_node->root->root_key.objectid,  			  delayed_node->inode_id, ret);  		BUG();  	} @@ -1533,7 +1533,8 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,  	if (unlikely(ret)) {  		btrfs_err(trans->fs_info,  			  "err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)", -			  index, node->root->objectid, node->inode_id, ret); +			  index, node->root->root_key.objectid, +			  node->inode_id, ret);  		BUG();  	}  	mutex_unlock(&node->mutex); |