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