1 #ifndef __EXTENTMAP__ 2 #define __EXTENTMAP__ 3 4 #include <linux/rbtree.h> 5 6 #define EXTENT_MAP_HOLE (u64)-3 7 #define EXTENT_MAP_INLINE (u64)-2 8 #define EXTENT_MAP_DELALLOC (u64)-1 9 10 /* bits for the extent state */ 11 #define EXTENT_DIRTY 1 12 #define EXTENT_WRITEBACK (1 << 1) 13 #define EXTENT_UPTODATE (1 << 2) 14 #define EXTENT_LOCKED (1 << 3) 15 #define EXTENT_NEW (1 << 4) 16 #define EXTENT_DELALLOC (1 << 5) 17 #define EXTENT_DEFRAG (1 << 6) 18 #define EXTENT_DEFRAG_DONE (1 << 7) 19 #define EXTENT_BUFFER_FILLED (1 << 8) 20 #define EXTENT_CSUM (1 << 9) 21 #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) 22 23 /* 24 * page->private values. Every page that is controlled by the extent 25 * map has page->private set to one. 26 */ 27 #define EXTENT_PAGE_PRIVATE 1 28 #define EXTENT_PAGE_PRIVATE_FIRST_PAGE 3 29 30 31 struct extent_map_ops { 32 int (*fill_delalloc)(struct inode *inode, u64 start, u64 end); 33 int (*writepage_io_hook)(struct page *page, u64 start, u64 end); 34 int (*readpage_io_hook)(struct page *page, u64 start, u64 end); 35 int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end); 36 void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end); 37 }; 38 39 struct extent_map_tree { 40 struct rb_root map; 41 struct rb_root state; 42 struct address_space *mapping; 43 u64 dirty_bytes; 44 rwlock_t lock; 45 struct extent_map_ops *ops; 46 spinlock_t lru_lock; 47 struct list_head buffer_lru; 48 int lru_size; 49 }; 50 51 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */ 52 struct extent_map { 53 u64 start; 54 u64 end; /* inclusive */ 55 int in_tree; 56 struct rb_node rb_node; 57 /* block_start and block_end are in bytes */ 58 u64 block_start; 59 u64 block_end; /* inclusive */ 60 struct block_device *bdev; 61 atomic_t refs; 62 }; 63 64 /* note, this must start with the same fields as fs/extent_map.c:tree_entry */ 65 struct extent_state { 66 u64 start; 67 u64 end; /* inclusive */ 68 int in_tree; 69 struct rb_node rb_node; 70 wait_queue_head_t wq; 71 atomic_t refs; 72 unsigned long state; 73 74 /* for use by the FS */ 75 u64 private; 76 77 struct list_head list; 78 }; 79 80 struct extent_buffer { 81 u64 start; 82 unsigned long len; 83 char *map_token; 84 char *kaddr; 85 unsigned long map_start; 86 unsigned long map_len; 87 struct page *first_page; 88 struct list_head lru; 89 atomic_t refs; 90 int flags; 91 }; 92 93 typedef struct extent_map *(get_extent_t)(struct inode *inode, 94 struct page *page, 95 size_t page_offset, 96 u64 start, u64 end, 97 int create); 98 99 void extent_map_tree_init(struct extent_map_tree *tree, 100 struct address_space *mapping, gfp_t mask); 101 void extent_map_tree_empty_lru(struct extent_map_tree *tree); 102 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, 103 u64 start, u64 end); 104 int add_extent_mapping(struct extent_map_tree *tree, 105 struct extent_map *em); 106 int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em); 107 int try_release_extent_mapping(struct extent_map_tree *tree, struct page *page); 108 int lock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask); 109 int unlock_extent(struct extent_map_tree *tree, u64 start, u64 end, gfp_t mask); 110 struct extent_map *alloc_extent_map(gfp_t mask); 111 void free_extent_map(struct extent_map *em); 112 int extent_read_full_page(struct extent_map_tree *tree, struct page *page, 113 get_extent_t *get_extent); 114 int __init extent_map_init(void); 115 void extent_map_exit(void); 116 117 u64 count_range_bits(struct extent_map_tree *tree, 118 u64 *start, u64 max_bytes, unsigned long bits); 119 120 int test_range_bit(struct extent_map_tree *tree, u64 start, u64 end, 121 int bits, int filled); 122 int clear_extent_bits(struct extent_map_tree *tree, u64 start, u64 end, 123 int bits, gfp_t mask); 124 int set_extent_bits(struct extent_map_tree *tree, u64 start, u64 end, 125 int bits, gfp_t mask); 126 int set_extent_uptodate(struct extent_map_tree *tree, u64 start, u64 end, 127 gfp_t mask); 128 int set_extent_new(struct extent_map_tree *tree, u64 start, u64 end, 129 gfp_t mask); 130 int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end, 131 gfp_t mask); 132 int clear_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end, 133 gfp_t mask); 134 int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end, 135 gfp_t mask); 136 int find_first_extent_bit(struct extent_map_tree *tree, u64 start, 137 u64 *start_ret, u64 *end_ret, int bits); 138 int extent_invalidatepage(struct extent_map_tree *tree, 139 struct page *page, unsigned long offset); 140 int extent_write_full_page(struct extent_map_tree *tree, struct page *page, 141 get_extent_t *get_extent, 142 struct writeback_control *wbc); 143 int extent_writepages(struct extent_map_tree *tree, 144 struct address_space *mapping, 145 get_extent_t *get_extent, 146 struct writeback_control *wbc); 147 int extent_readpages(struct extent_map_tree *tree, 148 struct address_space *mapping, 149 struct list_head *pages, unsigned nr_pages, 150 get_extent_t get_extent); 151 int extent_prepare_write(struct extent_map_tree *tree, 152 struct inode *inode, struct page *page, 153 unsigned from, unsigned to, get_extent_t *get_extent); 154 int extent_commit_write(struct extent_map_tree *tree, 155 struct inode *inode, struct page *page, 156 unsigned from, unsigned to); 157 sector_t extent_bmap(struct address_space *mapping, sector_t iblock, 158 get_extent_t *get_extent); 159 int set_range_dirty(struct extent_map_tree *tree, u64 start, u64 end); 160 int set_state_private(struct extent_map_tree *tree, u64 start, u64 private); 161 int get_state_private(struct extent_map_tree *tree, u64 start, u64 *private); 162 void set_page_extent_mapped(struct page *page); 163 164 struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree, 165 u64 start, unsigned long len, 166 struct page *page0, 167 gfp_t mask); 168 struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree, 169 u64 start, unsigned long len, 170 gfp_t mask); 171 void free_extent_buffer(struct extent_buffer *eb); 172 int read_extent_buffer_pages(struct extent_map_tree *tree, 173 struct extent_buffer *eb, u64 start, int wait); 174 175 static inline void extent_buffer_get(struct extent_buffer *eb) 176 { 177 atomic_inc(&eb->refs); 178 } 179 180 int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, 181 unsigned long start, 182 unsigned long len); 183 void read_extent_buffer(struct extent_buffer *eb, void *dst, 184 unsigned long start, 185 unsigned long len); 186 void write_extent_buffer(struct extent_buffer *eb, const void *src, 187 unsigned long start, unsigned long len); 188 void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src, 189 unsigned long dst_offset, unsigned long src_offset, 190 unsigned long len); 191 void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 192 unsigned long src_offset, unsigned long len); 193 void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 194 unsigned long src_offset, unsigned long len); 195 void memset_extent_buffer(struct extent_buffer *eb, char c, 196 unsigned long start, unsigned long len); 197 int wait_on_extent_buffer_writeback(struct extent_map_tree *tree, 198 struct extent_buffer *eb); 199 int clear_extent_buffer_dirty(struct extent_map_tree *tree, 200 struct extent_buffer *eb); 201 int set_extent_buffer_dirty(struct extent_map_tree *tree, 202 struct extent_buffer *eb); 203 int set_extent_buffer_uptodate(struct extent_map_tree *tree, 204 struct extent_buffer *eb); 205 int extent_buffer_uptodate(struct extent_map_tree *tree, 206 struct extent_buffer *eb); 207 int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, 208 unsigned long min_len, char **token, char **map, 209 unsigned long *map_start, 210 unsigned long *map_len, int km); 211 int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset, 212 unsigned long min_len, char **token, char **map, 213 unsigned long *map_start, 214 unsigned long *map_len, int km); 215 void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); 216 #endif 217