Lines Matching +full:root +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0
10 #include "delayed-inode.h"
11 #include "disk-io.h"
31 return -ENOMEM; in btrfs_delayed_inode_init()
42 struct btrfs_root *root, u64 inode_id) in btrfs_init_delayed_node() argument
44 delayed_node->root = root; in btrfs_init_delayed_node()
45 delayed_node->inode_id = inode_id; in btrfs_init_delayed_node()
46 refcount_set(&delayed_node->refs, 0); in btrfs_init_delayed_node()
47 delayed_node->ins_root = RB_ROOT_CACHED; in btrfs_init_delayed_node()
48 delayed_node->del_root = RB_ROOT_CACHED; in btrfs_init_delayed_node()
49 mutex_init(&delayed_node->mutex); in btrfs_init_delayed_node()
50 INIT_LIST_HEAD(&delayed_node->n_list); in btrfs_init_delayed_node()
51 INIT_LIST_HEAD(&delayed_node->p_list); in btrfs_init_delayed_node()
58 if (item1->key.type == BTRFS_DIR_INDEX_KEY && in btrfs_is_continuous_delayed_item()
59 item1->key.objectid == item2->key.objectid && in btrfs_is_continuous_delayed_item()
60 item1->key.type == item2->key.type && in btrfs_is_continuous_delayed_item()
61 item1->key.offset + 1 == item2->key.offset) in btrfs_is_continuous_delayed_item()
69 struct btrfs_root *root = btrfs_inode->root; in btrfs_get_delayed_node() local
71 struct btrfs_delayed_node *node; in btrfs_get_delayed_node() local
73 node = READ_ONCE(btrfs_inode->delayed_node); in btrfs_get_delayed_node()
74 if (node) { in btrfs_get_delayed_node()
75 refcount_inc(&node->refs); in btrfs_get_delayed_node()
76 return node; in btrfs_get_delayed_node()
79 spin_lock(&root->inode_lock); in btrfs_get_delayed_node()
80 node = radix_tree_lookup(&root->delayed_nodes_tree, ino); in btrfs_get_delayed_node()
82 if (node) { in btrfs_get_delayed_node()
83 if (btrfs_inode->delayed_node) { in btrfs_get_delayed_node()
84 refcount_inc(&node->refs); /* can be accessed */ in btrfs_get_delayed_node()
85 BUG_ON(btrfs_inode->delayed_node != node); in btrfs_get_delayed_node()
86 spin_unlock(&root->inode_lock); in btrfs_get_delayed_node()
87 return node; in btrfs_get_delayed_node()
92 * this node from the radix tree. In this case, the refcount in btrfs_get_delayed_node()
102 * If this node is properly in the radix, we want to bump the in btrfs_get_delayed_node()
106 if (refcount_inc_not_zero(&node->refs)) { in btrfs_get_delayed_node()
107 refcount_inc(&node->refs); in btrfs_get_delayed_node()
108 btrfs_inode->delayed_node = node; in btrfs_get_delayed_node()
110 node = NULL; in btrfs_get_delayed_node()
113 spin_unlock(&root->inode_lock); in btrfs_get_delayed_node()
114 return node; in btrfs_get_delayed_node()
116 spin_unlock(&root->inode_lock); in btrfs_get_delayed_node()
121 /* Will return either the node or PTR_ERR(-ENOMEM) */
125 struct btrfs_delayed_node *node; in btrfs_get_or_create_delayed_node() local
126 struct btrfs_root *root = btrfs_inode->root; in btrfs_get_or_create_delayed_node() local
131 node = btrfs_get_delayed_node(btrfs_inode); in btrfs_get_or_create_delayed_node()
132 if (node) in btrfs_get_or_create_delayed_node()
133 return node; in btrfs_get_or_create_delayed_node()
135 node = kmem_cache_zalloc(delayed_node_cache, GFP_NOFS); in btrfs_get_or_create_delayed_node()
136 if (!node) in btrfs_get_or_create_delayed_node()
137 return ERR_PTR(-ENOMEM); in btrfs_get_or_create_delayed_node()
138 btrfs_init_delayed_node(node, root, ino); in btrfs_get_or_create_delayed_node()
141 refcount_set(&node->refs, 2); in btrfs_get_or_create_delayed_node()
145 kmem_cache_free(delayed_node_cache, node); in btrfs_get_or_create_delayed_node()
149 spin_lock(&root->inode_lock); in btrfs_get_or_create_delayed_node()
150 ret = radix_tree_insert(&root->delayed_nodes_tree, ino, node); in btrfs_get_or_create_delayed_node()
151 if (ret == -EEXIST) { in btrfs_get_or_create_delayed_node()
152 spin_unlock(&root->inode_lock); in btrfs_get_or_create_delayed_node()
153 kmem_cache_free(delayed_node_cache, node); in btrfs_get_or_create_delayed_node()
157 btrfs_inode->delayed_node = node; in btrfs_get_or_create_delayed_node()
158 spin_unlock(&root->inode_lock); in btrfs_get_or_create_delayed_node()
161 return node; in btrfs_get_or_create_delayed_node()
165 * Call it when holding delayed_node->mutex
167 * If mod = 1, add this node into the prepared list.
169 static void btrfs_queue_delayed_node(struct btrfs_delayed_root *root, in btrfs_queue_delayed_node() argument
170 struct btrfs_delayed_node *node, in btrfs_queue_delayed_node() argument
173 spin_lock(&root->lock); in btrfs_queue_delayed_node()
174 if (test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { in btrfs_queue_delayed_node()
175 if (!list_empty(&node->p_list)) in btrfs_queue_delayed_node()
176 list_move_tail(&node->p_list, &root->prepare_list); in btrfs_queue_delayed_node()
178 list_add_tail(&node->p_list, &root->prepare_list); in btrfs_queue_delayed_node()
180 list_add_tail(&node->n_list, &root->node_list); in btrfs_queue_delayed_node()
181 list_add_tail(&node->p_list, &root->prepare_list); in btrfs_queue_delayed_node()
182 refcount_inc(&node->refs); /* inserted into list */ in btrfs_queue_delayed_node()
183 root->nodes++; in btrfs_queue_delayed_node()
184 set_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags); in btrfs_queue_delayed_node()
186 spin_unlock(&root->lock); in btrfs_queue_delayed_node()
189 /* Call it when holding delayed_node->mutex */
190 static void btrfs_dequeue_delayed_node(struct btrfs_delayed_root *root, in btrfs_dequeue_delayed_node() argument
191 struct btrfs_delayed_node *node) in btrfs_dequeue_delayed_node() argument
193 spin_lock(&root->lock); in btrfs_dequeue_delayed_node()
194 if (test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { in btrfs_dequeue_delayed_node()
195 root->nodes--; in btrfs_dequeue_delayed_node()
196 refcount_dec(&node->refs); /* not in the list */ in btrfs_dequeue_delayed_node()
197 list_del_init(&node->n_list); in btrfs_dequeue_delayed_node()
198 if (!list_empty(&node->p_list)) in btrfs_dequeue_delayed_node()
199 list_del_init(&node->p_list); in btrfs_dequeue_delayed_node()
200 clear_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags); in btrfs_dequeue_delayed_node()
202 spin_unlock(&root->lock); in btrfs_dequeue_delayed_node()
209 struct btrfs_delayed_node *node = NULL; in btrfs_first_delayed_node() local
211 spin_lock(&delayed_root->lock); in btrfs_first_delayed_node()
212 if (list_empty(&delayed_root->node_list)) in btrfs_first_delayed_node()
215 p = delayed_root->node_list.next; in btrfs_first_delayed_node()
216 node = list_entry(p, struct btrfs_delayed_node, n_list); in btrfs_first_delayed_node()
217 refcount_inc(&node->refs); in btrfs_first_delayed_node()
219 spin_unlock(&delayed_root->lock); in btrfs_first_delayed_node()
221 return node; in btrfs_first_delayed_node()
225 struct btrfs_delayed_node *node) in btrfs_next_delayed_node() argument
231 delayed_root = node->root->fs_info->delayed_root; in btrfs_next_delayed_node()
232 spin_lock(&delayed_root->lock); in btrfs_next_delayed_node()
233 if (!test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { in btrfs_next_delayed_node()
235 if (list_empty(&delayed_root->node_list)) in btrfs_next_delayed_node()
237 p = delayed_root->node_list.next; in btrfs_next_delayed_node()
238 } else if (list_is_last(&node->n_list, &delayed_root->node_list)) in btrfs_next_delayed_node()
241 p = node->n_list.next; in btrfs_next_delayed_node()
244 refcount_inc(&next->refs); in btrfs_next_delayed_node()
246 spin_unlock(&delayed_root->lock); in btrfs_next_delayed_node()
260 delayed_root = delayed_node->root->fs_info->delayed_root; in __btrfs_release_delayed_node()
262 mutex_lock(&delayed_node->mutex); in __btrfs_release_delayed_node()
263 if (delayed_node->count) in __btrfs_release_delayed_node()
267 mutex_unlock(&delayed_node->mutex); in __btrfs_release_delayed_node()
269 if (refcount_dec_and_test(&delayed_node->refs)) { in __btrfs_release_delayed_node()
270 struct btrfs_root *root = delayed_node->root; in __btrfs_release_delayed_node() local
272 spin_lock(&root->inode_lock); in __btrfs_release_delayed_node()
277 ASSERT(refcount_read(&delayed_node->refs) == 0); in __btrfs_release_delayed_node()
278 radix_tree_delete(&root->delayed_nodes_tree, in __btrfs_release_delayed_node()
279 delayed_node->inode_id); in __btrfs_release_delayed_node()
280 spin_unlock(&root->inode_lock); in __btrfs_release_delayed_node()
285 static inline void btrfs_release_delayed_node(struct btrfs_delayed_node *node) in btrfs_release_delayed_node() argument
287 __btrfs_release_delayed_node(node, 0); in btrfs_release_delayed_node()
294 struct btrfs_delayed_node *node = NULL; in btrfs_first_prepared_delayed_node() local
296 spin_lock(&delayed_root->lock); in btrfs_first_prepared_delayed_node()
297 if (list_empty(&delayed_root->prepare_list)) in btrfs_first_prepared_delayed_node()
300 p = delayed_root->prepare_list.next; in btrfs_first_prepared_delayed_node()
302 node = list_entry(p, struct btrfs_delayed_node, p_list); in btrfs_first_prepared_delayed_node()
303 refcount_inc(&node->refs); in btrfs_first_prepared_delayed_node()
305 spin_unlock(&delayed_root->lock); in btrfs_first_prepared_delayed_node()
307 return node; in btrfs_first_prepared_delayed_node()
311 struct btrfs_delayed_node *node) in btrfs_release_prepared_delayed_node() argument
313 __btrfs_release_delayed_node(node, 1); in btrfs_release_prepared_delayed_node()
321 item->data_len = data_len; in btrfs_alloc_delayed_item()
322 item->ins_or_del = 0; in btrfs_alloc_delayed_item()
323 item->bytes_reserved = 0; in btrfs_alloc_delayed_item()
324 item->delayed_node = NULL; in btrfs_alloc_delayed_item()
325 refcount_set(&item->refs, 1); in btrfs_alloc_delayed_item()
331 * __btrfs_lookup_delayed_item - look up the delayed item by key
332 * @delayed_node: pointer to the delayed node
341 struct rb_root *root, in __btrfs_lookup_delayed_item() argument
346 struct rb_node *node, *prev_node = NULL; in __btrfs_lookup_delayed_item() local
350 node = root->rb_node; in __btrfs_lookup_delayed_item()
352 while (node) { in __btrfs_lookup_delayed_item()
353 delayed_item = rb_entry(node, struct btrfs_delayed_item, in __btrfs_lookup_delayed_item()
355 prev_node = node; in __btrfs_lookup_delayed_item()
356 ret = btrfs_comp_cpu_keys(&delayed_item->key, key); in __btrfs_lookup_delayed_item()
358 node = node->rb_right; in __btrfs_lookup_delayed_item()
360 node = node->rb_left; in __btrfs_lookup_delayed_item()
370 else if ((node = rb_prev(prev_node)) != NULL) { in __btrfs_lookup_delayed_item()
371 *prev = rb_entry(node, struct btrfs_delayed_item, in __btrfs_lookup_delayed_item()
382 else if ((node = rb_next(prev_node)) != NULL) { in __btrfs_lookup_delayed_item()
383 *next = rb_entry(node, struct btrfs_delayed_item, in __btrfs_lookup_delayed_item()
395 return __btrfs_lookup_delayed_item(&delayed_node->ins_root.rb_root, key, in __btrfs_lookup_delayed_insertion_item()
403 struct rb_node **p, *node; in __btrfs_add_delayed_item() local
405 struct rb_root_cached *root; in __btrfs_add_delayed_item() local
411 root = &delayed_node->ins_root; in __btrfs_add_delayed_item()
413 root = &delayed_node->del_root; in __btrfs_add_delayed_item()
416 p = &root->rb_root.rb_node; in __btrfs_add_delayed_item()
417 node = &ins->rb_node; in __btrfs_add_delayed_item()
424 cmp = btrfs_comp_cpu_keys(&item->key, &ins->key); in __btrfs_add_delayed_item()
426 p = &(*p)->rb_right; in __btrfs_add_delayed_item()
429 p = &(*p)->rb_left; in __btrfs_add_delayed_item()
431 return -EEXIST; in __btrfs_add_delayed_item()
435 rb_link_node(node, parent_node, p); in __btrfs_add_delayed_item()
436 rb_insert_color_cached(node, root, leftmost); in __btrfs_add_delayed_item()
437 ins->delayed_node = delayed_node; in __btrfs_add_delayed_item()
438 ins->ins_or_del = action; in __btrfs_add_delayed_item()
440 if (ins->key.type == BTRFS_DIR_INDEX_KEY && in __btrfs_add_delayed_item()
442 ins->key.offset >= delayed_node->index_cnt) in __btrfs_add_delayed_item()
443 delayed_node->index_cnt = ins->key.offset + 1; in __btrfs_add_delayed_item()
445 delayed_node->count++; in __btrfs_add_delayed_item()
446 atomic_inc(&delayed_node->root->fs_info->delayed_root->items); in __btrfs_add_delayed_item()
450 static int __btrfs_add_delayed_insertion_item(struct btrfs_delayed_node *node, in __btrfs_add_delayed_insertion_item() argument
453 return __btrfs_add_delayed_item(node, item, in __btrfs_add_delayed_insertion_item()
457 static int __btrfs_add_delayed_deletion_item(struct btrfs_delayed_node *node, in __btrfs_add_delayed_deletion_item() argument
460 return __btrfs_add_delayed_item(node, item, in __btrfs_add_delayed_deletion_item()
466 int seq = atomic_inc_return(&delayed_root->items_seq); in finish_one_item()
469 if ((atomic_dec_return(&delayed_root->items) < in finish_one_item()
471 cond_wake_up_nomb(&delayed_root->wait); in finish_one_item()
476 struct rb_root_cached *root; in __btrfs_remove_delayed_item() local
480 if (!delayed_item->delayed_node) in __btrfs_remove_delayed_item()
482 delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root; in __btrfs_remove_delayed_item()
485 BUG_ON(delayed_item->ins_or_del != BTRFS_DELAYED_DELETION_ITEM && in __btrfs_remove_delayed_item()
486 delayed_item->ins_or_del != BTRFS_DELAYED_INSERTION_ITEM); in __btrfs_remove_delayed_item()
488 if (delayed_item->ins_or_del == BTRFS_DELAYED_INSERTION_ITEM) in __btrfs_remove_delayed_item()
489 root = &delayed_item->delayed_node->ins_root; in __btrfs_remove_delayed_item()
491 root = &delayed_item->delayed_node->del_root; in __btrfs_remove_delayed_item()
493 rb_erase_cached(&delayed_item->rb_node, root); in __btrfs_remove_delayed_item()
494 delayed_item->delayed_node->count--; in __btrfs_remove_delayed_item()
503 if (refcount_dec_and_test(&item->refs)) in btrfs_release_delayed_item()
514 p = rb_first_cached(&delayed_node->ins_root); in __btrfs_first_delayed_insertion_item()
527 p = rb_first_cached(&delayed_node->del_root); in __btrfs_first_delayed_deletion_item()
540 p = rb_next(&item->rb_node); in __btrfs_next_delayed_item()
548 struct btrfs_root *root, in btrfs_delayed_item_reserve_metadata() argument
553 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_delayed_item_reserve_metadata()
557 if (!trans->bytes_reserved) in btrfs_delayed_item_reserve_metadata()
560 src_rsv = trans->block_rsv; in btrfs_delayed_item_reserve_metadata()
561 dst_rsv = &fs_info->delayed_block_rsv; in btrfs_delayed_item_reserve_metadata()
573 item->key.objectid, in btrfs_delayed_item_reserve_metadata()
575 item->bytes_reserved = num_bytes; in btrfs_delayed_item_reserve_metadata()
581 static void btrfs_delayed_item_release_metadata(struct btrfs_root *root, in btrfs_delayed_item_release_metadata() argument
585 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_delayed_item_release_metadata()
587 if (!item->bytes_reserved) in btrfs_delayed_item_release_metadata()
590 rsv = &fs_info->delayed_block_rsv; in btrfs_delayed_item_release_metadata()
596 item->key.objectid, item->bytes_reserved, in btrfs_delayed_item_release_metadata()
598 btrfs_block_rsv_release(fs_info, rsv, item->bytes_reserved, NULL); in btrfs_delayed_item_release_metadata()
603 struct btrfs_root *root, in btrfs_delayed_inode_reserve_metadata() argument
604 struct btrfs_delayed_node *node) in btrfs_delayed_inode_reserve_metadata() argument
606 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_delayed_inode_reserve_metadata()
612 src_rsv = trans->block_rsv; in btrfs_delayed_inode_reserve_metadata()
613 dst_rsv = &fs_info->delayed_block_rsv; in btrfs_delayed_inode_reserve_metadata()
626 if (!src_rsv || (!trans->bytes_reserved && in btrfs_delayed_inode_reserve_metadata()
627 src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) { in btrfs_delayed_inode_reserve_metadata()
628 ret = btrfs_qgroup_reserve_meta(root, num_bytes, in btrfs_delayed_inode_reserve_metadata()
632 ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes, in btrfs_delayed_inode_reserve_metadata()
634 /* NO_FLUSH could only fail with -ENOSPC */ in btrfs_delayed_inode_reserve_metadata()
635 ASSERT(ret == 0 || ret == -ENOSPC); in btrfs_delayed_inode_reserve_metadata()
637 btrfs_qgroup_free_meta_prealloc(root, num_bytes); in btrfs_delayed_inode_reserve_metadata()
644 node->inode_id, num_bytes, 1); in btrfs_delayed_inode_reserve_metadata()
645 node->bytes_reserved = num_bytes; in btrfs_delayed_inode_reserve_metadata()
652 struct btrfs_delayed_node *node, in btrfs_delayed_inode_release_metadata() argument
657 if (!node->bytes_reserved) in btrfs_delayed_inode_release_metadata()
660 rsv = &fs_info->delayed_block_rsv; in btrfs_delayed_inode_release_metadata()
662 node->inode_id, node->bytes_reserved, 0); in btrfs_delayed_inode_release_metadata()
663 btrfs_block_rsv_release(fs_info, rsv, node->bytes_reserved, NULL); in btrfs_delayed_inode_release_metadata()
665 btrfs_qgroup_free_meta_prealloc(node->root, in btrfs_delayed_inode_release_metadata()
666 node->bytes_reserved); in btrfs_delayed_inode_release_metadata()
668 btrfs_qgroup_convert_reserved_meta(node->root, in btrfs_delayed_inode_release_metadata()
669 node->bytes_reserved); in btrfs_delayed_inode_release_metadata()
670 node->bytes_reserved = 0; in btrfs_delayed_inode_release_metadata()
678 struct btrfs_root *root, in btrfs_insert_delayed_item() argument
685 const int max_size = BTRFS_LEAF_DATA_SIZE(root->fs_info); in btrfs_insert_delayed_item()
693 list_add_tail(&first_item->tree_list, &batch); in btrfs_insert_delayed_item()
695 total_size = first_item->data_len + sizeof(struct btrfs_item); in btrfs_insert_delayed_item()
705 next_size = next->data_len + sizeof(struct btrfs_item); in btrfs_insert_delayed_item()
709 list_add_tail(&next->tree_list, &batch); in btrfs_insert_delayed_item()
716 ins_keys = &first_item->key; in btrfs_insert_delayed_item()
717 ins_sizes = &first_item->data_len; in btrfs_insert_delayed_item()
724 ret = -ENOMEM; in btrfs_insert_delayed_item()
730 ins_keys[i] = curr->key; in btrfs_insert_delayed_item()
731 ins_sizes[i] = curr->data_len; in btrfs_insert_delayed_item()
736 ret = btrfs_insert_empty_items(trans, root, path, ins_keys, ins_sizes, in btrfs_insert_delayed_item()
744 data_ptr = btrfs_item_ptr(path->nodes[0], path->slots[0], char); in btrfs_insert_delayed_item()
745 write_extent_buffer(path->nodes[0], &curr->data, in btrfs_insert_delayed_item()
746 (unsigned long)data_ptr, curr->data_len); in btrfs_insert_delayed_item()
747 path->slots[0]++; in btrfs_insert_delayed_item()
758 list_del(&curr->tree_list); in btrfs_insert_delayed_item()
759 btrfs_delayed_item_release_metadata(root, curr); in btrfs_insert_delayed_item()
769 struct btrfs_root *root, in btrfs_insert_delayed_items() argument
770 struct btrfs_delayed_node *node) in btrfs_insert_delayed_items() argument
777 mutex_lock(&node->mutex); in btrfs_insert_delayed_items()
778 curr = __btrfs_first_delayed_insertion_item(node); in btrfs_insert_delayed_items()
780 mutex_unlock(&node->mutex); in btrfs_insert_delayed_items()
783 ret = btrfs_insert_delayed_item(trans, root, path, curr); in btrfs_insert_delayed_items()
784 mutex_unlock(&node->mutex); in btrfs_insert_delayed_items()
791 struct btrfs_root *root, in btrfs_batch_delete_items() argument
802 BUG_ON(!path->nodes[0]); in btrfs_batch_delete_items()
804 leaf = path->nodes[0]; in btrfs_batch_delete_items()
806 i = path->slots[0]; in btrfs_batch_delete_items()
807 last_item = btrfs_header_nritems(leaf) - 1; in btrfs_batch_delete_items()
809 return -ENOENT; /* FIXME: Is errno suitable? */ in btrfs_batch_delete_items()
818 while (btrfs_comp_cpu_keys(&next->key, &key) == 0) { in btrfs_batch_delete_items()
819 list_add_tail(&next->tree_list, &head); in btrfs_batch_delete_items()
839 ret = btrfs_del_items(trans, root, path, path->slots[0], nitems); in btrfs_batch_delete_items()
844 btrfs_delayed_item_release_metadata(root, curr); in btrfs_batch_delete_items()
845 list_del(&curr->tree_list); in btrfs_batch_delete_items()
855 struct btrfs_root *root, in btrfs_delete_delayed_items() argument
856 struct btrfs_delayed_node *node) in btrfs_delete_delayed_items() argument
862 mutex_lock(&node->mutex); in btrfs_delete_delayed_items()
863 curr = __btrfs_first_delayed_deletion_item(node); in btrfs_delete_delayed_items()
867 ret = btrfs_search_slot(trans, root, &curr->key, path, -1, 1); in btrfs_delete_delayed_items()
872 * can't find the item which the node points to, so this node in btrfs_delete_delayed_items()
881 mutex_unlock(&node->mutex); in btrfs_delete_delayed_items()
887 btrfs_batch_delete_items(trans, root, path, curr); in btrfs_delete_delayed_items()
889 mutex_unlock(&node->mutex); in btrfs_delete_delayed_items()
894 mutex_unlock(&node->mutex); in btrfs_delete_delayed_items()
903 test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { in btrfs_release_delayed_inode()
904 BUG_ON(!delayed_node->root); in btrfs_release_delayed_inode()
905 clear_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags); in btrfs_release_delayed_inode()
906 delayed_node->count--; in btrfs_release_delayed_inode()
908 delayed_root = delayed_node->root->fs_info->delayed_root; in btrfs_release_delayed_inode()
916 if (test_and_clear_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) { in btrfs_release_delayed_iref()
919 ASSERT(delayed_node->root); in btrfs_release_delayed_iref()
920 delayed_node->count--; in btrfs_release_delayed_iref()
922 delayed_root = delayed_node->root->fs_info->delayed_root; in btrfs_release_delayed_iref()
928 struct btrfs_root *root, in __btrfs_update_delayed_inode() argument
930 struct btrfs_delayed_node *node) in __btrfs_update_delayed_inode() argument
932 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_update_delayed_inode()
939 key.objectid = node->inode_id; in __btrfs_update_delayed_inode()
943 if (test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags)) in __btrfs_update_delayed_inode()
944 mod = -1; in __btrfs_update_delayed_inode()
948 ret = btrfs_lookup_inode(trans, root, path, &key, mod); in __btrfs_update_delayed_inode()
950 ret = -ENOENT; in __btrfs_update_delayed_inode()
954 leaf = path->nodes[0]; in __btrfs_update_delayed_inode()
955 inode_item = btrfs_item_ptr(leaf, path->slots[0], in __btrfs_update_delayed_inode()
957 write_extent_buffer(leaf, &node->inode_item, (unsigned long)inode_item, in __btrfs_update_delayed_inode()
961 if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags)) in __btrfs_update_delayed_inode()
964 path->slots[0]++; in __btrfs_update_delayed_inode()
965 if (path->slots[0] >= btrfs_header_nritems(leaf)) in __btrfs_update_delayed_inode()
968 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in __btrfs_update_delayed_inode()
969 if (key.objectid != node->inode_id) in __btrfs_update_delayed_inode()
981 btrfs_del_item(trans, root, path); in __btrfs_update_delayed_inode()
983 btrfs_release_delayed_iref(node); in __btrfs_update_delayed_inode()
986 btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0)); in __btrfs_update_delayed_inode()
987 btrfs_release_delayed_inode(node); in __btrfs_update_delayed_inode()
994 if (ret && ret != -ENOENT) in __btrfs_update_delayed_inode()
1003 key.offset = -1; in __btrfs_update_delayed_inode()
1005 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in __btrfs_update_delayed_inode()
1011 leaf = path->nodes[0]; in __btrfs_update_delayed_inode()
1012 path->slots[0]--; in __btrfs_update_delayed_inode()
1017 struct btrfs_root *root, in btrfs_update_delayed_inode() argument
1019 struct btrfs_delayed_node *node) in btrfs_update_delayed_inode() argument
1023 mutex_lock(&node->mutex); in btrfs_update_delayed_inode()
1024 if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &node->flags)) { in btrfs_update_delayed_inode()
1025 mutex_unlock(&node->mutex); in btrfs_update_delayed_inode()
1029 ret = __btrfs_update_delayed_inode(trans, root, path, node); in btrfs_update_delayed_inode()
1030 mutex_unlock(&node->mutex); in btrfs_update_delayed_inode()
1037 struct btrfs_delayed_node *node) in __btrfs_commit_inode_delayed_items() argument
1041 ret = btrfs_insert_delayed_items(trans, path, node->root, node); in __btrfs_commit_inode_delayed_items()
1045 ret = btrfs_delete_delayed_items(trans, path, node->root, node); in __btrfs_commit_inode_delayed_items()
1049 ret = btrfs_update_delayed_inode(trans, node->root, path, node); in __btrfs_commit_inode_delayed_items()
1061 struct btrfs_fs_info *fs_info = trans->fs_info; in __btrfs_run_delayed_items()
1070 return -EIO; in __btrfs_run_delayed_items()
1074 return -ENOMEM; in __btrfs_run_delayed_items()
1076 block_rsv = trans->block_rsv; in __btrfs_run_delayed_items()
1077 trans->block_rsv = &fs_info->delayed_block_rsv; in __btrfs_run_delayed_items()
1079 delayed_root = fs_info->delayed_root; in __btrfs_run_delayed_items()
1082 while (curr_node && (!count || nr--)) { in __btrfs_run_delayed_items()
1100 trans->block_rsv = block_rsv; in __btrfs_run_delayed_items()
1107 return __btrfs_run_delayed_items(trans, -1); in btrfs_run_delayed_items()
1126 mutex_lock(&delayed_node->mutex); in btrfs_commit_inode_delayed_items()
1127 if (!delayed_node->count) { in btrfs_commit_inode_delayed_items()
1128 mutex_unlock(&delayed_node->mutex); in btrfs_commit_inode_delayed_items()
1132 mutex_unlock(&delayed_node->mutex); in btrfs_commit_inode_delayed_items()
1137 return -ENOMEM; in btrfs_commit_inode_delayed_items()
1140 block_rsv = trans->block_rsv; in btrfs_commit_inode_delayed_items()
1141 trans->block_rsv = &delayed_node->root->fs_info->delayed_block_rsv; in btrfs_commit_inode_delayed_items()
1147 trans->block_rsv = block_rsv; in btrfs_commit_inode_delayed_items()
1154 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_commit_inode_delayed_inode()
1164 mutex_lock(&delayed_node->mutex); in btrfs_commit_inode_delayed_inode()
1165 if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { in btrfs_commit_inode_delayed_inode()
1166 mutex_unlock(&delayed_node->mutex); in btrfs_commit_inode_delayed_inode()
1170 mutex_unlock(&delayed_node->mutex); in btrfs_commit_inode_delayed_inode()
1172 trans = btrfs_join_transaction(delayed_node->root); in btrfs_commit_inode_delayed_inode()
1180 ret = -ENOMEM; in btrfs_commit_inode_delayed_inode()
1184 block_rsv = trans->block_rsv; in btrfs_commit_inode_delayed_inode()
1185 trans->block_rsv = &fs_info->delayed_block_rsv; in btrfs_commit_inode_delayed_inode()
1187 mutex_lock(&delayed_node->mutex); in btrfs_commit_inode_delayed_inode()
1188 if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) in btrfs_commit_inode_delayed_inode()
1189 ret = __btrfs_update_delayed_inode(trans, delayed_node->root, in btrfs_commit_inode_delayed_inode()
1193 mutex_unlock(&delayed_node->mutex); in btrfs_commit_inode_delayed_inode()
1196 trans->block_rsv = block_rsv; in btrfs_commit_inode_delayed_inode()
1210 delayed_node = READ_ONCE(inode->delayed_node); in btrfs_remove_delayed_node()
1214 inode->delayed_node = NULL; in btrfs_remove_delayed_node()
1231 struct btrfs_root *root; in btrfs_async_run_delayed_root() local
1236 delayed_root = async_work->delayed_root; in btrfs_async_run_delayed_root()
1243 if (atomic_read(&delayed_root->items) < in btrfs_async_run_delayed_root()
1251 root = delayed_node->root; in btrfs_async_run_delayed_root()
1253 trans = btrfs_join_transaction(root); in btrfs_async_run_delayed_root()
1261 block_rsv = trans->block_rsv; in btrfs_async_run_delayed_root()
1262 trans->block_rsv = &root->fs_info->delayed_block_rsv; in btrfs_async_run_delayed_root()
1266 trans->block_rsv = block_rsv; in btrfs_async_run_delayed_root()
1268 btrfs_btree_balance_dirty_nodelay(root->fs_info); in btrfs_async_run_delayed_root()
1274 } while ((async_work->nr == 0 && total_done < BTRFS_DELAYED_WRITEBACK) in btrfs_async_run_delayed_root()
1275 || total_done < async_work->nr); in btrfs_async_run_delayed_root()
1279 wake_up(&delayed_root->wait); in btrfs_async_run_delayed_root()
1291 return -ENOMEM; in btrfs_wq_run_delayed_node()
1293 async_work->delayed_root = delayed_root; in btrfs_wq_run_delayed_node()
1294 btrfs_init_work(&async_work->work, btrfs_async_run_delayed_root, NULL, in btrfs_wq_run_delayed_node()
1296 async_work->nr = nr; in btrfs_wq_run_delayed_node()
1298 btrfs_queue_work(fs_info->delayed_workers, &async_work->work); in btrfs_wq_run_delayed_node()
1304 WARN_ON(btrfs_first_delayed_node(fs_info->delayed_root)); in btrfs_assert_delayed_root_empty()
1309 int val = atomic_read(&delayed_root->items_seq); in could_end_wait()
1314 if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) in could_end_wait()
1322 struct btrfs_delayed_root *delayed_root = fs_info->delayed_root; in btrfs_balance_delayed_items()
1324 if ((atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) || in btrfs_balance_delayed_items()
1325 btrfs_workqueue_normal_congested(fs_info->delayed_workers)) in btrfs_balance_delayed_items()
1328 if (atomic_read(&delayed_root->items) >= BTRFS_DELAYED_WRITEBACK) { in btrfs_balance_delayed_items()
1332 seq = atomic_read(&delayed_root->items_seq); in btrfs_balance_delayed_items()
1338 wait_event_interruptible(delayed_root->wait, in btrfs_balance_delayed_items()
1346 /* Will return 0 or -ENOMEM */
1364 ret = -ENOMEM; in btrfs_insert_delayed_dir_index()
1368 delayed_item->key.objectid = btrfs_ino(dir); in btrfs_insert_delayed_dir_index()
1369 delayed_item->key.type = BTRFS_DIR_INDEX_KEY; in btrfs_insert_delayed_dir_index()
1370 delayed_item->key.offset = index; in btrfs_insert_delayed_dir_index()
1372 dir_item = (struct btrfs_dir_item *)delayed_item->data; in btrfs_insert_delayed_dir_index()
1373 dir_item->location = *disk_key; in btrfs_insert_delayed_dir_index()
1374 btrfs_set_stack_dir_transid(dir_item, trans->transid); in btrfs_insert_delayed_dir_index()
1380 ret = btrfs_delayed_item_reserve_metadata(trans, dir->root, delayed_item); in btrfs_insert_delayed_dir_index()
1387 mutex_lock(&delayed_node->mutex); in btrfs_insert_delayed_dir_index()
1390 btrfs_err(trans->fs_info, in btrfs_insert_delayed_dir_index()
1391 …"err add delayed dir index item(name: %.*s) into the insertion tree of the delayed node(root id: %… in btrfs_insert_delayed_dir_index()
1392 name_len, name, delayed_node->root->root_key.objectid, in btrfs_insert_delayed_dir_index()
1393 delayed_node->inode_id, ret); in btrfs_insert_delayed_dir_index()
1396 mutex_unlock(&delayed_node->mutex); in btrfs_insert_delayed_dir_index()
1404 struct btrfs_delayed_node *node, in btrfs_delete_delayed_insertion_item() argument
1409 mutex_lock(&node->mutex); in btrfs_delete_delayed_insertion_item()
1410 item = __btrfs_lookup_delayed_insertion_item(node, key); in btrfs_delete_delayed_insertion_item()
1412 mutex_unlock(&node->mutex); in btrfs_delete_delayed_insertion_item()
1416 btrfs_delayed_item_release_metadata(node->root, item); in btrfs_delete_delayed_insertion_item()
1418 mutex_unlock(&node->mutex); in btrfs_delete_delayed_insertion_item()
1425 struct btrfs_delayed_node *node; in btrfs_delete_delayed_dir_index() local
1430 node = btrfs_get_or_create_delayed_node(dir); in btrfs_delete_delayed_dir_index()
1431 if (IS_ERR(node)) in btrfs_delete_delayed_dir_index()
1432 return PTR_ERR(node); in btrfs_delete_delayed_dir_index()
1438 ret = btrfs_delete_delayed_insertion_item(trans->fs_info, node, in btrfs_delete_delayed_dir_index()
1445 ret = -ENOMEM; in btrfs_delete_delayed_dir_index()
1449 item->key = item_key; in btrfs_delete_delayed_dir_index()
1451 ret = btrfs_delayed_item_reserve_metadata(trans, dir->root, item); in btrfs_delete_delayed_dir_index()
1457 btrfs_err(trans->fs_info, in btrfs_delete_delayed_dir_index()
1463 mutex_lock(&node->mutex); in btrfs_delete_delayed_dir_index()
1464 ret = __btrfs_add_delayed_deletion_item(node, item); in btrfs_delete_delayed_dir_index()
1466 btrfs_err(trans->fs_info, in btrfs_delete_delayed_dir_index()
1467 …"err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %… in btrfs_delete_delayed_dir_index()
1468 index, node->root->root_key.objectid, in btrfs_delete_delayed_dir_index()
1469 node->inode_id, ret); in btrfs_delete_delayed_dir_index()
1470 btrfs_delayed_item_release_metadata(dir->root, item); in btrfs_delete_delayed_dir_index()
1473 mutex_unlock(&node->mutex); in btrfs_delete_delayed_dir_index()
1475 btrfs_release_delayed_node(node); in btrfs_delete_delayed_dir_index()
1484 return -ENOENT; in btrfs_inode_delayed_dir_index_count()
1488 * a new directory index is added into the delayed node and index_cnt in btrfs_inode_delayed_dir_index_count()
1489 * is updated now. So we needn't lock the delayed node. in btrfs_inode_delayed_dir_index_count()
1491 if (!delayed_node->index_cnt) { in btrfs_inode_delayed_dir_index_count()
1493 return -EINVAL; in btrfs_inode_delayed_dir_index_count()
1496 inode->index_cnt = delayed_node->index_cnt; in btrfs_inode_delayed_dir_index_count()
1514 * item->readdir_list. in btrfs_readdir_get_delayed_items()
1519 mutex_lock(&delayed_node->mutex); in btrfs_readdir_get_delayed_items()
1522 refcount_inc(&item->refs); in btrfs_readdir_get_delayed_items()
1523 list_add_tail(&item->readdir_list, ins_list); in btrfs_readdir_get_delayed_items()
1529 refcount_inc(&item->refs); in btrfs_readdir_get_delayed_items()
1530 list_add_tail(&item->readdir_list, del_list); in btrfs_readdir_get_delayed_items()
1533 mutex_unlock(&delayed_node->mutex); in btrfs_readdir_get_delayed_items()
1535 * This delayed node is still cached in the btrfs inode, so refs in btrfs_readdir_get_delayed_items()
1541 * requeue or dequeue this delayed node. in btrfs_readdir_get_delayed_items()
1543 refcount_dec(&delayed_node->refs); in btrfs_readdir_get_delayed_items()
1555 list_del(&curr->readdir_list); in btrfs_readdir_put_delayed_items()
1556 if (refcount_dec_and_test(&curr->refs)) in btrfs_readdir_put_delayed_items()
1561 list_del(&curr->readdir_list); in btrfs_readdir_put_delayed_items()
1562 if (refcount_dec_and_test(&curr->refs)) in btrfs_readdir_put_delayed_items()
1570 downgrade_write(&inode->i_rwsem); in btrfs_readdir_put_delayed_items()
1580 if (curr->key.offset > index) in btrfs_should_delete_dir_index()
1582 if (curr->key.offset == index) { in btrfs_should_delete_dir_index()
1591 * btrfs_readdir_delayed_dir_index - read dir info stored in the delayed tree
1614 list_del(&curr->readdir_list); in btrfs_readdir_delayed_dir_index()
1616 if (curr->key.offset < ctx->pos) { in btrfs_readdir_delayed_dir_index()
1617 if (refcount_dec_and_test(&curr->refs)) in btrfs_readdir_delayed_dir_index()
1622 ctx->pos = curr->key.offset; in btrfs_readdir_delayed_dir_index()
1624 di = (struct btrfs_dir_item *)curr->data; in btrfs_readdir_delayed_dir_index()
1628 d_type = fs_ftype_to_dtype(di->type); in btrfs_readdir_delayed_dir_index()
1629 btrfs_disk_key_to_cpu(&location, &di->location); in btrfs_readdir_delayed_dir_index()
1634 if (refcount_dec_and_test(&curr->refs)) in btrfs_readdir_delayed_dir_index()
1639 ctx->pos++; in btrfs_readdir_delayed_dir_index()
1652 btrfs_set_stack_inode_size(inode_item, BTRFS_I(inode)->disk_i_size); in fill_stack_inode_item()
1653 btrfs_set_stack_inode_mode(inode_item, inode->i_mode); in fill_stack_inode_item()
1654 btrfs_set_stack_inode_nlink(inode_item, inode->i_nlink); in fill_stack_inode_item()
1657 BTRFS_I(inode)->generation); in fill_stack_inode_item()
1660 btrfs_set_stack_inode_transid(inode_item, trans->transid); in fill_stack_inode_item()
1661 btrfs_set_stack_inode_rdev(inode_item, inode->i_rdev); in fill_stack_inode_item()
1662 flags = btrfs_inode_combine_flags(BTRFS_I(inode)->flags, in fill_stack_inode_item()
1663 BTRFS_I(inode)->ro_flags); in fill_stack_inode_item()
1667 btrfs_set_stack_timespec_sec(&inode_item->atime, in fill_stack_inode_item()
1668 inode->i_atime.tv_sec); in fill_stack_inode_item()
1669 btrfs_set_stack_timespec_nsec(&inode_item->atime, in fill_stack_inode_item()
1670 inode->i_atime.tv_nsec); in fill_stack_inode_item()
1672 btrfs_set_stack_timespec_sec(&inode_item->mtime, in fill_stack_inode_item()
1673 inode->i_mtime.tv_sec); in fill_stack_inode_item()
1674 btrfs_set_stack_timespec_nsec(&inode_item->mtime, in fill_stack_inode_item()
1675 inode->i_mtime.tv_nsec); in fill_stack_inode_item()
1677 btrfs_set_stack_timespec_sec(&inode_item->ctime, in fill_stack_inode_item()
1678 inode->i_ctime.tv_sec); in fill_stack_inode_item()
1679 btrfs_set_stack_timespec_nsec(&inode_item->ctime, in fill_stack_inode_item()
1680 inode->i_ctime.tv_nsec); in fill_stack_inode_item()
1682 btrfs_set_stack_timespec_sec(&inode_item->otime, in fill_stack_inode_item()
1683 BTRFS_I(inode)->i_otime.tv_sec); in fill_stack_inode_item()
1684 btrfs_set_stack_timespec_nsec(&inode_item->otime, in fill_stack_inode_item()
1685 BTRFS_I(inode)->i_otime.tv_nsec); in fill_stack_inode_item()
1690 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; in btrfs_fill_inode()
1696 return -ENOENT; in btrfs_fill_inode()
1698 mutex_lock(&delayed_node->mutex); in btrfs_fill_inode()
1699 if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { in btrfs_fill_inode()
1700 mutex_unlock(&delayed_node->mutex); in btrfs_fill_inode()
1702 return -ENOENT; in btrfs_fill_inode()
1705 inode_item = &delayed_node->inode_item; in btrfs_fill_inode()
1711 round_up(i_size_read(inode), fs_info->sectorsize)); in btrfs_fill_inode()
1712 inode->i_mode = btrfs_stack_inode_mode(inode_item); in btrfs_fill_inode()
1715 BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); in btrfs_fill_inode()
1716 BTRFS_I(inode)->last_trans = btrfs_stack_inode_transid(inode_item); in btrfs_fill_inode()
1720 inode->i_rdev = 0; in btrfs_fill_inode()
1723 &BTRFS_I(inode)->flags, &BTRFS_I(inode)->ro_flags); in btrfs_fill_inode()
1725 inode->i_atime.tv_sec = btrfs_stack_timespec_sec(&inode_item->atime); in btrfs_fill_inode()
1726 inode->i_atime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->atime); in btrfs_fill_inode()
1728 inode->i_mtime.tv_sec = btrfs_stack_timespec_sec(&inode_item->mtime); in btrfs_fill_inode()
1729 inode->i_mtime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->mtime); in btrfs_fill_inode()
1731 inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(&inode_item->ctime); in btrfs_fill_inode()
1732 inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->ctime); in btrfs_fill_inode()
1734 BTRFS_I(inode)->i_otime.tv_sec = in btrfs_fill_inode()
1735 btrfs_stack_timespec_sec(&inode_item->otime); in btrfs_fill_inode()
1736 BTRFS_I(inode)->i_otime.tv_nsec = in btrfs_fill_inode()
1737 btrfs_stack_timespec_nsec(&inode_item->otime); in btrfs_fill_inode()
1739 inode->i_generation = BTRFS_I(inode)->generation; in btrfs_fill_inode()
1740 BTRFS_I(inode)->index_cnt = (u64)-1; in btrfs_fill_inode()
1742 mutex_unlock(&delayed_node->mutex); in btrfs_fill_inode()
1748 struct btrfs_root *root, in btrfs_delayed_update_inode() argument
1758 mutex_lock(&delayed_node->mutex); in btrfs_delayed_update_inode()
1759 if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { in btrfs_delayed_update_inode()
1760 fill_stack_inode_item(trans, &delayed_node->inode_item, in btrfs_delayed_update_inode()
1761 &inode->vfs_inode); in btrfs_delayed_update_inode()
1765 ret = btrfs_delayed_inode_reserve_metadata(trans, root, delayed_node); in btrfs_delayed_update_inode()
1769 fill_stack_inode_item(trans, &delayed_node->inode_item, &inode->vfs_inode); in btrfs_delayed_update_inode()
1770 set_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags); in btrfs_delayed_update_inode()
1771 delayed_node->count++; in btrfs_delayed_update_inode()
1772 atomic_inc(&root->fs_info->delayed_root->items); in btrfs_delayed_update_inode()
1774 mutex_unlock(&delayed_node->mutex); in btrfs_delayed_update_inode()
1781 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_delayed_delete_inode_ref()
1789 if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) in btrfs_delayed_delete_inode_ref()
1790 return -EAGAIN; in btrfs_delayed_delete_inode_ref()
1798 * - We ONLY do async inode ref deletion for the inode who has only in btrfs_delayed_delete_inode_ref()
1804 * - If the inode ref and the inode item are not in the same leaf, in btrfs_delayed_delete_inode_ref()
1807 * - At the worst, we can steal some space from the global reservation. in btrfs_delayed_delete_inode_ref()
1810 mutex_lock(&delayed_node->mutex); in btrfs_delayed_delete_inode_ref()
1811 if (test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) in btrfs_delayed_delete_inode_ref()
1814 set_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags); in btrfs_delayed_delete_inode_ref()
1815 delayed_node->count++; in btrfs_delayed_delete_inode_ref()
1816 atomic_inc(&fs_info->delayed_root->items); in btrfs_delayed_delete_inode_ref()
1818 mutex_unlock(&delayed_node->mutex); in btrfs_delayed_delete_inode_ref()
1825 struct btrfs_root *root = delayed_node->root; in __btrfs_kill_delayed_node() local
1826 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_kill_delayed_node()
1829 mutex_lock(&delayed_node->mutex); in __btrfs_kill_delayed_node()
1832 btrfs_delayed_item_release_metadata(root, curr_item); in __btrfs_kill_delayed_node()
1840 btrfs_delayed_item_release_metadata(root, curr_item); in __btrfs_kill_delayed_node()
1848 if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { in __btrfs_kill_delayed_node()
1852 mutex_unlock(&delayed_node->mutex); in __btrfs_kill_delayed_node()
1867 void btrfs_kill_all_delayed_nodes(struct btrfs_root *root) in btrfs_kill_all_delayed_nodes() argument
1874 spin_lock(&root->inode_lock); in btrfs_kill_all_delayed_nodes()
1875 n = radix_tree_gang_lookup(&root->delayed_nodes_tree, in btrfs_kill_all_delayed_nodes()
1879 spin_unlock(&root->inode_lock); in btrfs_kill_all_delayed_nodes()
1883 inode_id = delayed_nodes[n - 1]->inode_id + 1; in btrfs_kill_all_delayed_nodes()
1886 * Don't increase refs in case the node is dead and in btrfs_kill_all_delayed_nodes()
1889 if (!refcount_inc_not_zero(&delayed_nodes[i]->refs)) in btrfs_kill_all_delayed_nodes()
1892 spin_unlock(&root->inode_lock); in btrfs_kill_all_delayed_nodes()
1907 curr_node = btrfs_first_delayed_node(fs_info->delayed_root); in btrfs_destroy_delayed_inodes()