static void print_find_root_result(struct cache_tree *result, struct btrfs_find_root_filter *filter) { struct btrfs_find_root_gen_cache *gen_cache; struct cache_extent *cache; struct cache_extent *tree_block; u64 generation = 0; u8 level = 0; for (cache = last_cache_extent(result); cache; cache = prev_cache_extent(cache)) { gen_cache = container_of(cache, struct btrfs_find_root_gen_cache, cache); level = gen_cache->highest_level; generation = cache->start; /* For exact found one, skip it as it's output before */ if (level == filter->match_level && generation == filter->match_gen && !filter->search_all) continue; for (tree_block = last_cache_extent(&gen_cache->eb_tree); tree_block; tree_block = prev_cache_extent(tree_block)) print_one_result(tree_block, level, generation, filter); } }
/* * Utility function to look for merge candidates inside a given range. * Any extents with matching state are merged together into a single * extent in the tree. Extents with EXTENT_IO in their state field are * not merged */ static int merge_state(struct extent_io_tree *tree, struct extent_state *state) { struct extent_state *other; struct cache_extent *other_node; if (state->state & EXTENT_IOBITS) return 0; other_node = prev_cache_extent(&state->cache_node); if (other_node) { other = container_of(other_node, struct extent_state, cache_node); if (other->end == state->start - 1 && other->state == state->state) { state->start = other->start; update_extent_state(state); remove_cache_extent(&tree->state, &other->cache_node); btrfs_free_extent_state(other); } } other_node = next_cache_extent(&state->cache_node); if (other_node) { other = container_of(other_node, struct extent_state, cache_node); if (other->start == state->end + 1 && other->state == state->state) { other->start = state->start; update_extent_state(other); remove_cache_extent(&tree->state, &state->cache_node); btrfs_free_extent_state(state); } } return 0; }