extent_map.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifndef __EXTENTMAP__
  2. #define __EXTENTMAP__
  3. #include <linux/rbtree.h>
  4. #define EXTENT_MAP_INLINE (u64)-2
  5. #define EXTENT_MAP_DELALLOC (u64)-1
  6. struct extent_map_ops {
  7. int (*fill_delalloc)(struct inode *inode, u64 start, u64 end);
  8. int (*writepage_io_hook)(struct page *page, u64 start, u64 end);
  9. int (*readpage_io_hook)(struct page *page, u64 start, u64 end);
  10. int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end);
  11. };
  12. struct extent_map_tree {
  13. struct rb_root map;
  14. struct rb_root state;
  15. struct address_space *mapping;
  16. rwlock_t lock;
  17. struct extent_map_ops *ops;
  18. };
  19. /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
  20. struct extent_map {
  21. u64 start;
  22. u64 end; /* inclusive */
  23. int in_tree;
  24. struct rb_node rb_node;
  25. /* block_start and block_end are in bytes */
  26. u64 block_start;
  27. u64 block_end; /* inclusive */
  28. struct block_device *bdev;
  29. atomic_t refs;
  30. };
  31. /* note, this must start with the same fields as fs/extent_map.c:tree_entry */
  32. struct extent_state {
  33. u64 start;
  34. u64 end; /* inclusive */
  35. int in_tree;
  36. struct rb_node rb_node;
  37. wait_queue_head_t wq;
  38. atomic_t refs;
  39. unsigned long state;
  40. /* for use by the FS */
  41. u64 private;
  42. struct list_head list;
  43. };
  44. struct extent_buffer {
  45. u64 start;
  46. u64 end; /* inclusive */
  47. char *addr;
  48. struct page *pages[];
  49. };
  50. typedef struct extent_map *(get_extent_t)(struct inode *inode,
  51. struct page *page,
  52. size_t page_offset,
  53. u64 start, u64 end,
  54. int create);
  55. void extent_map_tree_init(struct extent_map_tree *tree,
  56. struct address_space *mapping, gfp_t mask);
  57. struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
  58. u64 start, u64 end);
  59. int add_extent_mapping(struct extent_map_tree *tree,
  60. struct extent_map *em);
  61. int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
  62. int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page);
  63. int lock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
  64. int unlock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask);
  65. struct extent_map *alloc_extent_map(gfp_t mask);
  66. void free_extent_map(struct extent_map *em);
  67. int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
  68. get_extent_t *get_extent);
  69. void __init extent_map_init(void);
  70. void __exit extent_map_exit(void);
  71. int extent_clean_all_trees(struct extent_map_tree *tree);
  72. int set_extent_uptodate(struct extent_map_tree *tree, u64 start, u64 end,
  73. gfp_t mask);
  74. int set_extent_new(struct extent_map_tree *tree, u64 start, u64 end,
  75. gfp_t mask);
  76. int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end,
  77. gfp_t mask);
  78. int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end,
  79. gfp_t mask);
  80. int extent_invalidatepage(struct extent_map_tree *tree,
  81. struct page *page, unsigned long offset);
  82. int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
  83. get_extent_t *get_extent,
  84. struct writeback_control *wbc);
  85. int extent_prepare_write(struct extent_map_tree *tree,
  86. struct inode *inode, struct page *page,
  87. unsigned from, unsigned to, get_extent_t *get_extent);
  88. int extent_commit_write(struct extent_map_tree *tree,
  89. struct inode *inode, struct page *page,
  90. unsigned from, unsigned to);
  91. sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
  92. get_extent_t *get_extent);
  93. int set_range_dirty(struct extent_map_tree *tree, u64 start, u64 end);
  94. int set_state_private(struct extent_map_tree *tree, u64 start, u64 private);
  95. int get_state_private(struct extent_map_tree *tree, u64 start, u64 *private);
  96. #endif