Lines Matching refs:state
32 static inline bool extent_state_in_tree(const struct extent_state *state) in extent_state_in_tree() argument
34 return !RB_EMPTY_NODE(&state->rb_node); in extent_state_in_tree()
90 struct extent_state *state; in btrfs_extent_state_leak_debug_check() local
93 state = list_entry(states.next, struct extent_state, leak_list); in btrfs_extent_state_leak_debug_check()
95 state->start, state->end, state->state, in btrfs_extent_state_leak_debug_check()
96 extent_state_in_tree(state), in btrfs_extent_state_leak_debug_check()
97 refcount_read(&state->refs)); in btrfs_extent_state_leak_debug_check()
98 list_del(&state->leak_list); in btrfs_extent_state_leak_debug_check()
99 kmem_cache_free(extent_state_cache, state); in btrfs_extent_state_leak_debug_check()
145 static int add_extent_changeset(struct extent_state *state, unsigned bits, in add_extent_changeset() argument
153 if (set && (state->state & bits) == bits) in add_extent_changeset()
155 if (!set && (state->state & bits) == 0) in add_extent_changeset()
157 changeset->bytes_changed += state->end - state->start + 1; in add_extent_changeset()
158 ret = ulist_add(&changeset->range_changed, state->start, state->end, in add_extent_changeset()
283 tree->state = RB_ROOT; in extent_io_tree_init()
301 while (!RB_EMPTY_ROOT(&tree->state)) { in extent_io_tree_release()
303 struct extent_state *state; in extent_io_tree_release() local
305 node = rb_first(&tree->state); in extent_io_tree_release()
306 state = rb_entry(node, struct extent_state, rb_node); in extent_io_tree_release()
307 rb_erase(&state->rb_node, &tree->state); in extent_io_tree_release()
308 RB_CLEAR_NODE(&state->rb_node); in extent_io_tree_release()
313 ASSERT(!waitqueue_active(&state->wq)); in extent_io_tree_release()
314 free_extent_state(state); in extent_io_tree_release()
323 struct extent_state *state; in alloc_extent_state() local
330 state = kmem_cache_alloc(extent_state_cache, mask); in alloc_extent_state()
331 if (!state) in alloc_extent_state()
332 return state; in alloc_extent_state()
333 state->state = 0; in alloc_extent_state()
334 state->failrec = NULL; in alloc_extent_state()
335 RB_CLEAR_NODE(&state->rb_node); in alloc_extent_state()
336 btrfs_leak_debug_add(&leak_lock, &state->leak_list, &states); in alloc_extent_state()
337 refcount_set(&state->refs, 1); in alloc_extent_state()
338 init_waitqueue_head(&state->wq); in alloc_extent_state()
339 trace_alloc_extent_state(state, mask, _RET_IP_); in alloc_extent_state()
340 return state; in alloc_extent_state()
343 void free_extent_state(struct extent_state *state) in free_extent_state() argument
345 if (!state) in free_extent_state()
347 if (refcount_dec_and_test(&state->refs)) { in free_extent_state()
348 WARN_ON(extent_state_in_tree(state)); in free_extent_state()
349 btrfs_leak_debug_del(&leak_lock, &state->leak_list); in free_extent_state()
350 trace_free_extent_state(state, _RET_IP_); in free_extent_state()
351 kmem_cache_free(extent_state_cache, state); in free_extent_state()
415 struct rb_root *root = &tree->state; in __etree_search()
492 struct extent_state *state) in merge_state() argument
497 if (state->state & (EXTENT_LOCKED | EXTENT_BOUNDARY)) in merge_state()
500 other_node = rb_prev(&state->rb_node); in merge_state()
503 if (other->end == state->start - 1 && in merge_state()
504 other->state == state->state) { in merge_state()
508 state, other); in merge_state()
509 state->start = other->start; in merge_state()
510 rb_erase(&other->rb_node, &tree->state); in merge_state()
515 other_node = rb_next(&state->rb_node); in merge_state()
518 if (other->start == state->end + 1 && in merge_state()
519 other->state == state->state) { in merge_state()
523 state, other); in merge_state()
524 state->end = other->end; in merge_state()
525 rb_erase(&other->rb_node, &tree->state); in merge_state()
533 struct extent_state *state, unsigned *bits,
547 struct extent_state *state, u64 start, u64 end, in insert_state() argument
559 state->start = start; in insert_state()
560 state->end = end; in insert_state()
562 set_state_bits(tree, state, bits, changeset); in insert_state()
564 node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent); in insert_state()
573 merge_state(tree, state); in insert_state()
601 prealloc->state = orig->state; in split_state()
604 node = tree_insert(&tree->state, &orig->rb_node, prealloc->end, in split_state()
613 static struct extent_state *next_state(struct extent_state *state) in next_state() argument
615 struct rb_node *next = rb_next(&state->rb_node); in next_state()
630 struct extent_state *state, in clear_state_bit() argument
638 if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) { in clear_state_bit()
639 u64 range = state->end - state->start + 1; in clear_state_bit()
645 btrfs_clear_delalloc_extent(tree->private_data, state, bits); in clear_state_bit()
647 ret = add_extent_changeset(state, bits_to_clear, changeset, 0); in clear_state_bit()
649 state->state &= ~bits_to_clear; in clear_state_bit()
651 wake_up(&state->wq); in clear_state_bit()
652 if (state->state == 0) { in clear_state_bit()
653 next = next_state(state); in clear_state_bit()
654 if (extent_state_in_tree(state)) { in clear_state_bit()
655 rb_erase(&state->rb_node, &tree->state); in clear_state_bit()
656 RB_CLEAR_NODE(&state->rb_node); in clear_state_bit()
657 free_extent_state(state); in clear_state_bit()
662 merge_state(tree, state); in clear_state_bit()
663 next = next_state(state); in clear_state_bit()
700 struct extent_state *state; in __clear_extent_bit() local
744 state = cached; in __clear_extent_bit()
757 state = rb_entry(node, struct extent_state, rb_node); in __clear_extent_bit()
759 if (state->start > end) in __clear_extent_bit()
761 WARN_ON(state->end < start); in __clear_extent_bit()
762 last_end = state->end; in __clear_extent_bit()
765 if (!(state->state & bits)) { in __clear_extent_bit()
766 state = next_state(state); in __clear_extent_bit()
786 if (state->start < start) { in __clear_extent_bit()
789 err = split_state(tree, state, prealloc, start); in __clear_extent_bit()
796 if (state->end <= end) { in __clear_extent_bit()
797 state = clear_state_bit(tree, state, &bits, wake, in __clear_extent_bit()
809 if (state->start <= end && state->end > end) { in __clear_extent_bit()
812 err = split_state(tree, state, prealloc, end + 1); in __clear_extent_bit()
817 wake_up(&state->wq); in __clear_extent_bit()
825 state = clear_state_bit(tree, state, &bits, wake, changeset); in __clear_extent_bit()
830 if (start <= end && state && !need_resched()) in __clear_extent_bit()
851 struct extent_state *state) in wait_on_state() argument
856 prepare_to_wait(&state->wq, &wait, TASK_UNINTERRUPTIBLE); in wait_on_state()
860 finish_wait(&state->wq, &wait); in wait_on_state()
871 struct extent_state *state; in wait_extent_bit() local
888 state = rb_entry(node, struct extent_state, rb_node); in wait_extent_bit()
890 if (state->start > end) in wait_extent_bit()
893 if (state->state & bits) { in wait_extent_bit()
894 start = state->start; in wait_extent_bit()
895 refcount_inc(&state->refs); in wait_extent_bit()
896 wait_on_state(tree, state); in wait_extent_bit()
897 free_extent_state(state); in wait_extent_bit()
900 start = state->end + 1; in wait_extent_bit()
915 struct extent_state *state, in set_state_bits() argument
922 btrfs_set_delalloc_extent(tree->private_data, state, bits); in set_state_bits()
924 if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) { in set_state_bits()
925 u64 range = state->end - state->start + 1; in set_state_bits()
928 ret = add_extent_changeset(state, bits_to_set, changeset, 1); in set_state_bits()
930 state->state |= bits_to_set; in set_state_bits()
933 static void cache_state_if_flags(struct extent_state *state, in cache_state_if_flags() argument
938 if (!flags || (state->state & flags)) { in cache_state_if_flags()
939 *cached_ptr = state; in cache_state_if_flags()
940 refcount_inc(&state->refs); in cache_state_if_flags()
945 static void cache_state(struct extent_state *state, in cache_state() argument
948 return cache_state_if_flags(state, cached_ptr, in cache_state()
969 struct extent_state *state; in __set_extent_bit() local
995 state = *cached_state; in __set_extent_bit()
996 if (state->start <= start && state->end > start && in __set_extent_bit()
997 extent_state_in_tree(state)) { in __set_extent_bit()
998 node = &state->rb_node; in __set_extent_bit()
1019 state = rb_entry(node, struct extent_state, rb_node); in __set_extent_bit()
1021 last_start = state->start; in __set_extent_bit()
1022 last_end = state->end; in __set_extent_bit()
1030 if (state->start == start && state->end <= end) { in __set_extent_bit()
1031 if (state->state & exclusive_bits) { in __set_extent_bit()
1032 *failed_start = state->start; in __set_extent_bit()
1037 set_state_bits(tree, state, &bits, changeset); in __set_extent_bit()
1038 cache_state(state, cached_state); in __set_extent_bit()
1039 merge_state(tree, state); in __set_extent_bit()
1043 state = next_state(state); in __set_extent_bit()
1044 if (start < end && state && state->start == start && in __set_extent_bit()
1066 if (state->start < start) { in __set_extent_bit()
1067 if (state->state & exclusive_bits) { in __set_extent_bit()
1077 if ((state->state & bits) == bits) { in __set_extent_bit()
1078 start = state->end + 1; in __set_extent_bit()
1079 cache_state(state, cached_state); in __set_extent_bit()
1085 err = split_state(tree, state, prealloc, start); in __set_extent_bit()
1092 if (state->end <= end) { in __set_extent_bit()
1093 set_state_bits(tree, state, &bits, changeset); in __set_extent_bit()
1094 cache_state(state, cached_state); in __set_extent_bit()
1095 merge_state(tree, state); in __set_extent_bit()
1099 state = next_state(state); in __set_extent_bit()
1100 if (start < end && state && state->start == start && in __set_extent_bit()
1113 if (state->start > start) { in __set_extent_bit()
1143 if (state->start <= end && state->end > end) { in __set_extent_bit()
1144 if (state->state & exclusive_bits) { in __set_extent_bit()
1152 err = split_state(tree, state, prealloc, end + 1); in __set_extent_bit()
1211 struct extent_state *state; in convert_extent_bit() local
1241 state = *cached_state; in convert_extent_bit()
1242 if (state->start <= start && state->end > start && in convert_extent_bit()
1243 extent_state_in_tree(state)) { in convert_extent_bit()
1244 node = &state->rb_node; in convert_extent_bit()
1268 state = rb_entry(node, struct extent_state, rb_node); in convert_extent_bit()
1270 last_start = state->start; in convert_extent_bit()
1271 last_end = state->end; in convert_extent_bit()
1279 if (state->start == start && state->end <= end) { in convert_extent_bit()
1280 set_state_bits(tree, state, &bits, NULL); in convert_extent_bit()
1281 cache_state(state, cached_state); in convert_extent_bit()
1282 state = clear_state_bit(tree, state, &clear_bits, 0, NULL); in convert_extent_bit()
1286 if (start < end && state && state->start == start && in convert_extent_bit()
1308 if (state->start < start) { in convert_extent_bit()
1314 err = split_state(tree, state, prealloc, start); in convert_extent_bit()
1320 if (state->end <= end) { in convert_extent_bit()
1321 set_state_bits(tree, state, &bits, NULL); in convert_extent_bit()
1322 cache_state(state, cached_state); in convert_extent_bit()
1323 state = clear_state_bit(tree, state, &clear_bits, 0, in convert_extent_bit()
1328 if (start < end && state && state->start == start && in convert_extent_bit()
1341 if (state->start > start) { in convert_extent_bit()
1373 if (state->start <= end && state->end > end) { in convert_extent_bit()
1380 err = split_state(tree, state, prealloc, end + 1); in convert_extent_bit()
1531 struct extent_state *state; in find_first_extent_bit_state() local
1542 state = rb_entry(node, struct extent_state, rb_node); in find_first_extent_bit_state()
1543 if (state->end >= start && (state->state & bits)) in find_first_extent_bit_state()
1544 return state; in find_first_extent_bit_state()
1565 struct extent_state *state; in find_first_extent_bit() local
1570 state = *cached_state; in find_first_extent_bit()
1571 if (state->end == start - 1 && extent_state_in_tree(state)) { in find_first_extent_bit()
1572 while ((state = next_state(state)) != NULL) { in find_first_extent_bit()
1573 if (state->state & bits) in find_first_extent_bit()
1584 state = find_first_extent_bit_state(tree, start, bits); in find_first_extent_bit()
1586 if (state) { in find_first_extent_bit()
1587 cache_state_if_flags(state, cached_state, 0); in find_first_extent_bit()
1588 *start_ret = state->start; in find_first_extent_bit()
1589 *end_ret = state->end; in find_first_extent_bit()
1615 struct extent_state *state; in find_contiguous_extent_bit() local
1619 state = find_first_extent_bit_state(tree, start, bits); in find_contiguous_extent_bit()
1620 if (state) { in find_contiguous_extent_bit()
1621 *start_ret = state->start; in find_contiguous_extent_bit()
1622 *end_ret = state->end; in find_contiguous_extent_bit()
1623 while ((state = next_state(state)) != NULL) { in find_contiguous_extent_bit()
1624 if (state->start > (*end_ret + 1)) in find_contiguous_extent_bit()
1626 *end_ret = state->end; in find_contiguous_extent_bit()
1652 struct extent_state *state; in find_first_clear_extent_bit() local
1673 state = rb_entry(prev, struct extent_state, rb_node); in find_first_clear_extent_bit()
1674 *start_ret = state->end + 1; in find_first_clear_extent_bit()
1684 state = rb_entry(node, struct extent_state, rb_node); in find_first_clear_extent_bit()
1686 if (in_range(start, state->start, state->end - state->start + 1)) { in find_first_clear_extent_bit()
1687 if (state->state & bits) { in find_first_clear_extent_bit()
1693 start = state->end + 1; in find_first_clear_extent_bit()
1704 *start_ret = state->start; in find_first_clear_extent_bit()
1720 state = rb_entry(prev, struct extent_state, in find_first_clear_extent_bit()
1722 *start_ret = state->end + 1; in find_first_clear_extent_bit()
1735 state = rb_entry(node, struct extent_state, rb_node); in find_first_clear_extent_bit()
1736 if (state->end >= start && !(state->state & bits)) { in find_first_clear_extent_bit()
1737 *end_ret = state->end; in find_first_clear_extent_bit()
1739 *end_ret = state->start - 1; in find_first_clear_extent_bit()
1762 struct extent_state *state; in btrfs_find_delalloc_range() local
1780 state = rb_entry(node, struct extent_state, rb_node); in btrfs_find_delalloc_range()
1781 if (found && (state->start != cur_start || in btrfs_find_delalloc_range()
1782 (state->state & EXTENT_BOUNDARY))) { in btrfs_find_delalloc_range()
1785 if (!(state->state & EXTENT_DELALLOC)) { in btrfs_find_delalloc_range()
1787 *end = state->end; in btrfs_find_delalloc_range()
1791 *start = state->start; in btrfs_find_delalloc_range()
1792 *cached_state = state; in btrfs_find_delalloc_range()
1793 refcount_inc(&state->refs); in btrfs_find_delalloc_range()
1796 *end = state->end; in btrfs_find_delalloc_range()
1797 cur_start = state->end + 1; in btrfs_find_delalloc_range()
1799 total_bytes += state->end - state->start + 1; in btrfs_find_delalloc_range()
2041 struct extent_state *state; in count_range_bits() local
2064 state = rb_entry(node, struct extent_state, rb_node); in count_range_bits()
2065 if (state->start > search_end) in count_range_bits()
2067 if (contig && found && state->start > last + 1) in count_range_bits()
2069 if (state->end >= cur_start && (state->state & bits) == bits) { in count_range_bits()
2070 total_bytes += min(search_end, state->end) + 1 - in count_range_bits()
2071 max(cur_start, state->start); in count_range_bits()
2075 *start = max(cur_start, state->start); in count_range_bits()
2078 last = state->end; in count_range_bits()
2099 struct extent_state *state; in set_state_failrec() local
2112 state = rb_entry(node, struct extent_state, rb_node); in set_state_failrec()
2113 if (state->start != start) { in set_state_failrec()
2117 state->failrec = failrec; in set_state_failrec()
2126 struct extent_state *state; in get_state_failrec() local
2139 state = rb_entry(node, struct extent_state, rb_node); in get_state_failrec()
2140 if (state->start != start) { in get_state_failrec()
2145 failrec = state->failrec; in get_state_failrec()
2160 struct extent_state *state = NULL; in test_range_bit() local
2171 state = rb_entry(node, struct extent_state, rb_node); in test_range_bit()
2173 if (filled && state->start > start) { in test_range_bit()
2178 if (state->start > end) in test_range_bit()
2181 if (state->state & bits) { in test_range_bit()
2190 if (state->end == (u64)-1) in test_range_bit()
2193 start = state->end + 1; in test_range_bit()
2368 struct extent_state *state; in clean_io_failure() local
2395 state = find_first_extent_bit_state(io_tree, in clean_io_failure()
2400 if (state && state->start <= failrec->start && in clean_io_failure()
2401 state->end >= failrec->start + failrec->len - 1) { in clean_io_failure()
2427 struct extent_state *state, *next; in btrfs_free_io_failure_record() local
2429 if (RB_EMPTY_ROOT(&failure_tree->state)) in btrfs_free_io_failure_record()
2433 state = find_first_extent_bit_state(failure_tree, start, EXTENT_DIRTY); in btrfs_free_io_failure_record()
2434 while (state) { in btrfs_free_io_failure_record()
2435 if (state->start > end) in btrfs_free_io_failure_record()
2438 ASSERT(state->end <= end); in btrfs_free_io_failure_record()
2440 next = next_state(state); in btrfs_free_io_failure_record()
2442 failrec = state->failrec; in btrfs_free_io_failure_record()
2443 free_extent_state(state); in btrfs_free_io_failure_record()
2446 state = next; in btrfs_free_io_failure_record()