xref: /openbmc/linux/fs/btrfs/extent_map.h (revision d1310b2e0cd98eb1348553e69b73827b436dca7b)
1 #ifndef __EXTENTMAP__
2 #define __EXTENTMAP__
3 
4 #include <linux/rbtree.h>
5 
6 #define EXTENT_MAP_LAST_BYTE (u64)-4
7 #define EXTENT_MAP_HOLE (u64)-3
8 #define EXTENT_MAP_INLINE (u64)-2
9 #define EXTENT_MAP_DELALLOC (u64)-1
10 
11 struct extent_map {
12 	struct rb_node rb_node;
13 
14 	/* all of these are in bytes */
15 	u64 start;
16 	u64 len;
17 	u64 block_start;
18 	unsigned long flags;
19 	struct block_device *bdev;
20 	atomic_t refs;
21 	int in_tree;
22 };
23 
24 struct extent_map_tree {
25 	struct rb_root map;
26 	struct extent_map *last;
27 	spinlock_t lock;
28 };
29 
30 static inline u64 extent_map_end(struct extent_map *em)
31 {
32 	if (em->start + em->len < em->start)
33 		return (u64)-1;
34 	return em->start + em->len;
35 }
36 
37 static inline u64 extent_map_block_end(struct extent_map *em)
38 {
39 	if (em->block_start + em->len < em->block_start)
40 		return (u64)-1;
41 	return em->block_start + em->len;
42 }
43 
44 void extent_map_tree_init(struct extent_map_tree *tree, gfp_t mask);
45 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
46 					 u64 start, u64 len);
47 int add_extent_mapping(struct extent_map_tree *tree,
48 		       struct extent_map *em);
49 int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
50 
51 struct extent_map *alloc_extent_map(gfp_t mask);
52 void free_extent_map(struct extent_map *em);
53 int __init extent_map_init(void);
54 void extent_map_exit(void);
55 #endif
56