Example #1
0
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);
	}
}
Example #2
0
/*
 * 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;
}