aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.h
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent_io.h')
-rw-r--r--fs/btrfs/extent_io.h67
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
86struct extent_io_tree { 91struct 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
138struct extent_map_tree; 143static 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
140static inline struct extent_state *extent_state_next(struct extent_state *state) 149static 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
154struct extent_map_tree;
155
149typedef struct extent_map *(get_extent_t)(struct inode *inode, 156typedef 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
155void extent_io_tree_init(struct extent_io_tree *tree, 162void extent_io_tree_init(struct extent_io_tree *tree,
156 struct address_space *mapping, gfp_t mask); 163 struct address_space *mapping);
157int try_release_extent_mapping(struct extent_map_tree *map, 164int 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
177u64 count_range_bits(struct extent_io_tree *tree, 184u64 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
181void free_extent_state(struct extent_state *state); 188void free_extent_state(struct extent_state *state);
182int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, 189int 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);
194int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end, 201int 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);
196int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end, 203int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
197 gfp_t mask); 204 gfp_t mask);
198int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, 205int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
199 gfp_t mask); 206 gfp_t mask);
200int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, 207int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
201 gfp_t mask); 208 gfp_t mask);
202int clear_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end,
203 gfp_t mask);
204int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start,
205 u64 end, gfp_t mask);
206int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, 209int 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);
208int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end,
209 gfp_t mask);
210int find_first_extent_bit(struct extent_io_tree *tree, u64 start, 211int 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);
212struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree, 213struct 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);
230int 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);
233int extent_commit_write(struct extent_io_tree *tree,
234 struct inode *inode, struct page *page,
235 unsigned from, unsigned to);
236sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
237 get_extent_t *get_extent);
238int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, 231int 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);
240int set_range_dirty(struct extent_io_tree *tree, u64 start, u64 end);
241int set_state_private(struct extent_io_tree *tree, u64 start, u64 private); 233int set_state_private(struct extent_io_tree *tree, u64 start, u64 private);
242int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private); 234int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private);
243void set_page_extent_mapped(struct page *page); 235void set_page_extent_mapped(struct page *page);
244 236
245struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, 237struct 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);
249struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, 240struct 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);
252void free_extent_buffer(struct extent_buffer *eb); 242void free_extent_buffer(struct extent_buffer *eb);
253int read_extent_buffer_pages(struct extent_io_tree *tree, 243int 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);
277void memset_extent_buffer(struct extent_buffer *eb, char c, 267void memset_extent_buffer(struct extent_buffer *eb, char c,
278 unsigned long start, unsigned long len); 268 unsigned long start, unsigned long len);
279int wait_on_extent_buffer_writeback(struct extent_io_tree *tree,
280 struct extent_buffer *eb);
281int wait_on_extent_writeback(struct extent_io_tree *tree, u64 start, u64 end);
282int wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits); 269int wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits);
283int clear_extent_buffer_dirty(struct extent_io_tree *tree, 270int clear_extent_buffer_dirty(struct extent_io_tree *tree,
284 struct extent_buffer *eb); 271 struct extent_buffer *eb);
285int set_extent_buffer_dirty(struct extent_io_tree *tree, 272int set_extent_buffer_dirty(struct extent_io_tree *tree,
286 struct extent_buffer *eb); 273 struct extent_buffer *eb);
287int test_extent_buffer_dirty(struct extent_io_tree *tree,
288 struct extent_buffer *eb);
289int set_extent_buffer_uptodate(struct extent_io_tree *tree, 274int set_extent_buffer_uptodate(struct extent_io_tree *tree,
290 struct extent_buffer *eb); 275 struct extent_buffer *eb);
291int clear_extent_buffer_uptodate(struct extent_io_tree *tree, 276int 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);
305void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); 290void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km);
306int release_extent_buffer_tail_pages(struct extent_buffer *eb);
307int extent_range_uptodate(struct extent_io_tree *tree, 291int extent_range_uptodate(struct extent_io_tree *tree,
308 u64 start, u64 end); 292 u64 start, u64 end);
309int extent_clear_unlock_delalloc(struct inode *inode, 293int 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);
297struct bio *
298btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
299 gfp_t gfp_flags);
313#endif 300#endif