diff options
Diffstat (limited to 'fs/btrfs/extent_io.h')
-rw-r--r-- | fs/btrfs/extent_io.h | 67 |
1 files changed, 27 insertions, 40 deletions
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 5691c7b590da..a11a92ee2d30 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -20,13 +20,18 @@ | |||
20 | #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) | 20 | #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) |
21 | #define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING | EXTENT_FIRST_DELALLOC) | 21 | #define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING | EXTENT_FIRST_DELALLOC) |
22 | 22 | ||
23 | /* flags for bio submission */ | 23 | /* |
24 | * flags for bio submission. The high bits indicate the compression | ||
25 | * type for this bio | ||
26 | */ | ||
24 | #define EXTENT_BIO_COMPRESSED 1 | 27 | #define EXTENT_BIO_COMPRESSED 1 |
28 | #define EXTENT_BIO_FLAG_SHIFT 16 | ||
25 | 29 | ||
26 | /* these are bit numbers for test/set bit */ | 30 | /* these are bit numbers for test/set bit */ |
27 | #define EXTENT_BUFFER_UPTODATE 0 | 31 | #define EXTENT_BUFFER_UPTODATE 0 |
28 | #define EXTENT_BUFFER_BLOCKING 1 | 32 | #define EXTENT_BUFFER_BLOCKING 1 |
29 | #define EXTENT_BUFFER_DIRTY 2 | 33 | #define EXTENT_BUFFER_DIRTY 2 |
34 | #define EXTENT_BUFFER_CORRUPT 3 | ||
30 | 35 | ||
31 | /* these are flags for extent_clear_unlock_delalloc */ | 36 | /* these are flags for extent_clear_unlock_delalloc */ |
32 | #define EXTENT_CLEAR_UNLOCK_PAGE 0x1 | 37 | #define EXTENT_CLEAR_UNLOCK_PAGE 0x1 |
@@ -85,7 +90,7 @@ struct extent_io_ops { | |||
85 | 90 | ||
86 | struct extent_io_tree { | 91 | struct extent_io_tree { |
87 | struct rb_root state; | 92 | struct rb_root state; |
88 | struct rb_root buffer; | 93 | struct radix_tree_root buffer; |
89 | struct address_space *mapping; | 94 | struct address_space *mapping; |
90 | u64 dirty_bytes; | 95 | u64 dirty_bytes; |
91 | spinlock_t lock; | 96 | spinlock_t lock; |
@@ -121,9 +126,9 @@ struct extent_buffer { | |||
121 | unsigned long map_len; | 126 | unsigned long map_len; |
122 | struct page *first_page; | 127 | struct page *first_page; |
123 | unsigned long bflags; | 128 | unsigned long bflags; |
124 | atomic_t refs; | ||
125 | struct list_head leak_list; | 129 | struct list_head leak_list; |
126 | struct rb_node rb_node; | 130 | struct rcu_head rcu_head; |
131 | atomic_t refs; | ||
127 | 132 | ||
128 | /* the spinlock is used to protect most operations */ | 133 | /* the spinlock is used to protect most operations */ |
129 | spinlock_t lock; | 134 | spinlock_t lock; |
@@ -135,25 +140,27 @@ struct extent_buffer { | |||
135 | wait_queue_head_t lock_wq; | 140 | wait_queue_head_t lock_wq; |
136 | }; | 141 | }; |
137 | 142 | ||
138 | struct extent_map_tree; | 143 | static inline void extent_set_compress_type(unsigned long *bio_flags, |
144 | int compress_type) | ||
145 | { | ||
146 | *bio_flags |= compress_type << EXTENT_BIO_FLAG_SHIFT; | ||
147 | } | ||
139 | 148 | ||
140 | static inline struct extent_state *extent_state_next(struct extent_state *state) | 149 | static inline int extent_compress_type(unsigned long bio_flags) |
141 | { | 150 | { |
142 | struct rb_node *node; | 151 | return bio_flags >> EXTENT_BIO_FLAG_SHIFT; |
143 | node = rb_next(&state->rb_node); | ||
144 | if (!node) | ||
145 | return NULL; | ||
146 | return rb_entry(node, struct extent_state, rb_node); | ||
147 | } | 152 | } |
148 | 153 | ||
154 | struct extent_map_tree; | ||
155 | |||
149 | typedef struct extent_map *(get_extent_t)(struct inode *inode, | 156 | typedef struct extent_map *(get_extent_t)(struct inode *inode, |
150 | struct page *page, | 157 | struct page *page, |
151 | size_t page_offset, | 158 | size_t pg_offset, |
152 | u64 start, u64 len, | 159 | u64 start, u64 len, |
153 | int create); | 160 | int create); |
154 | 161 | ||
155 | void extent_io_tree_init(struct extent_io_tree *tree, | 162 | void extent_io_tree_init(struct extent_io_tree *tree, |
156 | struct address_space *mapping, gfp_t mask); | 163 | struct address_space *mapping); |
157 | int try_release_extent_mapping(struct extent_map_tree *map, | 164 | int try_release_extent_mapping(struct extent_map_tree *map, |
158 | struct extent_io_tree *tree, struct page *page, | 165 | struct extent_io_tree *tree, struct page *page, |
159 | gfp_t mask); | 166 | gfp_t mask); |
@@ -176,7 +183,7 @@ void extent_io_exit(void); | |||
176 | 183 | ||
177 | u64 count_range_bits(struct extent_io_tree *tree, | 184 | u64 count_range_bits(struct extent_io_tree *tree, |
178 | u64 *start, u64 search_end, | 185 | u64 *start, u64 search_end, |
179 | u64 max_bytes, unsigned long bits); | 186 | u64 max_bytes, unsigned long bits, int contig); |
180 | 187 | ||
181 | void free_extent_state(struct extent_state *state); | 188 | void free_extent_state(struct extent_state *state); |
182 | int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, | 189 | int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, |
@@ -192,21 +199,15 @@ int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | |||
192 | int bits, int exclusive_bits, u64 *failed_start, | 199 | int bits, int exclusive_bits, u64 *failed_start, |
193 | struct extent_state **cached_state, gfp_t mask); | 200 | struct extent_state **cached_state, gfp_t mask); |
194 | int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end, | 201 | int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end, |
195 | gfp_t mask); | 202 | struct extent_state **cached_state, gfp_t mask); |
196 | int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end, | 203 | int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end, |
197 | gfp_t mask); | 204 | gfp_t mask); |
198 | int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, | 205 | int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, |
199 | gfp_t mask); | 206 | gfp_t mask); |
200 | int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, | 207 | int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, |
201 | gfp_t mask); | 208 | gfp_t mask); |
202 | int clear_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, | ||
203 | gfp_t mask); | ||
204 | int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start, | ||
205 | u64 end, gfp_t mask); | ||
206 | int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, | 209 | int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, |
207 | struct extent_state **cached_state, gfp_t mask); | 210 | struct extent_state **cached_state, gfp_t mask); |
208 | int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, | ||
209 | gfp_t mask); | ||
210 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, | 211 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, |
211 | u64 *start_ret, u64 *end_ret, int bits); | 212 | u64 *start_ret, u64 *end_ret, int bits); |
212 | struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree, | 213 | struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree, |
@@ -227,28 +228,17 @@ int extent_readpages(struct extent_io_tree *tree, | |||
227 | struct address_space *mapping, | 228 | struct address_space *mapping, |
228 | struct list_head *pages, unsigned nr_pages, | 229 | struct list_head *pages, unsigned nr_pages, |
229 | get_extent_t get_extent); | 230 | get_extent_t get_extent); |
230 | int extent_prepare_write(struct extent_io_tree *tree, | ||
231 | struct inode *inode, struct page *page, | ||
232 | unsigned from, unsigned to, get_extent_t *get_extent); | ||
233 | int extent_commit_write(struct extent_io_tree *tree, | ||
234 | struct inode *inode, struct page *page, | ||
235 | unsigned from, unsigned to); | ||
236 | sector_t extent_bmap(struct address_space *mapping, sector_t iblock, | ||
237 | get_extent_t *get_extent); | ||
238 | int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 231 | int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
239 | __u64 start, __u64 len, get_extent_t *get_extent); | 232 | __u64 start, __u64 len, get_extent_t *get_extent); |
240 | int set_range_dirty(struct extent_io_tree *tree, u64 start, u64 end); | ||
241 | int set_state_private(struct extent_io_tree *tree, u64 start, u64 private); | 233 | int set_state_private(struct extent_io_tree *tree, u64 start, u64 private); |
242 | int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private); | 234 | int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private); |
243 | void set_page_extent_mapped(struct page *page); | 235 | void set_page_extent_mapped(struct page *page); |
244 | 236 | ||
245 | struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, | 237 | struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, |
246 | u64 start, unsigned long len, | 238 | u64 start, unsigned long len, |
247 | struct page *page0, | 239 | struct page *page0); |
248 | gfp_t mask); | ||
249 | struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, | 240 | struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, |
250 | u64 start, unsigned long len, | 241 | u64 start, unsigned long len); |
251 | gfp_t mask); | ||
252 | void free_extent_buffer(struct extent_buffer *eb); | 242 | void free_extent_buffer(struct extent_buffer *eb); |
253 | int read_extent_buffer_pages(struct extent_io_tree *tree, | 243 | int read_extent_buffer_pages(struct extent_io_tree *tree, |
254 | struct extent_buffer *eb, u64 start, int wait, | 244 | struct extent_buffer *eb, u64 start, int wait, |
@@ -276,16 +266,11 @@ void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, | |||
276 | unsigned long src_offset, unsigned long len); | 266 | unsigned long src_offset, unsigned long len); |
277 | void memset_extent_buffer(struct extent_buffer *eb, char c, | 267 | void memset_extent_buffer(struct extent_buffer *eb, char c, |
278 | unsigned long start, unsigned long len); | 268 | unsigned long start, unsigned long len); |
279 | int wait_on_extent_buffer_writeback(struct extent_io_tree *tree, | ||
280 | struct extent_buffer *eb); | ||
281 | int wait_on_extent_writeback(struct extent_io_tree *tree, u64 start, u64 end); | ||
282 | int wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits); | 269 | int wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits); |
283 | int clear_extent_buffer_dirty(struct extent_io_tree *tree, | 270 | int clear_extent_buffer_dirty(struct extent_io_tree *tree, |
284 | struct extent_buffer *eb); | 271 | struct extent_buffer *eb); |
285 | int set_extent_buffer_dirty(struct extent_io_tree *tree, | 272 | int set_extent_buffer_dirty(struct extent_io_tree *tree, |
286 | struct extent_buffer *eb); | 273 | struct extent_buffer *eb); |
287 | int test_extent_buffer_dirty(struct extent_io_tree *tree, | ||
288 | struct extent_buffer *eb); | ||
289 | int set_extent_buffer_uptodate(struct extent_io_tree *tree, | 274 | int set_extent_buffer_uptodate(struct extent_io_tree *tree, |
290 | struct extent_buffer *eb); | 275 | struct extent_buffer *eb); |
291 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, | 276 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, |
@@ -303,11 +288,13 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset, | |||
303 | unsigned long *map_start, | 288 | unsigned long *map_start, |
304 | unsigned long *map_len, int km); | 289 | unsigned long *map_len, int km); |
305 | void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); | 290 | void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); |
306 | int release_extent_buffer_tail_pages(struct extent_buffer *eb); | ||
307 | int extent_range_uptodate(struct extent_io_tree *tree, | 291 | int extent_range_uptodate(struct extent_io_tree *tree, |
308 | u64 start, u64 end); | 292 | u64 start, u64 end); |
309 | int extent_clear_unlock_delalloc(struct inode *inode, | 293 | int extent_clear_unlock_delalloc(struct inode *inode, |
310 | struct extent_io_tree *tree, | 294 | struct extent_io_tree *tree, |
311 | u64 start, u64 end, struct page *locked_page, | 295 | u64 start, u64 end, struct page *locked_page, |
312 | unsigned long op); | 296 | unsigned long op); |
297 | struct bio * | ||
298 | btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs, | ||
299 | gfp_t gfp_flags); | ||
313 | #endif | 300 | #endif |