Lines Matching +full:root +full:- +full:node
1 // SPDX-License-Identifier: GPL-2.0
15 #include "disk-io.h"
17 #include "delalloc-space.h"
25 if (entry->file_offset + entry->num_bytes < entry->file_offset) in entry_end()
26 return (u64)-1; in entry_end()
27 return entry->file_offset + entry->num_bytes; in entry_end()
30 /* returns NULL if the insertion worked, or it returns the node it did find
33 static struct rb_node *tree_insert(struct rb_root *root, u64 file_offset, in tree_insert() argument
34 struct rb_node *node) in tree_insert() argument
36 struct rb_node **p = &root->rb_node; in tree_insert()
44 if (file_offset < entry->file_offset) in tree_insert()
45 p = &(*p)->rb_left; in tree_insert()
47 p = &(*p)->rb_right; in tree_insert()
52 rb_link_node(node, parent, p); in tree_insert()
53 rb_insert_color(node, root); in tree_insert()
61 static struct rb_node *__tree_search(struct rb_root *root, u64 file_offset, in __tree_search() argument
64 struct rb_node *n = root->rb_node; in __tree_search()
75 if (file_offset < entry->file_offset) in __tree_search()
76 n = n->rb_left; in __tree_search()
78 n = n->rb_right; in __tree_search()
114 if (file_offset + len <= entry->file_offset || in range_overlaps()
115 entry->file_offset + entry->num_bytes <= file_offset) in range_overlaps()
127 struct rb_root *root = &tree->tree; in tree_search() local
132 if (tree->last) { in tree_search()
133 entry = rb_entry(tree->last, struct btrfs_ordered_extent, in tree_search()
135 if (in_range(file_offset, entry->file_offset, entry->num_bytes)) in tree_search()
136 return tree->last; in tree_search()
138 ret = __tree_search(root, file_offset, &prev); in tree_search()
142 tree->last = ret; in tree_search()
147 * Add an ordered extent to the per-inode tree.
162 * Return: 0 or -ENOMEM.
169 struct btrfs_root *root = inode->root; in btrfs_add_ordered_extent() local
170 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_add_ordered_extent()
171 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; in btrfs_add_ordered_extent()
172 struct rb_node *node; in btrfs_add_ordered_extent() local
194 return -ENOMEM; in btrfs_add_ordered_extent()
196 entry->file_offset = file_offset; in btrfs_add_ordered_extent()
197 entry->num_bytes = num_bytes; in btrfs_add_ordered_extent()
198 entry->ram_bytes = ram_bytes; in btrfs_add_ordered_extent()
199 entry->disk_bytenr = disk_bytenr; in btrfs_add_ordered_extent()
200 entry->disk_num_bytes = disk_num_bytes; in btrfs_add_ordered_extent()
201 entry->offset = offset; in btrfs_add_ordered_extent()
202 entry->bytes_left = num_bytes; in btrfs_add_ordered_extent()
203 entry->inode = igrab(&inode->vfs_inode); in btrfs_add_ordered_extent()
204 entry->compress_type = compress_type; in btrfs_add_ordered_extent()
205 entry->truncated_len = (u64)-1; in btrfs_add_ordered_extent()
206 entry->qgroup_rsv = ret; in btrfs_add_ordered_extent()
207 entry->physical = (u64)-1; in btrfs_add_ordered_extent()
210 entry->flags = flags; in btrfs_add_ordered_extent()
212 percpu_counter_add_batch(&fs_info->ordered_bytes, num_bytes, in btrfs_add_ordered_extent()
213 fs_info->delalloc_batch); in btrfs_add_ordered_extent()
216 refcount_set(&entry->refs, 1); in btrfs_add_ordered_extent()
217 init_waitqueue_head(&entry->wait); in btrfs_add_ordered_extent()
218 INIT_LIST_HEAD(&entry->list); in btrfs_add_ordered_extent()
219 INIT_LIST_HEAD(&entry->log_list); in btrfs_add_ordered_extent()
220 INIT_LIST_HEAD(&entry->root_extent_list); in btrfs_add_ordered_extent()
221 INIT_LIST_HEAD(&entry->work_list); in btrfs_add_ordered_extent()
222 init_completion(&entry->completion); in btrfs_add_ordered_extent()
226 spin_lock_irq(&tree->lock); in btrfs_add_ordered_extent()
227 node = tree_insert(&tree->tree, file_offset, in btrfs_add_ordered_extent()
228 &entry->rb_node); in btrfs_add_ordered_extent()
229 if (node) in btrfs_add_ordered_extent()
230 btrfs_panic(fs_info, -EEXIST, in btrfs_add_ordered_extent()
233 spin_unlock_irq(&tree->lock); in btrfs_add_ordered_extent()
235 spin_lock(&root->ordered_extent_lock); in btrfs_add_ordered_extent()
236 list_add_tail(&entry->root_extent_list, in btrfs_add_ordered_extent()
237 &root->ordered_extents); in btrfs_add_ordered_extent()
238 root->nr_ordered_extents++; in btrfs_add_ordered_extent()
239 if (root->nr_ordered_extents == 1) { in btrfs_add_ordered_extent()
240 spin_lock(&fs_info->ordered_root_lock); in btrfs_add_ordered_extent()
241 BUG_ON(!list_empty(&root->ordered_root)); in btrfs_add_ordered_extent()
242 list_add_tail(&root->ordered_root, &fs_info->ordered_roots); in btrfs_add_ordered_extent()
243 spin_unlock(&fs_info->ordered_root_lock); in btrfs_add_ordered_extent()
245 spin_unlock(&root->ordered_extent_lock); in btrfs_add_ordered_extent()
252 spin_lock(&inode->lock); in btrfs_add_ordered_extent()
254 spin_unlock(&inode->lock); in btrfs_add_ordered_extent()
269 tree = &BTRFS_I(entry->inode)->ordered_tree; in btrfs_add_ordered_sum()
270 spin_lock_irq(&tree->lock); in btrfs_add_ordered_sum()
271 list_add_tail(&sum->list, &entry->list); in btrfs_add_ordered_sum()
272 spin_unlock_irq(&tree->lock); in btrfs_add_ordered_sum()
300 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; in btrfs_mark_ordered_io_finished()
301 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_mark_ordered_io_finished()
303 struct rb_node *node; in btrfs_mark_ordered_io_finished() local
309 wq = fs_info->endio_freespace_worker; in btrfs_mark_ordered_io_finished()
311 wq = fs_info->endio_write_workers; in btrfs_mark_ordered_io_finished()
314 ASSERT(page->mapping && page_offset(page) <= file_offset && in btrfs_mark_ordered_io_finished()
317 spin_lock_irqsave(&tree->lock, flags); in btrfs_mark_ordered_io_finished()
323 node = tree_search(tree, cur); in btrfs_mark_ordered_io_finished()
325 if (!node) in btrfs_mark_ordered_io_finished()
328 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_mark_ordered_io_finished()
329 entry_end = entry->file_offset + entry->num_bytes; in btrfs_mark_ordered_io_finished()
331 * |<-- OE --->| | in btrfs_mark_ordered_io_finished()
336 node = rb_next(node); in btrfs_mark_ordered_io_finished()
338 if (!node) in btrfs_mark_ordered_io_finished()
340 entry = rb_entry(node, struct btrfs_ordered_extent, in btrfs_mark_ordered_io_finished()
344 cur = entry->file_offset; in btrfs_mark_ordered_io_finished()
348 * | |<--- OE --->| in btrfs_mark_ordered_io_finished()
352 if (cur < entry->file_offset) { in btrfs_mark_ordered_io_finished()
353 cur = entry->file_offset; in btrfs_mark_ordered_io_finished()
360 * |<--- OE --->| in btrfs_mark_ordered_io_finished()
364 end = min(entry->file_offset + entry->num_bytes, in btrfs_mark_ordered_io_finished()
365 file_offset + num_bytes) - 1; in btrfs_mark_ordered_io_finished()
366 ASSERT(end + 1 - cur < U32_MAX); in btrfs_mark_ordered_io_finished()
367 len = end + 1 - cur; in btrfs_mark_ordered_io_finished()
384 if (unlikely(len > entry->bytes_left)) { in btrfs_mark_ordered_io_finished()
387 "bad ordered extent accounting, root=%llu ino=%llu OE offset=%llu OE len=%llu to_dec=%u left=%llu", in btrfs_mark_ordered_io_finished()
388 inode->root->root_key.objectid, in btrfs_mark_ordered_io_finished()
390 entry->file_offset, in btrfs_mark_ordered_io_finished()
391 entry->num_bytes, in btrfs_mark_ordered_io_finished()
392 len, entry->bytes_left); in btrfs_mark_ordered_io_finished()
393 entry->bytes_left = 0; in btrfs_mark_ordered_io_finished()
395 entry->bytes_left -= len; in btrfs_mark_ordered_io_finished()
399 set_bit(BTRFS_ORDERED_IOERR, &entry->flags); in btrfs_mark_ordered_io_finished()
405 if (entry->bytes_left == 0) { in btrfs_mark_ordered_io_finished()
406 set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); in btrfs_mark_ordered_io_finished()
407 cond_wake_up(&entry->wait); in btrfs_mark_ordered_io_finished()
408 refcount_inc(&entry->refs); in btrfs_mark_ordered_io_finished()
410 spin_unlock_irqrestore(&tree->lock, flags); in btrfs_mark_ordered_io_finished()
411 btrfs_init_work(&entry->work, finish_ordered_fn, NULL, NULL); in btrfs_mark_ordered_io_finished()
412 btrfs_queue_work(wq, &entry->work); in btrfs_mark_ordered_io_finished()
413 spin_lock_irqsave(&tree->lock, flags); in btrfs_mark_ordered_io_finished()
417 spin_unlock_irqrestore(&tree->lock, flags); in btrfs_mark_ordered_io_finished()
441 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; in btrfs_dec_test_ordered_pending()
442 struct rb_node *node; in btrfs_dec_test_ordered_pending() local
447 spin_lock_irqsave(&tree->lock, flags); in btrfs_dec_test_ordered_pending()
453 node = tree_search(tree, file_offset); in btrfs_dec_test_ordered_pending()
454 if (!node) in btrfs_dec_test_ordered_pending()
457 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_dec_test_ordered_pending()
459 if (!in_range(file_offset, entry->file_offset, entry->num_bytes)) in btrfs_dec_test_ordered_pending()
462 if (io_size > entry->bytes_left) in btrfs_dec_test_ordered_pending()
463 btrfs_crit(inode->root->fs_info, in btrfs_dec_test_ordered_pending()
465 entry->bytes_left, io_size); in btrfs_dec_test_ordered_pending()
467 entry->bytes_left -= io_size; in btrfs_dec_test_ordered_pending()
469 if (entry->bytes_left == 0) { in btrfs_dec_test_ordered_pending()
474 finished = !test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); in btrfs_dec_test_ordered_pending()
476 cond_wake_up_nomb(&entry->wait); in btrfs_dec_test_ordered_pending()
481 refcount_inc(&entry->refs); in btrfs_dec_test_ordered_pending()
484 spin_unlock_irqrestore(&tree->lock, flags); in btrfs_dec_test_ordered_pending()
497 trace_btrfs_ordered_extent_put(BTRFS_I(entry->inode), entry); in btrfs_put_ordered_extent()
499 if (refcount_dec_and_test(&entry->refs)) { in btrfs_put_ordered_extent()
500 ASSERT(list_empty(&entry->root_extent_list)); in btrfs_put_ordered_extent()
501 ASSERT(list_empty(&entry->log_list)); in btrfs_put_ordered_extent()
502 ASSERT(RB_EMPTY_NODE(&entry->rb_node)); in btrfs_put_ordered_extent()
503 if (entry->inode) in btrfs_put_ordered_extent()
504 btrfs_add_delayed_iput(entry->inode); in btrfs_put_ordered_extent()
505 while (!list_empty(&entry->list)) { in btrfs_put_ordered_extent()
506 cur = entry->list.next; in btrfs_put_ordered_extent()
508 list_del(&sum->list); in btrfs_put_ordered_extent()
523 struct btrfs_root *root = btrfs_inode->root; in btrfs_remove_ordered_extent() local
524 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_remove_ordered_extent()
525 struct rb_node *node; in btrfs_remove_ordered_extent() local
537 spin_lock(&btrfs_inode->lock); in btrfs_remove_ordered_extent()
538 btrfs_mod_outstanding_extents(btrfs_inode, -1); in btrfs_remove_ordered_extent()
539 spin_unlock(&btrfs_inode->lock); in btrfs_remove_ordered_extent()
540 if (root != fs_info->tree_root) { in btrfs_remove_ordered_extent()
543 if (test_bit(BTRFS_ORDERED_ENCODED, &entry->flags)) in btrfs_remove_ordered_extent()
544 release = entry->disk_num_bytes; in btrfs_remove_ordered_extent()
546 release = entry->num_bytes; in btrfs_remove_ordered_extent()
550 percpu_counter_add_batch(&fs_info->ordered_bytes, -entry->num_bytes, in btrfs_remove_ordered_extent()
551 fs_info->delalloc_batch); in btrfs_remove_ordered_extent()
553 tree = &btrfs_inode->ordered_tree; in btrfs_remove_ordered_extent()
554 spin_lock_irq(&tree->lock); in btrfs_remove_ordered_extent()
555 node = &entry->rb_node; in btrfs_remove_ordered_extent()
556 rb_erase(node, &tree->tree); in btrfs_remove_ordered_extent()
557 RB_CLEAR_NODE(node); in btrfs_remove_ordered_extent()
558 if (tree->last == node) in btrfs_remove_ordered_extent()
559 tree->last = NULL; in btrfs_remove_ordered_extent()
560 set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags); in btrfs_remove_ordered_extent()
561 pending = test_and_clear_bit(BTRFS_ORDERED_PENDING, &entry->flags); in btrfs_remove_ordered_extent()
562 spin_unlock_irq(&tree->lock); in btrfs_remove_ordered_extent()
577 spin_lock(&fs_info->trans_lock); in btrfs_remove_ordered_extent()
578 trans = fs_info->running_transaction; in btrfs_remove_ordered_extent()
580 refcount_inc(&trans->use_count); in btrfs_remove_ordered_extent()
581 spin_unlock(&fs_info->trans_lock); in btrfs_remove_ordered_extent()
585 if (atomic_dec_and_test(&trans->pending_ordered)) in btrfs_remove_ordered_extent()
586 wake_up(&trans->pending_wait); in btrfs_remove_ordered_extent()
593 spin_lock(&root->ordered_extent_lock); in btrfs_remove_ordered_extent()
594 list_del_init(&entry->root_extent_list); in btrfs_remove_ordered_extent()
595 root->nr_ordered_extents--; in btrfs_remove_ordered_extent()
599 if (!root->nr_ordered_extents) { in btrfs_remove_ordered_extent()
600 spin_lock(&fs_info->ordered_root_lock); in btrfs_remove_ordered_extent()
601 BUG_ON(list_empty(&root->ordered_root)); in btrfs_remove_ordered_extent()
602 list_del_init(&root->ordered_root); in btrfs_remove_ordered_extent()
603 spin_unlock(&fs_info->ordered_root_lock); in btrfs_remove_ordered_extent()
605 spin_unlock(&root->ordered_extent_lock); in btrfs_remove_ordered_extent()
606 wake_up(&entry->wait); in btrfs_remove_ordered_extent()
617 complete(&ordered->completion); in btrfs_run_ordered_extent_work()
621 * wait for all the ordered extents in a root. This is done when balancing
624 u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr, in btrfs_wait_ordered_extents() argument
627 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_wait_ordered_extents()
635 mutex_lock(&root->ordered_extent_mutex); in btrfs_wait_ordered_extents()
636 spin_lock(&root->ordered_extent_lock); in btrfs_wait_ordered_extents()
637 list_splice_init(&root->ordered_extents, &splice); in btrfs_wait_ordered_extents()
642 if (range_end <= ordered->disk_bytenr || in btrfs_wait_ordered_extents()
643 ordered->disk_bytenr + ordered->disk_num_bytes <= range_start) { in btrfs_wait_ordered_extents()
644 list_move_tail(&ordered->root_extent_list, &skipped); in btrfs_wait_ordered_extents()
645 cond_resched_lock(&root->ordered_extent_lock); in btrfs_wait_ordered_extents()
649 list_move_tail(&ordered->root_extent_list, in btrfs_wait_ordered_extents()
650 &root->ordered_extents); in btrfs_wait_ordered_extents()
651 refcount_inc(&ordered->refs); in btrfs_wait_ordered_extents()
652 spin_unlock(&root->ordered_extent_lock); in btrfs_wait_ordered_extents()
654 btrfs_init_work(&ordered->flush_work, in btrfs_wait_ordered_extents()
656 list_add_tail(&ordered->work_list, &works); in btrfs_wait_ordered_extents()
657 btrfs_queue_work(fs_info->flush_workers, &ordered->flush_work); in btrfs_wait_ordered_extents()
660 spin_lock(&root->ordered_extent_lock); in btrfs_wait_ordered_extents()
662 nr--; in btrfs_wait_ordered_extents()
665 list_splice_tail(&skipped, &root->ordered_extents); in btrfs_wait_ordered_extents()
666 list_splice_tail(&splice, &root->ordered_extents); in btrfs_wait_ordered_extents()
667 spin_unlock(&root->ordered_extent_lock); in btrfs_wait_ordered_extents()
670 list_del_init(&ordered->work_list); in btrfs_wait_ordered_extents()
671 wait_for_completion(&ordered->completion); in btrfs_wait_ordered_extents()
675 mutex_unlock(&root->ordered_extent_mutex); in btrfs_wait_ordered_extents()
683 struct btrfs_root *root; in btrfs_wait_ordered_roots() local
689 mutex_lock(&fs_info->ordered_operations_mutex); in btrfs_wait_ordered_roots()
690 spin_lock(&fs_info->ordered_root_lock); in btrfs_wait_ordered_roots()
691 list_splice_init(&fs_info->ordered_roots, &splice); in btrfs_wait_ordered_roots()
693 root = list_first_entry(&splice, struct btrfs_root, in btrfs_wait_ordered_roots()
695 root = btrfs_grab_root(root); in btrfs_wait_ordered_roots()
696 BUG_ON(!root); in btrfs_wait_ordered_roots()
697 list_move_tail(&root->ordered_root, in btrfs_wait_ordered_roots()
698 &fs_info->ordered_roots); in btrfs_wait_ordered_roots()
699 spin_unlock(&fs_info->ordered_root_lock); in btrfs_wait_ordered_roots()
701 done = btrfs_wait_ordered_extents(root, nr, in btrfs_wait_ordered_roots()
703 btrfs_put_root(root); in btrfs_wait_ordered_roots()
705 spin_lock(&fs_info->ordered_root_lock); in btrfs_wait_ordered_roots()
707 nr -= done; in btrfs_wait_ordered_roots()
710 list_splice_tail(&splice, &fs_info->ordered_roots); in btrfs_wait_ordered_roots()
711 spin_unlock(&fs_info->ordered_root_lock); in btrfs_wait_ordered_roots()
712 mutex_unlock(&fs_info->ordered_operations_mutex); in btrfs_wait_ordered_roots()
724 u64 start = entry->file_offset; in btrfs_start_ordered_extent()
725 u64 end = start + entry->num_bytes - 1; in btrfs_start_ordered_extent()
726 struct btrfs_inode *inode = BTRFS_I(entry->inode); in btrfs_start_ordered_extent()
742 if (!test_bit(BTRFS_ORDERED_DIRECT, &entry->flags)) in btrfs_start_ordered_extent()
743 filemap_fdatawrite_range(inode->vfs_inode.i_mapping, start, end); in btrfs_start_ordered_extent()
746 btrfs_might_wait_for_event(inode->root->fs_info, btrfs_ordered_extent); in btrfs_start_ordered_extent()
747 wait_event(entry->wait, test_bit(BTRFS_ORDERED_COMPLETE, in btrfs_start_ordered_extent()
748 &entry->flags)); in btrfs_start_ordered_extent()
766 orig_end = start + len - 1; in btrfs_wait_ordered_range()
782 * before the ordered extents complete - to avoid failures (-EEXIST) in btrfs_wait_ordered_range()
785 ret_wb = filemap_fdatawait_range(inode->i_mapping, start, orig_end); in btrfs_wait_ordered_range()
792 if (ordered->file_offset > orig_end) { in btrfs_wait_ordered_range()
796 if (ordered->file_offset + ordered->num_bytes <= start) { in btrfs_wait_ordered_range()
801 end = ordered->file_offset; in btrfs_wait_ordered_range()
807 if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)) in btrfs_wait_ordered_range()
808 ret = -EIO; in btrfs_wait_ordered_range()
812 end--; in btrfs_wait_ordered_range()
825 struct rb_node *node; in btrfs_lookup_ordered_extent() local
829 tree = &inode->ordered_tree; in btrfs_lookup_ordered_extent()
830 spin_lock_irqsave(&tree->lock, flags); in btrfs_lookup_ordered_extent()
831 node = tree_search(tree, file_offset); in btrfs_lookup_ordered_extent()
832 if (!node) in btrfs_lookup_ordered_extent()
835 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_lookup_ordered_extent()
836 if (!in_range(file_offset, entry->file_offset, entry->num_bytes)) in btrfs_lookup_ordered_extent()
839 refcount_inc(&entry->refs); in btrfs_lookup_ordered_extent()
843 spin_unlock_irqrestore(&tree->lock, flags); in btrfs_lookup_ordered_extent()
854 struct rb_node *node; in btrfs_lookup_ordered_range() local
857 tree = &inode->ordered_tree; in btrfs_lookup_ordered_range()
858 spin_lock_irq(&tree->lock); in btrfs_lookup_ordered_range()
859 node = tree_search(tree, file_offset); in btrfs_lookup_ordered_range()
860 if (!node) { in btrfs_lookup_ordered_range()
861 node = tree_search(tree, file_offset + len); in btrfs_lookup_ordered_range()
862 if (!node) in btrfs_lookup_ordered_range()
867 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_lookup_ordered_range()
871 if (entry->file_offset >= file_offset + len) { in btrfs_lookup_ordered_range()
876 node = rb_next(node); in btrfs_lookup_ordered_range()
877 if (!node) in btrfs_lookup_ordered_range()
882 refcount_inc(&entry->refs); in btrfs_lookup_ordered_range()
885 spin_unlock_irq(&tree->lock); in btrfs_lookup_ordered_range()
896 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; in btrfs_get_ordered_extents_for_logging()
899 ASSERT(inode_is_locked(&inode->vfs_inode)); in btrfs_get_ordered_extents_for_logging()
901 spin_lock_irq(&tree->lock); in btrfs_get_ordered_extents_for_logging()
902 for (n = rb_first(&tree->tree); n; n = rb_next(n)) { in btrfs_get_ordered_extents_for_logging()
907 if (test_bit(BTRFS_ORDERED_LOGGED, &ordered->flags)) in btrfs_get_ordered_extents_for_logging()
910 ASSERT(list_empty(&ordered->log_list)); in btrfs_get_ordered_extents_for_logging()
911 list_add_tail(&ordered->log_list, list); in btrfs_get_ordered_extents_for_logging()
912 refcount_inc(&ordered->refs); in btrfs_get_ordered_extents_for_logging()
915 spin_unlock_irq(&tree->lock); in btrfs_get_ordered_extents_for_logging()
926 struct rb_node *node; in btrfs_lookup_first_ordered_extent() local
929 tree = &inode->ordered_tree; in btrfs_lookup_first_ordered_extent()
930 spin_lock_irq(&tree->lock); in btrfs_lookup_first_ordered_extent()
931 node = tree_search(tree, file_offset); in btrfs_lookup_first_ordered_extent()
932 if (!node) in btrfs_lookup_first_ordered_extent()
935 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_lookup_first_ordered_extent()
936 refcount_inc(&entry->refs); in btrfs_lookup_first_ordered_extent()
939 spin_unlock_irq(&tree->lock); in btrfs_lookup_first_ordered_extent()
955 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; in btrfs_lookup_first_ordered_range()
956 struct rb_node *node; in btrfs_lookup_first_ordered_range() local
962 spin_lock_irq(&tree->lock); in btrfs_lookup_first_ordered_range()
963 node = tree->tree.rb_node; in btrfs_lookup_first_ordered_range()
965 * Here we don't want to use tree_search() which will use tree->last in btrfs_lookup_first_ordered_range()
970 while (node) { in btrfs_lookup_first_ordered_range()
971 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); in btrfs_lookup_first_ordered_range()
973 if (file_offset < entry->file_offset) { in btrfs_lookup_first_ordered_range()
974 node = node->rb_left; in btrfs_lookup_first_ordered_range()
976 node = node->rb_right; in btrfs_lookup_first_ordered_range()
990 cur = &entry->rb_node; in btrfs_lookup_first_ordered_range()
992 if (entry->file_offset < file_offset) { in btrfs_lookup_first_ordered_range()
1013 refcount_inc(&entry->refs); in btrfs_lookup_first_ordered_range()
1017 spin_unlock_irq(&tree->lock); in btrfs_lookup_first_ordered_range()
1022 * btrfs_flush_ordered_range - Lock the passed range and ensures all pending
1046 lock_extent(&inode->io_tree, start, end, cachedp); in btrfs_lock_and_flush_ordered_range()
1048 end - start + 1); in btrfs_lock_and_flush_ordered_range()
1056 refcount_dec(&cache->refs); in btrfs_lock_and_flush_ordered_range()
1059 unlock_extent(&inode->io_tree, start, end, cachedp); in btrfs_lock_and_flush_ordered_range()
1076 if (!try_lock_extent(&inode->io_tree, start, end)) in btrfs_try_lock_ordered_range()
1079 ordered = btrfs_lookup_ordered_range(inode, start, end - start + 1); in btrfs_try_lock_ordered_range()
1084 unlock_extent(&inode->io_tree, start, end, NULL); in btrfs_try_lock_ordered_range()
1093 struct inode *inode = ordered->inode; in clone_ordered_extent()
1094 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; in clone_ordered_extent()
1095 u64 file_offset = ordered->file_offset + pos; in clone_ordered_extent()
1096 u64 disk_bytenr = ordered->disk_bytenr + pos; in clone_ordered_extent()
1097 unsigned long flags = ordered->flags & BTRFS_ORDERED_TYPE_FLAGS; in clone_ordered_extent()
1103 percpu_counter_add_batch(&fs_info->ordered_bytes, -len, in clone_ordered_extent()
1104 fs_info->delalloc_batch); in clone_ordered_extent()
1108 ordered->compress_type); in clone_ordered_extent()
1114 struct inode *inode = ordered->inode; in btrfs_split_ordered_extent()
1115 struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree; in btrfs_split_ordered_extent()
1116 struct rb_node *node; in btrfs_split_ordered_extent() local
1117 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); in btrfs_split_ordered_extent()
1122 spin_lock_irq(&tree->lock); in btrfs_split_ordered_extent()
1124 node = &ordered->rb_node; in btrfs_split_ordered_extent()
1125 rb_erase(node, &tree->tree); in btrfs_split_ordered_extent()
1126 RB_CLEAR_NODE(node); in btrfs_split_ordered_extent()
1127 if (tree->last == node) in btrfs_split_ordered_extent()
1128 tree->last = NULL; in btrfs_split_ordered_extent()
1130 ordered->file_offset += pre; in btrfs_split_ordered_extent()
1131 ordered->disk_bytenr += pre; in btrfs_split_ordered_extent()
1132 ordered->num_bytes -= (pre + post); in btrfs_split_ordered_extent()
1133 ordered->disk_num_bytes -= (pre + post); in btrfs_split_ordered_extent()
1134 ordered->bytes_left -= (pre + post); in btrfs_split_ordered_extent()
1136 /* Re-insert the node */ in btrfs_split_ordered_extent()
1137 node = tree_insert(&tree->tree, ordered->file_offset, &ordered->rb_node); in btrfs_split_ordered_extent()
1138 if (node) in btrfs_split_ordered_extent()
1139 btrfs_panic(fs_info, -EEXIST, in btrfs_split_ordered_extent()
1141 ordered->file_offset); in btrfs_split_ordered_extent()
1143 spin_unlock_irq(&tree->lock); in btrfs_split_ordered_extent()
1148 ret = clone_ordered_extent(ordered, pre + ordered->disk_num_bytes, in btrfs_split_ordered_extent()
1161 return -ENOMEM; in ordered_data_init()