1
2
3
4
5
6
7
8#ifndef __BTRFS_EXTENT_CACHE_H__
9#define __BTRFS_EXTENT_CACHE_H__
10
11#include <linux/rbtree.h>
12#include <linux/types.h>
13
14struct cache_tree {
15 struct rb_root root;
16};
17
18struct cache_extent {
19 struct rb_node rb_node;
20 u64 objectid;
21 u64 start;
22 u64 size;
23};
24
25void cache_tree_init(struct cache_tree *tree);
26
27struct cache_extent *first_cache_extent(struct cache_tree *tree);
28struct cache_extent *last_cache_extent(struct cache_tree *tree);
29struct cache_extent *prev_cache_extent(struct cache_extent *pe);
30struct cache_extent *next_cache_extent(struct cache_extent *pe);
31
32
33
34
35
36
37struct cache_extent *search_cache_extent(struct cache_tree *tree, u64 start);
38
39
40
41
42
43
44struct cache_extent *lookup_cache_extent(struct cache_tree *tree,
45 u64 start, u64 size);
46
47
48
49
50
51
52int add_cache_extent(struct cache_tree *tree, u64 start, u64 size);
53
54
55
56
57int insert_cache_extent(struct cache_tree *tree, struct cache_extent *pe);
58void remove_cache_extent(struct cache_tree *tree, struct cache_extent *pe);
59
60static inline int cache_tree_empty(struct cache_tree *tree)
61{
62 return RB_EMPTY_ROOT(&tree->root);
63}
64
65typedef void (*free_cache_extent)(struct cache_extent *pe);
66
67void cache_tree_free_extents(struct cache_tree *tree,
68 free_cache_extent free_func);
69
70#define FREE_EXTENT_CACHE_BASED_TREE(name, free_func) \
71static void free_##name##_tree(struct cache_tree *tree) \
72{ \
73 cache_tree_free_extents(tree, free_func); \
74}
75
76void free_extent_cache_tree(struct cache_tree *tree);
77
78
79
80
81
82
83struct cache_extent *search_cache_extent2(struct cache_tree *tree,
84 u64 objectid, u64 start);
85
86
87
88
89
90
91struct cache_extent *lookup_cache_extent2(struct cache_tree *tree,
92 u64 objectid, u64 start, u64 size);
93int insert_cache_extent2(struct cache_tree *tree, struct cache_extent *pe);
94
95
96
97
98
99
100
101
102int add_merge_cache_extent(struct cache_tree *tree, u64 start, u64 size);
103
104#endif
105