extent_map.h 1.3 KB

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