Lines Matching full:tree
31 * extent_map_tree_init - initialize extent map tree
32 * @tree: tree to initialize
34 * Initialize the extent tree @tree. Should be called for each new inode
37 void extent_map_tree_init(struct extent_map_tree *tree) in extent_map_tree_init() argument
39 tree->map = RB_ROOT_CACHED; in extent_map_tree_init()
40 INIT_LIST_HEAD(&tree->modified_extents); in extent_map_tree_init()
41 rwlock_init(&tree->lock); in extent_map_tree_init()
140 * search through the tree for an extent_map with a given offset. If
239 static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em) in try_merge_map() argument
245 * We can't modify an extent map that is in the tree and that is being in try_merge_map()
248 * the tree and 1 for this task (which is unpinning the extent map or in try_merge_map()
270 rb_erase_cached(&merge->rb_node, &tree->map); in try_merge_map()
282 rb_erase_cached(&merge->rb_node, &tree->map); in try_merge_map()
293 * @tree: tree to unpin the extent in
302 int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len, in unpin_extent_cache() argument
309 write_lock(&tree->lock); in unpin_extent_cache()
310 em = lookup_extent_mapping(tree, start, len); in unpin_extent_cache()
327 try_merge_map(tree, em); in unpin_extent_cache()
336 write_unlock(&tree->lock); in unpin_extent_cache()
341 void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em) in clear_em_logging() argument
343 lockdep_assert_held_write(&tree->lock); in clear_em_logging()
347 try_merge_map(tree, em); in clear_em_logging()
350 static inline void setup_extent_mapping(struct extent_map_tree *tree, in setup_extent_mapping() argument
359 list_move(&em->list, &tree->modified_extents); in setup_extent_mapping()
361 try_merge_map(tree, em); in setup_extent_mapping()
396 * Add new extent map to the extent tree
398 * @tree: tree to insert new map in
403 * Insert @em into @tree or perform a simple forward/backward merge with
405 * into the tree directly, with an additional reference taken, or a
408 int add_extent_mapping(struct extent_map_tree *tree, in add_extent_mapping() argument
413 lockdep_assert_held_write(&tree->lock); in add_extent_mapping()
415 ret = tree_insert(&tree->map, em); in add_extent_mapping()
419 setup_extent_mapping(tree, em, modified); in add_extent_mapping()
429 __lookup_extent_mapping(struct extent_map_tree *tree, in __lookup_extent_mapping() argument
437 rb_node = __tree_search(&tree->map.rb_root, start, &prev_or_next); in __lookup_extent_mapping()
456 * @tree: tree to lookup in
460 * Find and return the first extent_map struct in @tree that intersects the
461 * [start, len] range. There may be additional objects in the tree that
465 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, in lookup_extent_mapping() argument
468 return __lookup_extent_mapping(tree, start, len, 1); in lookup_extent_mapping()
473 * @tree: tree to lookup in
477 * Find and return the first extent_map struct in @tree that intersects the
482 struct extent_map *search_extent_mapping(struct extent_map_tree *tree, in search_extent_mapping() argument
485 return __lookup_extent_mapping(tree, start, len, 0); in search_extent_mapping()
489 * remove_extent_mapping - removes an extent_map from the extent tree
490 * @tree: extent tree to remove from
493 * Removes @em from @tree. No reference counts are dropped, and no checks
496 void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em) in remove_extent_mapping() argument
498 lockdep_assert_held_write(&tree->lock); in remove_extent_mapping()
501 rb_erase_cached(&em->rb_node, &tree->map); in remove_extent_mapping()
509 void replace_extent_mapping(struct extent_map_tree *tree, in replace_extent_mapping() argument
514 lockdep_assert_held_write(&tree->lock); in replace_extent_mapping()
520 rb_replace_node_cached(&cur->rb_node, &new->rb_node, &tree->map); in replace_extent_mapping()
523 setup_extent_mapping(tree, new, modified); in replace_extent_mapping()
547 * Helper for btrfs_get_extent. Given an existing extent in the tree,
550 * the best fitted new extent into the tree.
592 * @em_tree: extent tree into which we want to insert the extent mapping
617 /* it is possible that someone inserted the extent into the tree in btrfs_add_extent_mapping()
619 * an overlapping map exists in the tree in btrfs_add_extent_mapping()
666 * Drop all extent maps from a tree in the fastest possible way, rescheduling
667 * if needed. This avoids searching the tree, from the root down to the first
670 static void drop_all_extent_maps_fast(struct extent_map_tree *tree) in drop_all_extent_maps_fast() argument
672 write_lock(&tree->lock); in drop_all_extent_maps_fast()
673 while (!RB_EMPTY_ROOT(&tree->map.rb_root)) { in drop_all_extent_maps_fast()
677 node = rb_first_cached(&tree->map); in drop_all_extent_maps_fast()
681 remove_extent_mapping(tree, em); in drop_all_extent_maps_fast()
683 cond_resched_rwlock_write(&tree->lock); in drop_all_extent_maps_fast()
685 write_unlock(&tree->lock); in drop_all_extent_maps_fast()
700 * tree before calling this function.
870 * If the extent map is still in the tree it means that in btrfs_drop_extent_map_range()
883 * load it again from the subvolume tree's file extent in btrfs_drop_extent_map_range()
897 * Once for the tree reference (we replaced or removed the in btrfs_drop_extent_map_range()
898 * extent map from the tree). in btrfs_drop_extent_map_range()
915 * Replace a range in the inode's extent map tree with a new extent map.
918 * @new_em: The new extent map to add to the inode's extent map tree.
922 * Drops all the extent maps in the inode's extent map tree that intersect the
923 * range of the new extent map and adds the new extent map to the tree.
925 * tree before calling this function.
932 struct extent_map_tree *tree = &inode->extent_tree; in btrfs_replace_extent_map_range() local
939 * tree, but getting -EEXIST when adding the new extent map can still in btrfs_replace_extent_map_range()
947 write_lock(&tree->lock); in btrfs_replace_extent_map_range()
948 ret = add_extent_mapping(tree, new_em, modified); in btrfs_replace_extent_map_range()
949 write_unlock(&tree->lock); in btrfs_replace_extent_map_range()