extent_map.h 3.6 KB

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