1 // SPDX-License-Identifier: GPL-2.0+
4 * Crossported from the same named file of btrfs-progs.
6 * Minor modification to include headers.
8 #ifndef __BTRFS_EXTENT_CACHE_H__
9 #define __BTRFS_EXTENT_CACHE_H__
11 #include <linux/rbtree.h>
12 #include <linux/types.h>
19 struct rb_node rb_node
;
25 void cache_tree_init(struct cache_tree
*tree
);
27 struct cache_extent
*first_cache_extent(struct cache_tree
*tree
);
28 struct cache_extent
*last_cache_extent(struct cache_tree
*tree
);
29 struct cache_extent
*prev_cache_extent(struct cache_extent
*pe
);
30 struct cache_extent
*next_cache_extent(struct cache_extent
*pe
);
33 * Find a cache_extent which covers start.
35 * If not found, return next cache_extent if possible.
37 struct cache_extent
*search_cache_extent(struct cache_tree
*tree
, u64 start
);
40 * Find a cache_extent which restrictly covers start.
42 * If not found, return NULL.
44 struct cache_extent
*lookup_cache_extent(struct cache_tree
*tree
,
48 * Add an non-overlap extent into cache tree
50 * If [start, start+size) overlap with existing one, it will return -EEXIST.
52 int add_cache_extent(struct cache_tree
*tree
, u64 start
, u64 size
);
55 * Same with add_cache_extent, but with cache_extent strcut.
57 int insert_cache_extent(struct cache_tree
*tree
, struct cache_extent
*pe
);
58 void remove_cache_extent(struct cache_tree
*tree
, struct cache_extent
*pe
);
60 static inline int cache_tree_empty(struct cache_tree
*tree
)
62 return RB_EMPTY_ROOT(&tree
->root
);
65 typedef void (*free_cache_extent
)(struct cache_extent
*pe
);
67 void cache_tree_free_extents(struct cache_tree
*tree
,
68 free_cache_extent free_func
);
70 #define FREE_EXTENT_CACHE_BASED_TREE(name, free_func) \
71 static void free_##name##_tree(struct cache_tree *tree) \
73 cache_tree_free_extents(tree, free_func); \
76 void free_extent_cache_tree(struct cache_tree
*tree
);
79 * Search a cache_extent with same objectid, and covers start.
81 * If not found, return next if possible.
83 struct cache_extent
*search_cache_extent2(struct cache_tree
*tree
,
84 u64 objectid
, u64 start
);
86 * Search a cache_extent with same objectid, and covers the range
87 * [start, start + size)
89 * If not found, return next cache_extent if possible.
91 struct cache_extent
*lookup_cache_extent2(struct cache_tree
*tree
,
92 u64 objectid
, u64 start
, u64 size
);
93 int insert_cache_extent2(struct cache_tree
*tree
, struct cache_extent
*pe
);
96 * Insert a cache_extent range [start, start + size).
98 * This function may merge with existing cache_extent.
99 * NOTE: caller must ensure the inserted range won't cover with any existing
102 int add_merge_cache_extent(struct cache_tree
*tree
, u64 start
, u64 size
);