Blame view

fs/btrfs/extent_io.c 131 KB
d1310b2e0   Chris Mason   Btrfs: Split the ...
1
2
3
4
  #include <linux/bitops.h>
  #include <linux/slab.h>
  #include <linux/bio.h>
  #include <linux/mm.h>
d1310b2e0   Chris Mason   Btrfs: Split the ...
5
6
  #include <linux/pagemap.h>
  #include <linux/page-flags.h>
d1310b2e0   Chris Mason   Btrfs: Split the ...
7
8
9
  #include <linux/spinlock.h>
  #include <linux/blkdev.h>
  #include <linux/swap.h>
d1310b2e0   Chris Mason   Btrfs: Split the ...
10
11
  #include <linux/writeback.h>
  #include <linux/pagevec.h>
268bb0ce3   Linus Torvalds   sanitize <linux/p...
12
  #include <linux/prefetch.h>
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
13
  #include <linux/cleancache.h>
d1310b2e0   Chris Mason   Btrfs: Split the ...
14
15
  #include "extent_io.h"
  #include "extent_map.h"
2db04966a   David Woodhouse   Btrfs: Change Tes...
16
  #include "compat.h"
902b22f34   David Woodhouse   Btrfs: Remove bro...
17
18
  #include "ctree.h"
  #include "btrfs_inode.h"
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
19
  #include "volumes.h"
21adbd5cb   Stefan Behrens   Btrfs: integrate ...
20
  #include "check-integrity.h"
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
21
  #include "locking.h"
606686eea   Josef Bacik   Btrfs: use rcu to...
22
  #include "rcu-string.h"
d1310b2e0   Chris Mason   Btrfs: Split the ...
23

d1310b2e0   Chris Mason   Btrfs: Split the ...
24
25
  static struct kmem_cache *extent_state_cache;
  static struct kmem_cache *extent_buffer_cache;
9be3395bc   Chris Mason   Btrfs: use a btrf...
26
  static struct bio_set *btrfs_bioset;
d1310b2e0   Chris Mason   Btrfs: Split the ...
27

6d49ba1b4   Eric Sandeen   btrfs: move leak ...
28
  #ifdef CONFIG_BTRFS_DEBUG
d1310b2e0   Chris Mason   Btrfs: Split the ...
29
30
  static LIST_HEAD(buffers);
  static LIST_HEAD(states);
4bef08485   Chris Mason   Btrfs: Tree loggi...
31

d397712bc   Chris Mason   Btrfs: Fix checkp...
32
  static DEFINE_SPINLOCK(leak_lock);
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  
  static inline
  void btrfs_leak_debug_add(struct list_head *new, struct list_head *head)
  {
  	unsigned long flags;
  
  	spin_lock_irqsave(&leak_lock, flags);
  	list_add(new, head);
  	spin_unlock_irqrestore(&leak_lock, flags);
  }
  
  static inline
  void btrfs_leak_debug_del(struct list_head *entry)
  {
  	unsigned long flags;
  
  	spin_lock_irqsave(&leak_lock, flags);
  	list_del(entry);
  	spin_unlock_irqrestore(&leak_lock, flags);
  }
  
  static inline
  void btrfs_leak_debug_check(void)
  {
  	struct extent_state *state;
  	struct extent_buffer *eb;
  
  	while (!list_empty(&states)) {
  		state = list_entry(states.next, struct extent_state, leak_list);
  		printk(KERN_ERR "btrfs state leak: start %llu end %llu "
  		       "state %lu in tree %p refs %d
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
65
66
  		       state->start, state->end, state->state, state->tree,
  		       atomic_read(&state->refs));
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
67
68
69
70
71
72
73
  		list_del(&state->leak_list);
  		kmem_cache_free(extent_state_cache, state);
  	}
  
  	while (!list_empty(&buffers)) {
  		eb = list_entry(buffers.next, struct extent_buffer, leak_list);
  		printk(KERN_ERR "btrfs buffer leak start %llu len %lu "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
74
75
76
  		       "refs %d
  ",
  		       eb->start, eb->len, atomic_read(&eb->refs));
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
77
78
79
80
  		list_del(&eb->leak_list);
  		kmem_cache_free(extent_buffer_cache, eb);
  	}
  }
8d599ae1b   David Sterba   btrfs: add debug ...
81
82
83
84
85
86
87
88
89
90
91
92
  
  #define btrfs_debug_check_extent_io_range(inode, start, end)		\
  	__btrfs_debug_check_extent_io_range(__func__, (inode), (start), (end))
  static inline void __btrfs_debug_check_extent_io_range(const char *caller,
  		struct inode *inode, u64 start, u64 end)
  {
  	u64 isize = i_size_read(inode);
  
  	if (end >= PAGE_SIZE && (end % 2) == 0 && end != isize - 1) {
  		printk_ratelimited(KERN_DEBUG
  		    "btrfs: %s: ino %llu isize %llu odd range [%llu,%llu]
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
93
  				caller, btrfs_ino(inode), isize, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
94
95
  	}
  }
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
96
97
98
99
  #else
  #define btrfs_leak_debug_add(new, head)	do {} while (0)
  #define btrfs_leak_debug_del(entry)	do {} while (0)
  #define btrfs_leak_debug_check()	do {} while (0)
8d599ae1b   David Sterba   btrfs: add debug ...
100
  #define btrfs_debug_check_extent_io_range(c, s, e)	do {} while (0)
4bef08485   Chris Mason   Btrfs: Tree loggi...
101
  #endif
d1310b2e0   Chris Mason   Btrfs: Split the ...
102

d1310b2e0   Chris Mason   Btrfs: Split the ...
103
104
105
106
107
  #define BUFFER_LRU_MAX 64
  
  struct tree_entry {
  	u64 start;
  	u64 end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
108
109
110
111
112
113
114
  	struct rb_node rb_node;
  };
  
  struct extent_page_data {
  	struct bio *bio;
  	struct extent_io_tree *tree;
  	get_extent_t *get_extent;
de0022b9d   Josef Bacik   Btrfs: do not asy...
115
  	unsigned long bio_flags;
771ed689d   Chris Mason   Btrfs: Optimize c...
116
117
118
119
  
  	/* tells writepage not to lock the state bits for this range
  	 * it still does the unlocking
  	 */
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
120
121
122
123
  	unsigned int extent_locked:1;
  
  	/* tells the submit_bio code to use a WRITE_SYNC */
  	unsigned int sync_io:1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
124
  };
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
125
  static noinline void flush_write_bio(void *data);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
126
127
128
129
130
  static inline struct btrfs_fs_info *
  tree_fs_info(struct extent_io_tree *tree)
  {
  	return btrfs_sb(tree->mapping->host->i_sb);
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
131

d1310b2e0   Chris Mason   Btrfs: Split the ...
132
133
  int __init extent_io_init(void)
  {
837e19728   David Sterba   btrfs: polish nam...
134
  	extent_state_cache = kmem_cache_create("btrfs_extent_state",
9601e3f63   Christoph Hellwig   Btrfs: kill btrfs...
135
136
  			sizeof(struct extent_state), 0,
  			SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL);
d1310b2e0   Chris Mason   Btrfs: Split the ...
137
138
  	if (!extent_state_cache)
  		return -ENOMEM;
837e19728   David Sterba   btrfs: polish nam...
139
  	extent_buffer_cache = kmem_cache_create("btrfs_extent_buffer",
9601e3f63   Christoph Hellwig   Btrfs: kill btrfs...
140
141
  			sizeof(struct extent_buffer), 0,
  			SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL);
d1310b2e0   Chris Mason   Btrfs: Split the ...
142
143
  	if (!extent_buffer_cache)
  		goto free_state_cache;
9be3395bc   Chris Mason   Btrfs: use a btrf...
144
145
146
147
148
  
  	btrfs_bioset = bioset_create(BIO_POOL_SIZE,
  				     offsetof(struct btrfs_io_bio, bio));
  	if (!btrfs_bioset)
  		goto free_buffer_cache;
b208c2f7c   Darrick J. Wong   btrfs: Fix crash ...
149
150
151
  
  	if (bioset_integrity_create(btrfs_bioset, BIO_POOL_SIZE))
  		goto free_bioset;
d1310b2e0   Chris Mason   Btrfs: Split the ...
152
  	return 0;
b208c2f7c   Darrick J. Wong   btrfs: Fix crash ...
153
154
155
  free_bioset:
  	bioset_free(btrfs_bioset);
  	btrfs_bioset = NULL;
9be3395bc   Chris Mason   Btrfs: use a btrf...
156
157
158
  free_buffer_cache:
  	kmem_cache_destroy(extent_buffer_cache);
  	extent_buffer_cache = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
159
160
  free_state_cache:
  	kmem_cache_destroy(extent_state_cache);
9be3395bc   Chris Mason   Btrfs: use a btrf...
161
  	extent_state_cache = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
162
163
164
165
166
  	return -ENOMEM;
  }
  
  void extent_io_exit(void)
  {
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
167
  	btrfs_leak_debug_check();
8c0a85377   Kirill A. Shutemov   fs: push rcu_barr...
168
169
170
171
172
173
  
  	/*
  	 * Make sure all delayed rcu free are flushed before we
  	 * destroy caches.
  	 */
  	rcu_barrier();
d1310b2e0   Chris Mason   Btrfs: Split the ...
174
175
176
177
  	if (extent_state_cache)
  		kmem_cache_destroy(extent_state_cache);
  	if (extent_buffer_cache)
  		kmem_cache_destroy(extent_buffer_cache);
9be3395bc   Chris Mason   Btrfs: use a btrf...
178
179
  	if (btrfs_bioset)
  		bioset_free(btrfs_bioset);
d1310b2e0   Chris Mason   Btrfs: Split the ...
180
181
182
  }
  
  void extent_io_tree_init(struct extent_io_tree *tree,
f993c883a   David Sterba   btrfs: drop unuse...
183
  			 struct address_space *mapping)
d1310b2e0   Chris Mason   Btrfs: Split the ...
184
  {
6bef4d317   Eric Paris   Btrfs: use RB_ROO...
185
  	tree->state = RB_ROOT;
19fe0a8b7   Miao Xie   Btrfs: Switch the...
186
  	INIT_RADIX_TREE(&tree->buffer, GFP_ATOMIC);
d1310b2e0   Chris Mason   Btrfs: Split the ...
187
188
  	tree->ops = NULL;
  	tree->dirty_bytes = 0;
70dec8079   Chris Mason   Btrfs: extent_io ...
189
  	spin_lock_init(&tree->lock);
6af118ce5   Chris Mason   Btrfs: Index exte...
190
  	spin_lock_init(&tree->buffer_lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
191
  	tree->mapping = mapping;
d1310b2e0   Chris Mason   Btrfs: Split the ...
192
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
193

b2950863c   Christoph Hellwig   Btrfs: make thing...
194
  static struct extent_state *alloc_extent_state(gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
195
196
  {
  	struct extent_state *state;
d1310b2e0   Chris Mason   Btrfs: Split the ...
197
198
  
  	state = kmem_cache_alloc(extent_state_cache, mask);
2b114d1d3   Peter   Btrfs: Correct us...
199
  	if (!state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
200
201
  		return state;
  	state->state = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
202
  	state->private = 0;
70dec8079   Chris Mason   Btrfs: extent_io ...
203
  	state->tree = NULL;
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
204
  	btrfs_leak_debug_add(&state->leak_list, &states);
d1310b2e0   Chris Mason   Btrfs: Split the ...
205
206
  	atomic_set(&state->refs, 1);
  	init_waitqueue_head(&state->wq);
143bede52   Jeff Mahoney   btrfs: return voi...
207
  	trace_alloc_extent_state(state, mask, _RET_IP_);
d1310b2e0   Chris Mason   Btrfs: Split the ...
208
209
  	return state;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
210

4845e44ff   Chris Mason   Btrfs: rework O_D...
211
  void free_extent_state(struct extent_state *state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
212
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
213
214
215
  	if (!state)
  		return;
  	if (atomic_dec_and_test(&state->refs)) {
70dec8079   Chris Mason   Btrfs: extent_io ...
216
  		WARN_ON(state->tree);
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
217
  		btrfs_leak_debug_del(&state->leak_list);
143bede52   Jeff Mahoney   btrfs: return voi...
218
  		trace_free_extent_state(state, _RET_IP_);
d1310b2e0   Chris Mason   Btrfs: Split the ...
219
220
221
  		kmem_cache_free(extent_state_cache, state);
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
222
223
224
225
  
  static struct rb_node *tree_insert(struct rb_root *root, u64 offset,
  				   struct rb_node *node)
  {
d397712bc   Chris Mason   Btrfs: Fix checkp...
226
227
  	struct rb_node **p = &root->rb_node;
  	struct rb_node *parent = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
228
  	struct tree_entry *entry;
d397712bc   Chris Mason   Btrfs: Fix checkp...
229
  	while (*p) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
230
231
232
233
234
235
236
237
238
239
  		parent = *p;
  		entry = rb_entry(parent, struct tree_entry, rb_node);
  
  		if (offset < entry->start)
  			p = &(*p)->rb_left;
  		else if (offset > entry->end)
  			p = &(*p)->rb_right;
  		else
  			return parent;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
240
241
242
243
  	rb_link_node(node, parent, p);
  	rb_insert_color(node, root);
  	return NULL;
  }
80ea96b1f   Chris Mason   Btrfs: Add a look...
244
  static struct rb_node *__etree_search(struct extent_io_tree *tree, u64 offset,
d1310b2e0   Chris Mason   Btrfs: Split the ...
245
246
247
  				     struct rb_node **prev_ret,
  				     struct rb_node **next_ret)
  {
80ea96b1f   Chris Mason   Btrfs: Add a look...
248
  	struct rb_root *root = &tree->state;
d397712bc   Chris Mason   Btrfs: Fix checkp...
249
  	struct rb_node *n = root->rb_node;
d1310b2e0   Chris Mason   Btrfs: Split the ...
250
251
252
253
  	struct rb_node *prev = NULL;
  	struct rb_node *orig_prev = NULL;
  	struct tree_entry *entry;
  	struct tree_entry *prev_entry = NULL;
d397712bc   Chris Mason   Btrfs: Fix checkp...
254
  	while (n) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
255
256
257
258
259
260
261
262
  		entry = rb_entry(n, struct tree_entry, rb_node);
  		prev = n;
  		prev_entry = entry;
  
  		if (offset < entry->start)
  			n = n->rb_left;
  		else if (offset > entry->end)
  			n = n->rb_right;
d397712bc   Chris Mason   Btrfs: Fix checkp...
263
  		else
d1310b2e0   Chris Mason   Btrfs: Split the ...
264
265
266
267
268
  			return n;
  	}
  
  	if (prev_ret) {
  		orig_prev = prev;
d397712bc   Chris Mason   Btrfs: Fix checkp...
269
  		while (prev && offset > prev_entry->end) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
270
271
272
273
274
275
276
277
278
  			prev = rb_next(prev);
  			prev_entry = rb_entry(prev, struct tree_entry, rb_node);
  		}
  		*prev_ret = prev;
  		prev = orig_prev;
  	}
  
  	if (next_ret) {
  		prev_entry = rb_entry(prev, struct tree_entry, rb_node);
d397712bc   Chris Mason   Btrfs: Fix checkp...
279
  		while (prev && offset < prev_entry->start) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
280
281
282
283
284
285
286
  			prev = rb_prev(prev);
  			prev_entry = rb_entry(prev, struct tree_entry, rb_node);
  		}
  		*next_ret = prev;
  	}
  	return NULL;
  }
80ea96b1f   Chris Mason   Btrfs: Add a look...
287
288
  static inline struct rb_node *tree_search(struct extent_io_tree *tree,
  					  u64 offset)
d1310b2e0   Chris Mason   Btrfs: Split the ...
289
  {
70dec8079   Chris Mason   Btrfs: extent_io ...
290
  	struct rb_node *prev = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
291
  	struct rb_node *ret;
70dec8079   Chris Mason   Btrfs: extent_io ...
292

80ea96b1f   Chris Mason   Btrfs: Add a look...
293
  	ret = __etree_search(tree, offset, &prev, NULL);
d397712bc   Chris Mason   Btrfs: Fix checkp...
294
  	if (!ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
295
296
297
  		return prev;
  	return ret;
  }
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
298
299
300
301
302
303
304
  static void merge_cb(struct extent_io_tree *tree, struct extent_state *new,
  		     struct extent_state *other)
  {
  	if (tree->ops && tree->ops->merge_extent_hook)
  		tree->ops->merge_extent_hook(tree->mapping->host, new,
  					     other);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
305
306
307
308
309
310
311
312
313
  /*
   * utility function to look for merge candidates inside a given range.
   * Any extents with matching state are merged together into a single
   * extent in the tree.  Extents with EXTENT_IO in their state field
   * are not merged because the end_io handlers need to be able to do
   * operations on them without sleeping (or doing allocations/splits).
   *
   * This should be called with the tree lock held.
   */
1bf85046e   Jeff Mahoney   btrfs: Make exten...
314
315
  static void merge_state(struct extent_io_tree *tree,
  		        struct extent_state *state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
316
317
318
  {
  	struct extent_state *other;
  	struct rb_node *other_node;
5b21f2ed3   Zheng Yan   Btrfs: extent_map...
319
  	if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY))
1bf85046e   Jeff Mahoney   btrfs: Make exten...
320
  		return;
d1310b2e0   Chris Mason   Btrfs: Split the ...
321
322
323
324
325
326
  
  	other_node = rb_prev(&state->rb_node);
  	if (other_node) {
  		other = rb_entry(other_node, struct extent_state, rb_node);
  		if (other->end == state->start - 1 &&
  		    other->state == state->state) {
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
327
  			merge_cb(tree, state, other);
d1310b2e0   Chris Mason   Btrfs: Split the ...
328
  			state->start = other->start;
70dec8079   Chris Mason   Btrfs: extent_io ...
329
  			other->tree = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
330
331
332
333
334
335
336
337
338
  			rb_erase(&other->rb_node, &tree->state);
  			free_extent_state(other);
  		}
  	}
  	other_node = rb_next(&state->rb_node);
  	if (other_node) {
  		other = rb_entry(other_node, struct extent_state, rb_node);
  		if (other->start == state->end + 1 &&
  		    other->state == state->state) {
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
339
  			merge_cb(tree, state, other);
df98b6e2c   Josef Bacik   Btrfs: fix how we...
340
341
342
343
  			state->end = other->end;
  			other->tree = NULL;
  			rb_erase(&other->rb_node, &tree->state);
  			free_extent_state(other);
d1310b2e0   Chris Mason   Btrfs: Split the ...
344
345
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
346
  }
1bf85046e   Jeff Mahoney   btrfs: Make exten...
347
  static void set_state_cb(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
348
  			 struct extent_state *state, unsigned long *bits)
291d673e6   Chris Mason   Btrfs: Do delallo...
349
  {
1bf85046e   Jeff Mahoney   btrfs: Make exten...
350
351
  	if (tree->ops && tree->ops->set_bit_hook)
  		tree->ops->set_bit_hook(tree->mapping->host, state, bits);
291d673e6   Chris Mason   Btrfs: Do delallo...
352
353
354
  }
  
  static void clear_state_cb(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
355
  			   struct extent_state *state, unsigned long *bits)
291d673e6   Chris Mason   Btrfs: Do delallo...
356
  {
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
357
358
  	if (tree->ops && tree->ops->clear_bit_hook)
  		tree->ops->clear_bit_hook(tree->mapping->host, state, bits);
291d673e6   Chris Mason   Btrfs: Do delallo...
359
  }
3150b6996   Xiao Guangrong   Btrfs: clean up f...
360
  static void set_state_bits(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
361
  			   struct extent_state *state, unsigned long *bits);
3150b6996   Xiao Guangrong   Btrfs: clean up f...
362

d1310b2e0   Chris Mason   Btrfs: Split the ...
363
364
365
366
367
368
369
370
371
372
373
374
  /*
   * insert an extent_state struct into the tree.  'bits' are set on the
   * struct before it is inserted.
   *
   * This may return -EEXIST if the extent is already there, in which case the
   * state struct is freed.
   *
   * The tree lock is not taken internally.  This is a utility function and
   * probably isn't what you want to call (see set/clear_extent_bit).
   */
  static int insert_state(struct extent_io_tree *tree,
  			struct extent_state *state, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
375
  			unsigned long *bits)
d1310b2e0   Chris Mason   Btrfs: Split the ...
376
377
  {
  	struct rb_node *node;
31b1a2bd7   Julia Lawall   fs/btrfs: use WARN
378
379
380
  	if (end < start)
  		WARN(1, KERN_ERR "btrfs end < start %llu %llu
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
381
  		       end, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
382
383
  	state->start = start;
  	state->end = end;
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
384

3150b6996   Xiao Guangrong   Btrfs: clean up f...
385
  	set_state_bits(tree, state, bits);
d1310b2e0   Chris Mason   Btrfs: Split the ...
386
387
388
389
  	node = tree_insert(&tree->state, end, &state->rb_node);
  	if (node) {
  		struct extent_state *found;
  		found = rb_entry(node, struct extent_state, rb_node);
d397712bc   Chris Mason   Btrfs: Fix checkp...
390
  		printk(KERN_ERR "btrfs found node %llu %llu on insert of "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
391
392
393
  		       "%llu %llu
  ",
  		       found->start, found->end, start, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
394
395
  		return -EEXIST;
  	}
70dec8079   Chris Mason   Btrfs: extent_io ...
396
  	state->tree = tree;
d1310b2e0   Chris Mason   Btrfs: Split the ...
397
398
399
  	merge_state(tree, state);
  	return 0;
  }
1bf85046e   Jeff Mahoney   btrfs: Make exten...
400
  static void split_cb(struct extent_io_tree *tree, struct extent_state *orig,
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
401
402
403
  		     u64 split)
  {
  	if (tree->ops && tree->ops->split_extent_hook)
1bf85046e   Jeff Mahoney   btrfs: Make exten...
404
  		tree->ops->split_extent_hook(tree->mapping->host, orig, split);
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
405
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
  /*
   * split a given extent state struct in two, inserting the preallocated
   * struct 'prealloc' as the newly created second half.  'split' indicates an
   * offset inside 'orig' where it should be split.
   *
   * Before calling,
   * the tree has 'orig' at [orig->start, orig->end].  After calling, there
   * are two extent state structs in the tree:
   * prealloc: [orig->start, split - 1]
   * orig: [ split, orig->end ]
   *
   * The tree locks are not taken by this function. They need to be held
   * by the caller.
   */
  static int split_state(struct extent_io_tree *tree, struct extent_state *orig,
  		       struct extent_state *prealloc, u64 split)
  {
  	struct rb_node *node;
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
424
425
  
  	split_cb(tree, orig, split);
d1310b2e0   Chris Mason   Btrfs: Split the ...
426
427
428
429
430
431
432
  	prealloc->start = orig->start;
  	prealloc->end = split - 1;
  	prealloc->state = orig->state;
  	orig->start = split;
  
  	node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node);
  	if (node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
433
434
435
  		free_extent_state(prealloc);
  		return -EEXIST;
  	}
70dec8079   Chris Mason   Btrfs: extent_io ...
436
  	prealloc->tree = tree;
d1310b2e0   Chris Mason   Btrfs: Split the ...
437
438
  	return 0;
  }
cdc6a3952   Li Zefan   Btrfs: avoid poss...
439
440
441
442
443
444
445
446
  static struct extent_state *next_state(struct extent_state *state)
  {
  	struct rb_node *next = rb_next(&state->rb_node);
  	if (next)
  		return rb_entry(next, struct extent_state, rb_node);
  	else
  		return NULL;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
447
448
  /*
   * utility function to clear some bits in an extent state struct.
1b303fc05   Wang Sheng-Hui   Btrfs: cleanup th...
449
   * it will optionally wake up any one waiting on this state (wake == 1).
d1310b2e0   Chris Mason   Btrfs: Split the ...
450
451
452
453
   *
   * If no bits are set on the state struct after clearing things, the
   * struct is freed and removed from the tree
   */
cdc6a3952   Li Zefan   Btrfs: avoid poss...
454
455
  static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
  					    struct extent_state *state,
410748882   David Sterba   btrfs: use unsign...
456
  					    unsigned long *bits, int wake)
d1310b2e0   Chris Mason   Btrfs: Split the ...
457
  {
cdc6a3952   Li Zefan   Btrfs: avoid poss...
458
  	struct extent_state *next;
410748882   David Sterba   btrfs: use unsign...
459
  	unsigned long bits_to_clear = *bits & ~EXTENT_CTLBITS;
d1310b2e0   Chris Mason   Btrfs: Split the ...
460

0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
461
  	if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
462
463
464
465
  		u64 range = state->end - state->start + 1;
  		WARN_ON(range > tree->dirty_bytes);
  		tree->dirty_bytes -= range;
  	}
291d673e6   Chris Mason   Btrfs: Do delallo...
466
  	clear_state_cb(tree, state, bits);
32c00aff7   Josef Bacik   Btrfs: release de...
467
  	state->state &= ~bits_to_clear;
d1310b2e0   Chris Mason   Btrfs: Split the ...
468
469
  	if (wake)
  		wake_up(&state->wq);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
470
  	if (state->state == 0) {
cdc6a3952   Li Zefan   Btrfs: avoid poss...
471
  		next = next_state(state);
70dec8079   Chris Mason   Btrfs: extent_io ...
472
  		if (state->tree) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
473
  			rb_erase(&state->rb_node, &tree->state);
70dec8079   Chris Mason   Btrfs: extent_io ...
474
  			state->tree = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
475
476
477
478
479
480
  			free_extent_state(state);
  		} else {
  			WARN_ON(1);
  		}
  	} else {
  		merge_state(tree, state);
cdc6a3952   Li Zefan   Btrfs: avoid poss...
481
  		next = next_state(state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
482
  	}
cdc6a3952   Li Zefan   Btrfs: avoid poss...
483
  	return next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
484
  }
8233767a2   Xiao Guangrong   Btrfs: allocate e...
485
486
487
488
489
490
491
492
  static struct extent_state *
  alloc_extent_state_atomic(struct extent_state *prealloc)
  {
  	if (!prealloc)
  		prealloc = alloc_extent_state(GFP_ATOMIC);
  
  	return prealloc;
  }
48a3b6366   Eric Sandeen   btrfs: make stati...
493
  static void extent_io_tree_panic(struct extent_io_tree *tree, int err)
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
494
495
496
497
498
  {
  	btrfs_panic(tree_fs_info(tree), err, "Locking error: "
  		    "Extent tree was modified by another "
  		    "thread while locked.");
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
499
500
501
502
503
504
505
506
507
508
  /*
   * clear some bits on a range in the tree.  This may require splitting
   * or inserting elements in the tree, so the gfp mask is used to
   * indicate which allocations or sleeping are allowed.
   *
   * pass 'wake' == 1 to kick any sleepers, and 'delete' == 1 to remove
   * the given range from the tree regardless of state (ie for truncate).
   *
   * the range [start, end] is inclusive.
   *
6763af84a   Jeff Mahoney   btrfs: Remove set...
509
   * This takes the tree lock, and returns 0 on success and < 0 on error.
d1310b2e0   Chris Mason   Btrfs: Split the ...
510
511
   */
  int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
512
  		     unsigned long bits, int wake, int delete,
2c64c53d8   Chris Mason   Btrfs: cache valu...
513
514
  		     struct extent_state **cached_state,
  		     gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
515
516
  {
  	struct extent_state *state;
2c64c53d8   Chris Mason   Btrfs: cache valu...
517
  	struct extent_state *cached;
d1310b2e0   Chris Mason   Btrfs: Split the ...
518
519
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
5c939df56   Yan Zheng   btrfs: Fix set/cl...
520
  	u64 last_end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
521
  	int err;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
522
  	int clear = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
523

8d599ae1b   David Sterba   btrfs: add debug ...
524
  	btrfs_debug_check_extent_io_range(tree->mapping->host, start, end);
7ee9e4405   Josef Bacik   Btrfs: check if w...
525
526
  	if (bits & EXTENT_DELALLOC)
  		bits |= EXTENT_NORESERVE;
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
527
528
529
  	if (delete)
  		bits |= ~EXTENT_CTLBITS;
  	bits |= EXTENT_FIRST_DELALLOC;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
530
531
  	if (bits & (EXTENT_IOBITS | EXTENT_BOUNDARY))
  		clear = 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
532
533
534
535
536
537
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
  		prealloc = alloc_extent_state(mask);
  		if (!prealloc)
  			return -ENOMEM;
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
538
  	spin_lock(&tree->lock);
2c64c53d8   Chris Mason   Btrfs: cache valu...
539
540
  	if (cached_state) {
  		cached = *cached_state;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
541
542
543
544
545
  
  		if (clear) {
  			*cached_state = NULL;
  			cached_state = NULL;
  		}
df98b6e2c   Josef Bacik   Btrfs: fix how we...
546
547
  		if (cached && cached->tree && cached->start <= start &&
  		    cached->end > start) {
2ac55d41b   Josef Bacik   Btrfs: cache the ...
548
549
  			if (clear)
  				atomic_dec(&cached->refs);
2c64c53d8   Chris Mason   Btrfs: cache valu...
550
  			state = cached;
42daec299   Chris Mason   Btrfs: fix errors...
551
  			goto hit_next;
2c64c53d8   Chris Mason   Btrfs: cache valu...
552
  		}
2ac55d41b   Josef Bacik   Btrfs: cache the ...
553
554
  		if (clear)
  			free_extent_state(cached);
2c64c53d8   Chris Mason   Btrfs: cache valu...
555
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
556
557
558
559
  	/*
  	 * this search will find the extents that end after
  	 * our range starts
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
560
  	node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
561
562
563
  	if (!node)
  		goto out;
  	state = rb_entry(node, struct extent_state, rb_node);
2c64c53d8   Chris Mason   Btrfs: cache valu...
564
  hit_next:
d1310b2e0   Chris Mason   Btrfs: Split the ...
565
566
567
  	if (state->start > end)
  		goto out;
  	WARN_ON(state->end < start);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
568
  	last_end = state->end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
569

0449314a9   Liu Bo   Btrfs: skip state...
570
  	/* the state doesn't have the wanted bits, go ahead */
cdc6a3952   Li Zefan   Btrfs: avoid poss...
571
572
  	if (!(state->state & bits)) {
  		state = next_state(state);
0449314a9   Liu Bo   Btrfs: skip state...
573
  		goto next;
cdc6a3952   Li Zefan   Btrfs: avoid poss...
574
  	}
0449314a9   Liu Bo   Btrfs: skip state...
575

d1310b2e0   Chris Mason   Btrfs: Split the ...
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
  	/*
  	 *     | ---- desired range ---- |
  	 *  | state | or
  	 *  | ------------- state -------------- |
  	 *
  	 * We need to split the extent we found, and may flip
  	 * bits on second half.
  	 *
  	 * If the extent we found extends past our range, we
  	 * just split and search again.  It'll get split again
  	 * the next time though.
  	 *
  	 * If the extent we found is inside our range, we clear
  	 * the desired bit on it.
  	 */
  
  	if (state->start < start) {
8233767a2   Xiao Guangrong   Btrfs: allocate e...
593
594
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
595
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
596
597
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
598
599
600
601
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
602
603
  			state = clear_state_bit(tree, state, &bits, wake);
  			goto next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
604
605
606
607
608
609
610
611
612
613
  		}
  		goto search_again;
  	}
  	/*
  	 * | ---- desired range ---- |
  	 *                        | state |
  	 * We need to split the extent, and clear the bit
  	 * on the first half
  	 */
  	if (state->start <= end && state->end > end) {
8233767a2   Xiao Guangrong   Btrfs: allocate e...
614
615
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
616
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
617
618
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
619
620
  		if (wake)
  			wake_up(&state->wq);
42daec299   Chris Mason   Btrfs: fix errors...
621

6763af84a   Jeff Mahoney   btrfs: Remove set...
622
  		clear_state_bit(tree, prealloc, &bits, wake);
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
623

d1310b2e0   Chris Mason   Btrfs: Split the ...
624
625
626
  		prealloc = NULL;
  		goto out;
  	}
42daec299   Chris Mason   Btrfs: fix errors...
627

cdc6a3952   Li Zefan   Btrfs: avoid poss...
628
  	state = clear_state_bit(tree, state, &bits, wake);
0449314a9   Liu Bo   Btrfs: skip state...
629
  next:
5c939df56   Yan Zheng   btrfs: Fix set/cl...
630
631
632
  	if (last_end == (u64)-1)
  		goto out;
  	start = last_end + 1;
cdc6a3952   Li Zefan   Btrfs: avoid poss...
633
  	if (start <= end && state && !need_resched())
692e5759a   Liu Bo   Btrfs: be less st...
634
  		goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
635
636
637
  	goto search_again;
  
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
638
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
639
640
  	if (prealloc)
  		free_extent_state(prealloc);
6763af84a   Jeff Mahoney   btrfs: Remove set...
641
  	return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
642
643
644
645
  
  search_again:
  	if (start > end)
  		goto out;
cad321ad5   Chris Mason   Btrfs: shift all ...
646
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
647
648
649
650
  	if (mask & __GFP_WAIT)
  		cond_resched();
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
651

143bede52   Jeff Mahoney   btrfs: return voi...
652
653
  static void wait_on_state(struct extent_io_tree *tree,
  			  struct extent_state *state)
641f5219f   Christoph Hellwig   Btrfs: sparse loc...
654
655
  		__releases(tree->lock)
  		__acquires(tree->lock)
d1310b2e0   Chris Mason   Btrfs: Split the ...
656
657
658
  {
  	DEFINE_WAIT(wait);
  	prepare_to_wait(&state->wq, &wait, TASK_UNINTERRUPTIBLE);
cad321ad5   Chris Mason   Btrfs: shift all ...
659
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
660
  	schedule();
cad321ad5   Chris Mason   Btrfs: shift all ...
661
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
662
  	finish_wait(&state->wq, &wait);
d1310b2e0   Chris Mason   Btrfs: Split the ...
663
664
665
666
667
668
669
  }
  
  /*
   * waits for one or more bits to clear on a range in the state tree.
   * The range [start, end] is inclusive.
   * The tree lock is taken by this function
   */
410748882   David Sterba   btrfs: use unsign...
670
671
  static void wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
  			    unsigned long bits)
d1310b2e0   Chris Mason   Btrfs: Split the ...
672
673
674
  {
  	struct extent_state *state;
  	struct rb_node *node;
8d599ae1b   David Sterba   btrfs: add debug ...
675
  	btrfs_debug_check_extent_io_range(tree->mapping->host, start, end);
cad321ad5   Chris Mason   Btrfs: shift all ...
676
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
677
678
679
680
681
682
  again:
  	while (1) {
  		/*
  		 * this search will find all the extents that end after
  		 * our range starts
  		 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
683
  		node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
  		if (!node)
  			break;
  
  		state = rb_entry(node, struct extent_state, rb_node);
  
  		if (state->start > end)
  			goto out;
  
  		if (state->state & bits) {
  			start = state->start;
  			atomic_inc(&state->refs);
  			wait_on_state(tree, state);
  			free_extent_state(state);
  			goto again;
  		}
  		start = state->end + 1;
  
  		if (start > end)
  			break;
ded91f081   Xiao Guangrong   Btrfs: clean up f...
703
  		cond_resched_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
704
705
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
706
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
707
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
708

1bf85046e   Jeff Mahoney   btrfs: Make exten...
709
  static void set_state_bits(struct extent_io_tree *tree,
d1310b2e0   Chris Mason   Btrfs: Split the ...
710
  			   struct extent_state *state,
410748882   David Sterba   btrfs: use unsign...
711
  			   unsigned long *bits)
d1310b2e0   Chris Mason   Btrfs: Split the ...
712
  {
410748882   David Sterba   btrfs: use unsign...
713
  	unsigned long bits_to_set = *bits & ~EXTENT_CTLBITS;
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
714

1bf85046e   Jeff Mahoney   btrfs: Make exten...
715
  	set_state_cb(tree, state, bits);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
716
  	if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
717
718
719
  		u64 range = state->end - state->start + 1;
  		tree->dirty_bytes += range;
  	}
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
720
  	state->state |= bits_to_set;
d1310b2e0   Chris Mason   Btrfs: Split the ...
721
  }
2c64c53d8   Chris Mason   Btrfs: cache valu...
722
723
724
725
726
727
728
729
730
731
  static void cache_state(struct extent_state *state,
  			struct extent_state **cached_ptr)
  {
  	if (cached_ptr && !(*cached_ptr)) {
  		if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY)) {
  			*cached_ptr = state;
  			atomic_inc(&state->refs);
  		}
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
732
  /*
1edbb734b   Chris Mason   Btrfs: reduce CPU...
733
734
   * set some bits on a range in the tree.  This may require allocations or
   * sleeping, so the gfp mask is used to indicate what is allowed.
d1310b2e0   Chris Mason   Btrfs: Split the ...
735
   *
1edbb734b   Chris Mason   Btrfs: reduce CPU...
736
737
738
   * If any of the exclusive bits are set, this will fail with -EEXIST if some
   * part of the range already has the desired bits set.  The start of the
   * existing range is returned in failed_start in this case.
d1310b2e0   Chris Mason   Btrfs: Split the ...
739
   *
1edbb734b   Chris Mason   Btrfs: reduce CPU...
740
   * [start, end] is inclusive This takes the tree lock.
d1310b2e0   Chris Mason   Btrfs: Split the ...
741
   */
1edbb734b   Chris Mason   Btrfs: reduce CPU...
742

3fbe5c02a   Jeff Mahoney   btrfs: split exte...
743
744
  static int __must_check
  __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
745
746
747
  		 unsigned long bits, unsigned long exclusive_bits,
  		 u64 *failed_start, struct extent_state **cached_state,
  		 gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
748
749
750
751
  {
  	struct extent_state *state;
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
d1310b2e0   Chris Mason   Btrfs: Split the ...
752
  	int err = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
753
754
  	u64 last_start;
  	u64 last_end;
42daec299   Chris Mason   Btrfs: fix errors...
755

8d599ae1b   David Sterba   btrfs: add debug ...
756
  	btrfs_debug_check_extent_io_range(tree->mapping->host, start, end);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
757
  	bits |= EXTENT_FIRST_DELALLOC;
d1310b2e0   Chris Mason   Btrfs: Split the ...
758
759
760
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
  		prealloc = alloc_extent_state(mask);
8233767a2   Xiao Guangrong   Btrfs: allocate e...
761
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
762
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
763
  	spin_lock(&tree->lock);
9655d2982   Chris Mason   Btrfs: use a cach...
764
765
  	if (cached_state && *cached_state) {
  		state = *cached_state;
df98b6e2c   Josef Bacik   Btrfs: fix how we...
766
767
  		if (state->start <= start && state->end > start &&
  		    state->tree) {
9655d2982   Chris Mason   Btrfs: use a cach...
768
769
770
771
  			node = &state->rb_node;
  			goto hit_next;
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
772
773
774
775
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
776
  	node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
777
  	if (!node) {
8233767a2   Xiao Guangrong   Btrfs: allocate e...
778
779
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
780
  		err = insert_state(tree, prealloc, start, end, &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
781
782
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
783
  		prealloc = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
784
785
  		goto out;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
786
  	state = rb_entry(node, struct extent_state, rb_node);
40431d6c1   Chris Mason   Btrfs: optimize s...
787
  hit_next:
d1310b2e0   Chris Mason   Btrfs: Split the ...
788
789
790
791
792
793
794
795
796
797
  	last_start = state->start;
  	last_end = state->end;
  
  	/*
  	 * | ---- desired range ---- |
  	 * | state |
  	 *
  	 * Just lock what we found and keep going
  	 */
  	if (state->start == start && state->end <= end) {
1edbb734b   Chris Mason   Btrfs: reduce CPU...
798
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
799
800
801
802
  			*failed_start = state->start;
  			err = -EEXIST;
  			goto out;
  		}
42daec299   Chris Mason   Btrfs: fix errors...
803

1bf85046e   Jeff Mahoney   btrfs: Make exten...
804
  		set_state_bits(tree, state, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
805
  		cache_state(state, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
806
  		merge_state(tree, state);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
807
808
809
  		if (last_end == (u64)-1)
  			goto out;
  		start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
810
811
812
813
  		state = next_state(state);
  		if (start < end && state && state->start == start &&
  		    !need_resched())
  			goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
  		goto search_again;
  	}
  
  	/*
  	 *     | ---- desired range ---- |
  	 * | state |
  	 *   or
  	 * | ------------- state -------------- |
  	 *
  	 * We need to split the extent we found, and may flip bits on
  	 * second half.
  	 *
  	 * If the extent we found extends past our
  	 * range, we just split and search again.  It'll get split
  	 * again the next time though.
  	 *
  	 * If the extent we found is inside our range, we set the
  	 * desired bit on it.
  	 */
  	if (state->start < start) {
1edbb734b   Chris Mason   Btrfs: reduce CPU...
834
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
835
836
837
838
  			*failed_start = start;
  			err = -EEXIST;
  			goto out;
  		}
8233767a2   Xiao Guangrong   Btrfs: allocate e...
839
840
841
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
842
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
843
844
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
845
846
847
848
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
1bf85046e   Jeff Mahoney   btrfs: Make exten...
849
  			set_state_bits(tree, state, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
850
  			cache_state(state, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
851
  			merge_state(tree, state);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
852
853
854
  			if (last_end == (u64)-1)
  				goto out;
  			start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
855
856
857
858
  			state = next_state(state);
  			if (start < end && state && state->start == start &&
  			    !need_resched())
  				goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
  		}
  		goto search_again;
  	}
  	/*
  	 * | ---- desired range ---- |
  	 *     | state | or               | state |
  	 *
  	 * There's a hole, we need to insert something in it and
  	 * ignore the extent we found.
  	 */
  	if (state->start > start) {
  		u64 this_end;
  		if (end < last_start)
  			this_end = end;
  		else
d397712bc   Chris Mason   Btrfs: Fix checkp...
874
  			this_end = last_start - 1;
8233767a2   Xiao Guangrong   Btrfs: allocate e...
875
876
877
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
c7f895a2b   Xiao Guangrong   Btrfs: fix unsafe...
878
879
880
881
882
  
  		/*
  		 * Avoid to free 'prealloc' if it can be merged with
  		 * the later extent.
  		 */
d1310b2e0   Chris Mason   Btrfs: Split the ...
883
  		err = insert_state(tree, prealloc, start, this_end,
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
884
  				   &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
885
886
  		if (err)
  			extent_io_tree_panic(tree, err);
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
887
888
  		cache_state(prealloc, cached_state);
  		prealloc = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
889
890
891
892
893
894
895
896
897
898
  		start = this_end + 1;
  		goto search_again;
  	}
  	/*
  	 * | ---- desired range ---- |
  	 *                        | state |
  	 * We need to split the extent, and set the bit
  	 * on the first half
  	 */
  	if (state->start <= end && state->end > end) {
1edbb734b   Chris Mason   Btrfs: reduce CPU...
899
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
900
901
902
903
  			*failed_start = start;
  			err = -EEXIST;
  			goto out;
  		}
8233767a2   Xiao Guangrong   Btrfs: allocate e...
904
905
906
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
907
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
908
909
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
910

1bf85046e   Jeff Mahoney   btrfs: Make exten...
911
  		set_state_bits(tree, prealloc, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
912
  		cache_state(prealloc, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
913
914
915
916
917
918
919
920
  		merge_state(tree, prealloc);
  		prealloc = NULL;
  		goto out;
  	}
  
  	goto search_again;
  
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
921
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
922
923
924
925
926
927
928
929
  	if (prealloc)
  		free_extent_state(prealloc);
  
  	return err;
  
  search_again:
  	if (start > end)
  		goto out;
cad321ad5   Chris Mason   Btrfs: shift all ...
930
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
931
932
933
934
  	if (mask & __GFP_WAIT)
  		cond_resched();
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
935

410748882   David Sterba   btrfs: use unsign...
936
937
938
  int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
  		   unsigned long bits, u64 * failed_start,
  		   struct extent_state **cached_state, gfp_t mask)
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
939
940
941
942
  {
  	return __set_extent_bit(tree, start, end, bits, 0, failed_start,
  				cached_state, mask);
  }
462d6fac8   Josef Bacik   Btrfs: introduce ...
943
  /**
10983f2e8   Liu Bo   Btrfs: fix typo i...
944
945
   * convert_extent_bit - convert all bits in a given range from one bit to
   * 			another
462d6fac8   Josef Bacik   Btrfs: introduce ...
946
947
948
949
950
   * @tree:	the io tree to search
   * @start:	the start offset in bytes
   * @end:	the end offset in bytes (inclusive)
   * @bits:	the bits to set in this range
   * @clear_bits:	the bits to clear in this range
e6138876a   Josef Bacik   Btrfs: cache exte...
951
   * @cached_state:	state that we're going to cache
462d6fac8   Josef Bacik   Btrfs: introduce ...
952
953
954
955
956
957
958
959
960
   * @mask:	the allocation mask
   *
   * This will go through and set bits for the given range.  If any states exist
   * already in this range they are set with the given bit and cleared of the
   * clear_bits.  This is only meant to be used by things that are mergeable, ie
   * converting from say DELALLOC to DIRTY.  This is not meant to be used with
   * boundary bits like LOCK.
   */
  int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
961
  		       unsigned long bits, unsigned long clear_bits,
e6138876a   Josef Bacik   Btrfs: cache exte...
962
  		       struct extent_state **cached_state, gfp_t mask)
462d6fac8   Josef Bacik   Btrfs: introduce ...
963
964
965
966
967
968
969
  {
  	struct extent_state *state;
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
  	int err = 0;
  	u64 last_start;
  	u64 last_end;
8d599ae1b   David Sterba   btrfs: add debug ...
970
  	btrfs_debug_check_extent_io_range(tree->mapping->host, start, end);
462d6fac8   Josef Bacik   Btrfs: introduce ...
971
972
973
974
975
976
977
978
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
  		prealloc = alloc_extent_state(mask);
  		if (!prealloc)
  			return -ENOMEM;
  	}
  
  	spin_lock(&tree->lock);
e6138876a   Josef Bacik   Btrfs: cache exte...
979
980
981
982
983
984
985
986
  	if (cached_state && *cached_state) {
  		state = *cached_state;
  		if (state->start <= start && state->end > start &&
  		    state->tree) {
  			node = &state->rb_node;
  			goto hit_next;
  		}
  	}
462d6fac8   Josef Bacik   Btrfs: introduce ...
987
988
989
990
991
992
993
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
  	node = tree_search(tree, start);
  	if (!node) {
  		prealloc = alloc_extent_state_atomic(prealloc);
1cf4ffdb3   Liu Bo   Btrfs: drop spin ...
994
995
996
997
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
998
999
  		err = insert_state(tree, prealloc, start, end, &bits);
  		prealloc = NULL;
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1000
1001
  		if (err)
  			extent_io_tree_panic(tree, err);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
  		goto out;
  	}
  	state = rb_entry(node, struct extent_state, rb_node);
  hit_next:
  	last_start = state->start;
  	last_end = state->end;
  
  	/*
  	 * | ---- desired range ---- |
  	 * | state |
  	 *
  	 * Just lock what we found and keep going
  	 */
  	if (state->start == start && state->end <= end) {
462d6fac8   Josef Bacik   Btrfs: introduce ...
1016
  		set_state_bits(tree, state, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1017
  		cache_state(state, cached_state);
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1018
  		state = clear_state_bit(tree, state, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1019
1020
  		if (last_end == (u64)-1)
  			goto out;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1021
  		start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1022
1023
1024
  		if (start < end && state && state->start == start &&
  		    !need_resched())
  			goto hit_next;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
  		goto search_again;
  	}
  
  	/*
  	 *     | ---- desired range ---- |
  	 * | state |
  	 *   or
  	 * | ------------- state -------------- |
  	 *
  	 * We need to split the extent we found, and may flip bits on
  	 * second half.
  	 *
  	 * If the extent we found extends past our
  	 * range, we just split and search again.  It'll get split
  	 * again the next time though.
  	 *
  	 * If the extent we found is inside our range, we set the
  	 * desired bit on it.
  	 */
  	if (state->start < start) {
  		prealloc = alloc_extent_state_atomic(prealloc);
1cf4ffdb3   Liu Bo   Btrfs: drop spin ...
1046
1047
1048
1049
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1050
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1051
1052
  		if (err)
  			extent_io_tree_panic(tree, err);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1053
1054
1055
1056
1057
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
  			set_state_bits(tree, state, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1058
  			cache_state(state, cached_state);
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1059
  			state = clear_state_bit(tree, state, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1060
1061
1062
  			if (last_end == (u64)-1)
  				goto out;
  			start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1063
1064
1065
  			if (start < end && state && state->start == start &&
  			    !need_resched())
  				goto hit_next;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  		}
  		goto search_again;
  	}
  	/*
  	 * | ---- desired range ---- |
  	 *     | state | or               | state |
  	 *
  	 * There's a hole, we need to insert something in it and
  	 * ignore the extent we found.
  	 */
  	if (state->start > start) {
  		u64 this_end;
  		if (end < last_start)
  			this_end = end;
  		else
  			this_end = last_start - 1;
  
  		prealloc = alloc_extent_state_atomic(prealloc);
1cf4ffdb3   Liu Bo   Btrfs: drop spin ...
1084
1085
1086
1087
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1088
1089
1090
1091
1092
1093
1094
  
  		/*
  		 * Avoid to free 'prealloc' if it can be merged with
  		 * the later extent.
  		 */
  		err = insert_state(tree, prealloc, start, this_end,
  				   &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1095
1096
  		if (err)
  			extent_io_tree_panic(tree, err);
e6138876a   Josef Bacik   Btrfs: cache exte...
1097
  		cache_state(prealloc, cached_state);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
  		prealloc = NULL;
  		start = this_end + 1;
  		goto search_again;
  	}
  	/*
  	 * | ---- desired range ---- |
  	 *                        | state |
  	 * We need to split the extent, and set the bit
  	 * on the first half
  	 */
  	if (state->start <= end && state->end > end) {
  		prealloc = alloc_extent_state_atomic(prealloc);
1cf4ffdb3   Liu Bo   Btrfs: drop spin ...
1110
1111
1112
1113
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1114
1115
  
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1116
1117
  		if (err)
  			extent_io_tree_panic(tree, err);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1118
1119
  
  		set_state_bits(tree, prealloc, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1120
  		cache_state(prealloc, cached_state);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1121
  		clear_state_bit(tree, prealloc, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
  		prealloc = NULL;
  		goto out;
  	}
  
  	goto search_again;
  
  out:
  	spin_unlock(&tree->lock);
  	if (prealloc)
  		free_extent_state(prealloc);
  
  	return err;
  
  search_again:
  	if (start > end)
  		goto out;
  	spin_unlock(&tree->lock);
  	if (mask & __GFP_WAIT)
  		cond_resched();
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1143
1144
1145
1146
  /* wrappers around set/clear extent bit */
  int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
  		     gfp_t mask)
  {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1147
  	return set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1148
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1149
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1150
1151
  
  int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1152
  		    unsigned long bits, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1153
  {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1154
  	return set_extent_bit(tree, start, end, bits, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1155
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1156
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1157
1158
  
  int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1159
  		      unsigned long bits, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1160
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1161
  	return clear_extent_bit(tree, start, end, bits, 0, 0, NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1162
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1163
1164
  
  int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
1165
  			struct extent_state **cached_state, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1166
1167
  {
  	return set_extent_bit(tree, start, end,
fee187d9d   Liu Bo   Btrfs: do not set...
1168
  			      EXTENT_DELALLOC | EXTENT_UPTODATE,
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1169
  			      NULL, cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1170
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1171

9e8a4a8b0   Liu Bo   Btrfs: use flag E...
1172
1173
1174
1175
1176
1177
1178
  int set_extent_defrag(struct extent_io_tree *tree, u64 start, u64 end,
  		      struct extent_state **cached_state, gfp_t mask)
  {
  	return set_extent_bit(tree, start, end,
  			      EXTENT_DELALLOC | EXTENT_UPTODATE | EXTENT_DEFRAG,
  			      NULL, cached_state, mask);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1179
1180
1181
1182
  int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
  		       gfp_t mask)
  {
  	return clear_extent_bit(tree, start, end,
32c00aff7   Josef Bacik   Btrfs: release de...
1183
  				EXTENT_DIRTY | EXTENT_DELALLOC |
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
1184
  				EXTENT_DO_ACCOUNTING, 0, 0, NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1185
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1186
1187
1188
1189
  
  int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
  		     gfp_t mask)
  {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1190
  	return set_extent_bit(tree, start, end, EXTENT_NEW, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1191
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1192
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1193

d1310b2e0   Chris Mason   Btrfs: Split the ...
1194
  int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
507903b81   Arne Jansen   btrfs: using cach...
1195
  			struct extent_state **cached_state, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1196
  {
6b67a3200   Liu Bo   Btrfs: pass NULL ...
1197
  	return set_extent_bit(tree, start, end, EXTENT_UPTODATE, NULL,
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1198
  			      cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1199
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1200

5fd020435   Josef Bacik   Btrfs: finish ord...
1201
1202
  int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
  			  struct extent_state **cached_state, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1203
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1204
  	return clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
1205
  				cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1206
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1207

d352ac681   Chris Mason   Btrfs: add and im...
1208
1209
1210
1211
  /*
   * either insert or lock state struct between start and end use mask to tell
   * us if waiting is desired.
   */
1edbb734b   Chris Mason   Btrfs: reduce CPU...
1212
  int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1213
  		     unsigned long bits, struct extent_state **cached_state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1214
1215
1216
1217
  {
  	int err;
  	u64 failed_start;
  	while (1) {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1218
1219
1220
  		err = __set_extent_bit(tree, start, end, EXTENT_LOCKED | bits,
  				       EXTENT_LOCKED, &failed_start,
  				       cached_state, GFP_NOFS);
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1221
  		if (err == -EEXIST) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1222
1223
  			wait_extent_bit(tree, failed_start, end, EXTENT_LOCKED);
  			start = failed_start;
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1224
  		} else
d1310b2e0   Chris Mason   Btrfs: Split the ...
1225
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1226
1227
1228
1229
  		WARN_ON(start > end);
  	}
  	return err;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1230

d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1231
  int lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
1edbb734b   Chris Mason   Btrfs: reduce CPU...
1232
  {
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1233
  	return lock_extent_bits(tree, start, end, 0, NULL);
1edbb734b   Chris Mason   Btrfs: reduce CPU...
1234
  }
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1235
  int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
251792013   Josef Bacik   Btrfs: nuke fs wi...
1236
1237
1238
  {
  	int err;
  	u64 failed_start;
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1239
1240
  	err = __set_extent_bit(tree, start, end, EXTENT_LOCKED, EXTENT_LOCKED,
  			       &failed_start, NULL, GFP_NOFS);
6643558db   Yan Zheng   Btrfs: Fix booken...
1241
1242
1243
  	if (err == -EEXIST) {
  		if (failed_start > start)
  			clear_extent_bit(tree, start, failed_start - 1,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1244
  					 EXTENT_LOCKED, 1, 0, NULL, GFP_NOFS);
251792013   Josef Bacik   Btrfs: nuke fs wi...
1245
  		return 0;
6643558db   Yan Zheng   Btrfs: Fix booken...
1246
  	}
251792013   Josef Bacik   Btrfs: nuke fs wi...
1247
1248
  	return 1;
  }
251792013   Josef Bacik   Btrfs: nuke fs wi...
1249

2c64c53d8   Chris Mason   Btrfs: cache valu...
1250
1251
1252
1253
1254
1255
  int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end,
  			 struct extent_state **cached, gfp_t mask)
  {
  	return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached,
  				mask);
  }
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1256
  int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1257
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1258
  	return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, NULL,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1259
  				GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1260
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1261

4adaa6110   Chris Mason   Btrfs: fix race b...
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
  int extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end)
  {
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	unsigned long end_index = end >> PAGE_CACHE_SHIFT;
  	struct page *page;
  
  	while (index <= end_index) {
  		page = find_get_page(inode->i_mapping, index);
  		BUG_ON(!page); /* Pages should be in the extent_io_tree */
  		clear_page_dirty_for_io(page);
  		page_cache_release(page);
  		index++;
  	}
  	return 0;
  }
  
  int extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end)
  {
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	unsigned long end_index = end >> PAGE_CACHE_SHIFT;
  	struct page *page;
  
  	while (index <= end_index) {
  		page = find_get_page(inode->i_mapping, index);
  		BUG_ON(!page); /* Pages should be in the extent_io_tree */
  		account_page_redirty(page);
  		__set_page_dirty_nobuffers(page);
  		page_cache_release(page);
  		index++;
  	}
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1294
  /*
d1310b2e0   Chris Mason   Btrfs: Split the ...
1295
1296
   * helper function to set both pages and extents in the tree writeback
   */
b2950863c   Christoph Hellwig   Btrfs: make thing...
1297
  static int set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1298
1299
1300
1301
1302
1303
1304
  {
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	unsigned long end_index = end >> PAGE_CACHE_SHIFT;
  	struct page *page;
  
  	while (index <= end_index) {
  		page = find_get_page(tree->mapping, index);
79787eaab   Jeff Mahoney   btrfs: replace ma...
1305
  		BUG_ON(!page); /* Pages should be in the extent_io_tree */
d1310b2e0   Chris Mason   Btrfs: Split the ...
1306
1307
1308
1309
  		set_page_writeback(page);
  		page_cache_release(page);
  		index++;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
1310
1311
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1312

d352ac681   Chris Mason   Btrfs: add and im...
1313
1314
1315
1316
  /* find the first state struct with 'bits' set after 'start', and
   * return it.  tree->lock must be held.  NULL will returned if
   * nothing was found after 'start'
   */
48a3b6366   Eric Sandeen   btrfs: make stati...
1317
1318
  static struct extent_state *
  find_first_extent_bit_state(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
1319
  			    u64 start, unsigned long bits)
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1320
1321
1322
1323
1324
1325
1326
1327
1328
  {
  	struct rb_node *node;
  	struct extent_state *state;
  
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
  	node = tree_search(tree, start);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1329
  	if (!node)
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1330
  		goto out;
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1331

d397712bc   Chris Mason   Btrfs: Fix checkp...
1332
  	while (1) {
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1333
  		state = rb_entry(node, struct extent_state, rb_node);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1334
  		if (state->end >= start && (state->state & bits))
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1335
  			return state;
d397712bc   Chris Mason   Btrfs: Fix checkp...
1336

d7fc640e6   Chris Mason   Btrfs: Allocator ...
1337
1338
1339
1340
1341
1342
1343
  		node = rb_next(node);
  		if (!node)
  			break;
  	}
  out:
  	return NULL;
  }
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1344

d352ac681   Chris Mason   Btrfs: add and im...
1345
  /*
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1346
1347
1348
1349
   * find the first offset in the io tree with 'bits' set. zero is
   * returned if we find something, and *start_ret and *end_ret are
   * set to reflect the state struct that was found.
   *
477d7eafa   Wang Sheng-Hui   Btrfs: fix the co...
1350
   * If nothing was found, 1 is returned. If found something, return 0.
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1351
1352
   */
  int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
410748882   David Sterba   btrfs: use unsign...
1353
  			  u64 *start_ret, u64 *end_ret, unsigned long bits,
e6138876a   Josef Bacik   Btrfs: cache exte...
1354
  			  struct extent_state **cached_state)
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1355
1356
  {
  	struct extent_state *state;
e6138876a   Josef Bacik   Btrfs: cache exte...
1357
  	struct rb_node *n;
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1358
1359
1360
  	int ret = 1;
  
  	spin_lock(&tree->lock);
e6138876a   Josef Bacik   Btrfs: cache exte...
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
  	if (cached_state && *cached_state) {
  		state = *cached_state;
  		if (state->end == start - 1 && state->tree) {
  			n = rb_next(&state->rb_node);
  			while (n) {
  				state = rb_entry(n, struct extent_state,
  						 rb_node);
  				if (state->state & bits)
  					goto got_it;
  				n = rb_next(n);
  			}
  			free_extent_state(*cached_state);
  			*cached_state = NULL;
  			goto out;
  		}
  		free_extent_state(*cached_state);
  		*cached_state = NULL;
  	}
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1379
  	state = find_first_extent_bit_state(tree, start, bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1380
  got_it:
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1381
  	if (state) {
e6138876a   Josef Bacik   Btrfs: cache exte...
1382
  		cache_state(state, cached_state);
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1383
1384
1385
1386
  		*start_ret = state->start;
  		*end_ret = state->end;
  		ret = 0;
  	}
e6138876a   Josef Bacik   Btrfs: cache exte...
1387
  out:
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1388
1389
1390
1391
1392
  	spin_unlock(&tree->lock);
  	return ret;
  }
  
  /*
d352ac681   Chris Mason   Btrfs: add and im...
1393
1394
1395
1396
1397
   * find a contiguous range of bytes in the file marked as delalloc, not
   * more than 'max_bytes'.  start and end are used to return the range,
   *
   * 1 is returned if we find something, 0 if nothing was in the tree
   */
c8b978188   Chris Mason   Btrfs: Add zlib c...
1398
  static noinline u64 find_delalloc_range(struct extent_io_tree *tree,
c2a128d28   Josef Bacik   Btrfs: cache exte...
1399
1400
  					u64 *start, u64 *end, u64 max_bytes,
  					struct extent_state **cached_state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1401
1402
1403
1404
1405
1406
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	u64 cur_start = *start;
  	u64 found = 0;
  	u64 total_bytes = 0;
cad321ad5   Chris Mason   Btrfs: shift all ...
1407
  	spin_lock(&tree->lock);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1408

d1310b2e0   Chris Mason   Btrfs: Split the ...
1409
1410
1411
1412
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1413
  	node = tree_search(tree, cur_start);
2b114d1d3   Peter   Btrfs: Correct us...
1414
  	if (!node) {
3b951516e   Chris Mason   Btrfs: Use the ex...
1415
1416
  		if (!found)
  			*end = (u64)-1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1417
1418
  		goto out;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
1419
  	while (1) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1420
  		state = rb_entry(node, struct extent_state, rb_node);
5b21f2ed3   Zheng Yan   Btrfs: extent_map...
1421
1422
  		if (found && (state->start != cur_start ||
  			      (state->state & EXTENT_BOUNDARY))) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1423
1424
1425
1426
1427
1428
1429
  			goto out;
  		}
  		if (!(state->state & EXTENT_DELALLOC)) {
  			if (!found)
  				*end = state->end;
  			goto out;
  		}
c2a128d28   Josef Bacik   Btrfs: cache exte...
1430
  		if (!found) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1431
  			*start = state->start;
c2a128d28   Josef Bacik   Btrfs: cache exte...
1432
1433
1434
  			*cached_state = state;
  			atomic_inc(&state->refs);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
1435
1436
1437
1438
  		found++;
  		*end = state->end;
  		cur_start = state->end + 1;
  		node = rb_next(node);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1439
  		total_bytes += state->end - state->start + 1;
7bf811a59   Josef Bacik   Btrfs: limit dela...
1440
  		if (total_bytes >= max_bytes)
573aecafc   Josef Bacik   Btrfs: actually l...
1441
  			break;
573aecafc   Josef Bacik   Btrfs: actually l...
1442
  		if (!node)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1443
1444
1445
  			break;
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1446
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1447
1448
  	return found;
  }
143bede52   Jeff Mahoney   btrfs: return voi...
1449
1450
1451
  static noinline void __unlock_for_delalloc(struct inode *inode,
  					   struct page *locked_page,
  					   u64 start, u64 end)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1452
1453
1454
1455
1456
1457
1458
1459
1460
  {
  	int ret;
  	struct page *pages[16];
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	unsigned long end_index = end >> PAGE_CACHE_SHIFT;
  	unsigned long nr_pages = end_index - index + 1;
  	int i;
  
  	if (index == locked_page->index && end_index == index)
143bede52   Jeff Mahoney   btrfs: return voi...
1461
  		return;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1462

d397712bc   Chris Mason   Btrfs: Fix checkp...
1463
  	while (nr_pages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1464
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1465
1466
  				     min_t(unsigned long, nr_pages,
  				     ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1467
1468
1469
1470
1471
1472
1473
1474
1475
  		for (i = 0; i < ret; i++) {
  			if (pages[i] != locked_page)
  				unlock_page(pages[i]);
  			page_cache_release(pages[i]);
  		}
  		nr_pages -= ret;
  		index += ret;
  		cond_resched();
  	}
c8b978188   Chris Mason   Btrfs: Add zlib c...
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
  }
  
  static noinline int lock_delalloc_pages(struct inode *inode,
  					struct page *locked_page,
  					u64 delalloc_start,
  					u64 delalloc_end)
  {
  	unsigned long index = delalloc_start >> PAGE_CACHE_SHIFT;
  	unsigned long start_index = index;
  	unsigned long end_index = delalloc_end >> PAGE_CACHE_SHIFT;
  	unsigned long pages_locked = 0;
  	struct page *pages[16];
  	unsigned long nrpages;
  	int ret;
  	int i;
  
  	/* the caller is responsible for locking the start index */
  	if (index == locked_page->index && index == end_index)
  		return 0;
  
  	/* skip the page at the start index */
  	nrpages = end_index - index + 1;
d397712bc   Chris Mason   Btrfs: Fix checkp...
1498
  	while (nrpages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1499
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1500
1501
  				     min_t(unsigned long,
  				     nrpages, ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
  		if (ret == 0) {
  			ret = -EAGAIN;
  			goto done;
  		}
  		/* now we have an array of pages, lock them all */
  		for (i = 0; i < ret; i++) {
  			/*
  			 * the caller is taking responsibility for
  			 * locked_page
  			 */
771ed689d   Chris Mason   Btrfs: Optimize c...
1512
  			if (pages[i] != locked_page) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1513
  				lock_page(pages[i]);
f2b1c41cf   Chris Mason   Btrfs: Make sure ...
1514
1515
  				if (!PageDirty(pages[i]) ||
  				    pages[i]->mapping != inode->i_mapping) {
771ed689d   Chris Mason   Btrfs: Optimize c...
1516
1517
1518
1519
1520
1521
  					ret = -EAGAIN;
  					unlock_page(pages[i]);
  					page_cache_release(pages[i]);
  					goto done;
  				}
  			}
c8b978188   Chris Mason   Btrfs: Add zlib c...
1522
  			page_cache_release(pages[i]);
771ed689d   Chris Mason   Btrfs: Optimize c...
1523
  			pages_locked++;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1524
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
  		nrpages -= ret;
  		index += ret;
  		cond_resched();
  	}
  	ret = 0;
  done:
  	if (ret && pages_locked) {
  		__unlock_for_delalloc(inode, locked_page,
  			      delalloc_start,
  			      ((u64)(start_index + pages_locked - 1)) <<
  			      PAGE_CACHE_SHIFT);
  	}
  	return ret;
  }
  
  /*
   * find a contiguous range of bytes in the file marked as delalloc, not
   * more than 'max_bytes'.  start and end are used to return the range,
   *
   * 1 is returned if we find something, 0 if nothing was in the tree
   */
  static noinline u64 find_lock_delalloc_range(struct inode *inode,
  					     struct extent_io_tree *tree,
  					     struct page *locked_page,
  					     u64 *start, u64 *end,
  					     u64 max_bytes)
  {
  	u64 delalloc_start;
  	u64 delalloc_end;
  	u64 found;
9655d2982   Chris Mason   Btrfs: use a cach...
1555
  	struct extent_state *cached_state = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1556
1557
1558
1559
1560
1561
1562
1563
  	int ret;
  	int loops = 0;
  
  again:
  	/* step one, find a bunch of delalloc bytes starting at start */
  	delalloc_start = *start;
  	delalloc_end = 0;
  	found = find_delalloc_range(tree, &delalloc_start, &delalloc_end,
c2a128d28   Josef Bacik   Btrfs: cache exte...
1564
  				    max_bytes, &cached_state);
70b99e695   Chris Mason   Btrfs: Compressio...
1565
  	if (!found || delalloc_end <= *start) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1566
1567
  		*start = delalloc_start;
  		*end = delalloc_end;
c2a128d28   Josef Bacik   Btrfs: cache exte...
1568
  		free_extent_state(cached_state);
385fe0bed   Liu Bo   Btrfs: fix crash ...
1569
  		return 0;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1570
1571
1572
  	}
  
  	/*
70b99e695   Chris Mason   Btrfs: Compressio...
1573
1574
1575
1576
  	 * start comes from the offset of locked_page.  We have to lock
  	 * pages in order, so we can't process delalloc bytes before
  	 * locked_page
  	 */
d397712bc   Chris Mason   Btrfs: Fix checkp...
1577
  	if (delalloc_start < *start)
70b99e695   Chris Mason   Btrfs: Compressio...
1578
  		delalloc_start = *start;
70b99e695   Chris Mason   Btrfs: Compressio...
1579
1580
  
  	/*
c8b978188   Chris Mason   Btrfs: Add zlib c...
1581
  	 * make sure to limit the number of pages we try to lock down
c8b978188   Chris Mason   Btrfs: Add zlib c...
1582
  	 */
7bf811a59   Josef Bacik   Btrfs: limit dela...
1583
1584
  	if (delalloc_end + 1 - delalloc_start > max_bytes)
  		delalloc_end = delalloc_start + max_bytes - 1;
d397712bc   Chris Mason   Btrfs: Fix checkp...
1585

c8b978188   Chris Mason   Btrfs: Add zlib c...
1586
1587
1588
1589
1590
1591
1592
  	/* step two, lock all the pages after the page that has start */
  	ret = lock_delalloc_pages(inode, locked_page,
  				  delalloc_start, delalloc_end);
  	if (ret == -EAGAIN) {
  		/* some of the pages are gone, lets avoid looping by
  		 * shortening the size of the delalloc range we're searching
  		 */
9655d2982   Chris Mason   Btrfs: use a cach...
1593
  		free_extent_state(cached_state);
7855e3447   Chris Mason   Btrfs: fix double...
1594
  		cached_state = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1595
  		if (!loops) {
7bf811a59   Josef Bacik   Btrfs: limit dela...
1596
  			max_bytes = PAGE_CACHE_SIZE;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1597
1598
1599
1600
1601
1602
1603
  			loops = 1;
  			goto again;
  		} else {
  			found = 0;
  			goto out_failed;
  		}
  	}
79787eaab   Jeff Mahoney   btrfs: replace ma...
1604
  	BUG_ON(ret); /* Only valid values are 0 and -EAGAIN */
c8b978188   Chris Mason   Btrfs: Add zlib c...
1605
1606
  
  	/* step three, lock the state bits for the whole range */
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1607
  	lock_extent_bits(tree, delalloc_start, delalloc_end, 0, &cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1608
1609
1610
  
  	/* then test to make sure it is all still delalloc */
  	ret = test_range_bit(tree, delalloc_start, delalloc_end,
9655d2982   Chris Mason   Btrfs: use a cach...
1611
  			     EXTENT_DELALLOC, 1, cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1612
  	if (!ret) {
9655d2982   Chris Mason   Btrfs: use a cach...
1613
1614
  		unlock_extent_cached(tree, delalloc_start, delalloc_end,
  				     &cached_state, GFP_NOFS);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1615
1616
1617
1618
1619
  		__unlock_for_delalloc(inode, locked_page,
  			      delalloc_start, delalloc_end);
  		cond_resched();
  		goto again;
  	}
9655d2982   Chris Mason   Btrfs: use a cach...
1620
  	free_extent_state(cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1621
1622
1623
1624
1625
  	*start = delalloc_start;
  	*end = delalloc_end;
  out_failed:
  	return found;
  }
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1626
1627
1628
1629
  int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
  				 struct page *locked_page,
  				 unsigned long clear_bits,
  				 unsigned long page_ops)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1630
  {
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1631
  	struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1632
1633
1634
1635
1636
1637
  	int ret;
  	struct page *pages[16];
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	unsigned long end_index = end >> PAGE_CACHE_SHIFT;
  	unsigned long nr_pages = end_index - index + 1;
  	int i;
771ed689d   Chris Mason   Btrfs: Optimize c...
1638

2c64c53d8   Chris Mason   Btrfs: cache valu...
1639
  	clear_extent_bit(tree, start, end, clear_bits, 1, 0, NULL, GFP_NOFS);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1640
  	if (page_ops == 0)
771ed689d   Chris Mason   Btrfs: Optimize c...
1641
  		return 0;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1642

d397712bc   Chris Mason   Btrfs: Fix checkp...
1643
  	while (nr_pages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1644
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1645
1646
  				     min_t(unsigned long,
  				     nr_pages, ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1647
  		for (i = 0; i < ret; i++) {
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
1648

c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1649
  			if (page_ops & PAGE_SET_PRIVATE2)
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
1650
  				SetPagePrivate2(pages[i]);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1651
1652
1653
1654
  			if (pages[i] == locked_page) {
  				page_cache_release(pages[i]);
  				continue;
  			}
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1655
  			if (page_ops & PAGE_CLEAR_DIRTY)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1656
  				clear_page_dirty_for_io(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1657
  			if (page_ops & PAGE_SET_WRITEBACK)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1658
  				set_page_writeback(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1659
  			if (page_ops & PAGE_END_WRITEBACK)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1660
  				end_page_writeback(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1661
  			if (page_ops & PAGE_UNLOCK)
771ed689d   Chris Mason   Btrfs: Optimize c...
1662
  				unlock_page(pages[i]);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1663
1664
1665
1666
1667
1668
1669
1670
  			page_cache_release(pages[i]);
  		}
  		nr_pages -= ret;
  		index += ret;
  		cond_resched();
  	}
  	return 0;
  }
c8b978188   Chris Mason   Btrfs: Add zlib c...
1671

d352ac681   Chris Mason   Btrfs: add and im...
1672
1673
1674
1675
1676
  /*
   * count the number of bytes in the tree that have a given bit(s)
   * set.  This can be fairly slow, except for EXTENT_DIRTY which is
   * cached.  The total number found is returned.
   */
d1310b2e0   Chris Mason   Btrfs: Split the ...
1677
1678
  u64 count_range_bits(struct extent_io_tree *tree,
  		     u64 *start, u64 search_end, u64 max_bytes,
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1679
  		     unsigned long bits, int contig)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1680
1681
1682
1683
1684
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	u64 cur_start = *start;
  	u64 total_bytes = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1685
  	u64 last = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1686
1687
1688
  	int found = 0;
  
  	if (search_end <= cur_start) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1689
1690
1691
  		WARN_ON(1);
  		return 0;
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
1692
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1693
1694
1695
1696
1697
1698
1699
1700
  	if (cur_start == 0 && bits == EXTENT_DIRTY) {
  		total_bytes = tree->dirty_bytes;
  		goto out;
  	}
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1701
  	node = tree_search(tree, cur_start);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1702
  	if (!node)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1703
  		goto out;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1704

d397712bc   Chris Mason   Btrfs: Fix checkp...
1705
  	while (1) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1706
1707
1708
  		state = rb_entry(node, struct extent_state, rb_node);
  		if (state->start > search_end)
  			break;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1709
1710
1711
  		if (contig && found && state->start > last + 1)
  			break;
  		if (state->end >= cur_start && (state->state & bits) == bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1712
1713
1714
1715
1716
  			total_bytes += min(search_end, state->end) + 1 -
  				       max(cur_start, state->start);
  			if (total_bytes >= max_bytes)
  				break;
  			if (!found) {
af60bed24   Josef Bacik   Btrfs: set range_...
1717
  				*start = max(cur_start, state->start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1718
1719
  				found = 1;
  			}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1720
1721
1722
  			last = state->end;
  		} else if (contig && found) {
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1723
1724
1725
1726
1727
1728
  		}
  		node = rb_next(node);
  		if (!node)
  			break;
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1729
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1730
1731
  	return total_bytes;
  }
b2950863c   Christoph Hellwig   Btrfs: make thing...
1732

d352ac681   Chris Mason   Btrfs: add and im...
1733
1734
1735
1736
  /*
   * set the private field for a given byte offset in the tree.  If there isn't
   * an extent_state there already, this does nothing.
   */
171170c1c   Sergei Trofimovich   btrfs: mark some ...
1737
  static int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1738
1739
1740
1741
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	int ret = 0;
cad321ad5   Chris Mason   Btrfs: shift all ...
1742
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1743
1744
1745
1746
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1747
  	node = tree_search(tree, start);
2b114d1d3   Peter   Btrfs: Correct us...
1748
  	if (!node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
  		ret = -ENOENT;
  		goto out;
  	}
  	state = rb_entry(node, struct extent_state, rb_node);
  	if (state->start != start) {
  		ret = -ENOENT;
  		goto out;
  	}
  	state->private = private;
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1759
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1760
1761
1762
1763
1764
1765
1766
1767
  	return ret;
  }
  
  int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	int ret = 0;
cad321ad5   Chris Mason   Btrfs: shift all ...
1768
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1769
1770
1771
1772
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1773
  	node = tree_search(tree, start);
2b114d1d3   Peter   Btrfs: Correct us...
1774
  	if (!node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
  		ret = -ENOENT;
  		goto out;
  	}
  	state = rb_entry(node, struct extent_state, rb_node);
  	if (state->start != start) {
  		ret = -ENOENT;
  		goto out;
  	}
  	*private = state->private;
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1785
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1786
1787
1788
1789
1790
  	return ret;
  }
  
  /*
   * searches a range in the state tree for a given mask.
70dec8079   Chris Mason   Btrfs: extent_io ...
1791
   * If 'filled' == 1, this returns 1 only if every extent in the tree
d1310b2e0   Chris Mason   Btrfs: Split the ...
1792
1793
1794
1795
   * has the bits set.  Otherwise, 1 is returned if any bit in the
   * range is found set.
   */
  int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1796
  		   unsigned long bits, int filled, struct extent_state *cached)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1797
1798
1799
1800
  {
  	struct extent_state *state = NULL;
  	struct rb_node *node;
  	int bitset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1801

cad321ad5   Chris Mason   Btrfs: shift all ...
1802
  	spin_lock(&tree->lock);
df98b6e2c   Josef Bacik   Btrfs: fix how we...
1803
1804
  	if (cached && cached->tree && cached->start <= start &&
  	    cached->end > start)
9655d2982   Chris Mason   Btrfs: use a cach...
1805
1806
1807
  		node = &cached->rb_node;
  	else
  		node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
  	while (node && start <= end) {
  		state = rb_entry(node, struct extent_state, rb_node);
  
  		if (filled && state->start > start) {
  			bitset = 0;
  			break;
  		}
  
  		if (state->start > end)
  			break;
  
  		if (state->state & bits) {
  			bitset = 1;
  			if (!filled)
  				break;
  		} else if (filled) {
  			bitset = 0;
  			break;
  		}
46562cec9   Chris Mason   Btrfs: Fix test_r...
1827
1828
1829
  
  		if (state->end == (u64)-1)
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
  		start = state->end + 1;
  		if (start > end)
  			break;
  		node = rb_next(node);
  		if (!node) {
  			if (filled)
  				bitset = 0;
  			break;
  		}
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
1840
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1841
1842
  	return bitset;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1843
1844
1845
1846
1847
  
  /*
   * helper function to set a given page up to date if all the
   * extents in the tree for that page are up to date
   */
143bede52   Jeff Mahoney   btrfs: return voi...
1848
  static void check_page_uptodate(struct extent_io_tree *tree, struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1849
  {
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
1850
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1851
  	u64 end = start + PAGE_CACHE_SIZE - 1;
9655d2982   Chris Mason   Btrfs: use a cach...
1852
  	if (test_range_bit(tree, start, end, EXTENT_UPTODATE, 1, NULL))
d1310b2e0   Chris Mason   Btrfs: Split the ...
1853
  		SetPageUptodate(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1854
1855
1856
  }
  
  /*
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
   * When IO fails, either with EIO or csum verification fails, we
   * try other mirrors that might have a good copy of the data.  This
   * io_failure_record is used to record state as we go through all the
   * mirrors.  If another mirror has good data, the page is set up to date
   * and things continue.  If a good mirror can't be found, the original
   * bio end_io callback is called to indicate things have failed.
   */
  struct io_failure_record {
  	struct page *page;
  	u64 start;
  	u64 len;
  	u64 logical;
  	unsigned long bio_flags;
  	int this_mirror;
  	int failed_mirror;
  	int in_validation;
  };
  
  static int free_io_failure(struct inode *inode, struct io_failure_record *rec,
  				int did_repair)
  {
  	int ret;
  	int err = 0;
  	struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree;
  
  	set_state_private(failure_tree, rec->start, 0);
  	ret = clear_extent_bits(failure_tree, rec->start,
  				rec->start + rec->len - 1,
  				EXTENT_LOCKED | EXTENT_DIRTY, GFP_NOFS);
  	if (ret)
  		err = ret;
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
1888
1889
1890
1891
1892
  	ret = clear_extent_bits(&BTRFS_I(inode)->io_tree, rec->start,
  				rec->start + rec->len - 1,
  				EXTENT_DAMAGED, GFP_NOFS);
  	if (ret && !err)
  		err = ret;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
  
  	kfree(rec);
  	return err;
  }
  
  static void repair_io_failure_callback(struct bio *bio, int err)
  {
  	complete(bio->bi_private);
  }
  
  /*
   * this bypasses the standard btrfs submit functions deliberately, as
   * the standard behavior is to write all copies in a raid setup. here we only
   * want to write the one bad copy. so we do the mapping for ourselves and issue
   * submit_bio directly.
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1908
   * to avoid any synchronization issues, wait for the data after writing, which
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1909
1910
1911
1912
   * actually prevents the read that triggered the error from finishing.
   * currently, there can be no more than two copies of every data bit. thus,
   * exactly one rewrite is required.
   */
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1913
  int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1914
1915
1916
1917
1918
1919
1920
1921
1922
  			u64 length, u64 logical, struct page *page,
  			int mirror_num)
  {
  	struct bio *bio;
  	struct btrfs_device *dev;
  	DECLARE_COMPLETION_ONSTACK(compl);
  	u64 map_length = 0;
  	u64 sector;
  	struct btrfs_bio *bbio = NULL;
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
1923
  	struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1924
1925
1926
  	int ret;
  
  	BUG_ON(!mirror_num);
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
1927
1928
1929
  	/* we can't repair anything in raid56 yet */
  	if (btrfs_is_parity_mirror(map_tree, logical, length, mirror_num))
  		return 0;
9be3395bc   Chris Mason   Btrfs: use a btrf...
1930
  	bio = btrfs_io_bio_alloc(GFP_NOFS, 1);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1931
1932
1933
1934
1935
1936
  	if (!bio)
  		return -EIO;
  	bio->bi_private = &compl;
  	bio->bi_end_io = repair_io_failure_callback;
  	bio->bi_size = 0;
  	map_length = length;
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1937
  	ret = btrfs_map_block(fs_info, WRITE, logical,
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
  			      &map_length, &bbio, mirror_num);
  	if (ret) {
  		bio_put(bio);
  		return -EIO;
  	}
  	BUG_ON(mirror_num != bbio->mirror_num);
  	sector = bbio->stripes[mirror_num-1].physical >> 9;
  	bio->bi_sector = sector;
  	dev = bbio->stripes[mirror_num-1].dev;
  	kfree(bbio);
  	if (!dev || !dev->bdev || !dev->writeable) {
  		bio_put(bio);
  		return -EIO;
  	}
  	bio->bi_bdev = dev->bdev;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
1953
  	bio_add_page(bio, page, length, start - page_offset(page));
21adbd5cb   Stefan Behrens   Btrfs: integrate ...
1954
  	btrfsic_submit_bio(WRITE_SYNC, bio);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1955
1956
1957
1958
1959
  	wait_for_completion(&compl);
  
  	if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) {
  		/* try to remap that extent elsewhere? */
  		bio_put(bio);
442a4f630   Stefan Behrens   Btrfs: add device...
1960
  		btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1961
1962
  		return -EIO;
  	}
d5b025d51   Anand Jain   btrfs read error ...
1963
  	printk_ratelimited_in_rcu(KERN_INFO "btrfs read error corrected: ino %lu off %llu "
606686eea   Josef Bacik   Btrfs: use rcu to...
1964
1965
1966
  		      "(dev %s sector %llu)
  ", page->mapping->host->i_ino,
  		      start, rcu_str_deref(dev->name), sector);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1967
1968
1969
1970
  
  	bio_put(bio);
  	return 0;
  }
ea4667940   Josef Bacik   Btrfs: deal with ...
1971
1972
1973
  int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
  			 int mirror_num)
  {
ea4667940   Josef Bacik   Btrfs: deal with ...
1974
1975
  	u64 start = eb->start;
  	unsigned long i, num_pages = num_extent_pages(eb->start, eb->len);
d95603b26   Chris Mason   Btrfs: fix uninit...
1976
  	int ret = 0;
ea4667940   Josef Bacik   Btrfs: deal with ...
1977
1978
1979
  
  	for (i = 0; i < num_pages; i++) {
  		struct page *p = extent_buffer_page(eb, i);
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1980
  		ret = repair_io_failure(root->fs_info, start, PAGE_CACHE_SIZE,
ea4667940   Josef Bacik   Btrfs: deal with ...
1981
1982
1983
1984
1985
1986
1987
1988
  					start, p, mirror_num);
  		if (ret)
  			break;
  		start += PAGE_CACHE_SIZE;
  	}
  
  	return ret;
  }
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1989
1990
1991
1992
1993
1994
1995
1996
1997
  /*
   * each time an IO finishes, we do a fast check in the IO failure tree
   * to see if we need to process or clean up an io_failure_record
   */
  static int clean_io_failure(u64 start, struct page *page)
  {
  	u64 private;
  	u64 private_failure;
  	struct io_failure_record *failrec;
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1998
  	struct btrfs_fs_info *fs_info;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
  	struct extent_state *state;
  	int num_copies;
  	int did_repair = 0;
  	int ret;
  	struct inode *inode = page->mapping->host;
  
  	private = 0;
  	ret = count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private,
  				(u64)-1, 1, EXTENT_DIRTY, 0);
  	if (!ret)
  		return 0;
  
  	ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, start,
  				&private_failure);
  	if (ret)
  		return 0;
  
  	failrec = (struct io_failure_record *)(unsigned long) private_failure;
  	BUG_ON(!failrec->this_mirror);
  
  	if (failrec->in_validation) {
  		/* there was no real error, just free the record */
  		pr_debug("clean_io_failure: freeing dummy error at %llu
  ",
  			 failrec->start);
  		did_repair = 1;
  		goto out;
  	}
  
  	spin_lock(&BTRFS_I(inode)->io_tree.lock);
  	state = find_first_extent_bit_state(&BTRFS_I(inode)->io_tree,
  					    failrec->start,
  					    EXTENT_LOCKED);
  	spin_unlock(&BTRFS_I(inode)->io_tree.lock);
883d0de48   Miao Xie   Btrfs: batch the ...
2033
2034
  	if (state && state->start <= failrec->start &&
  	    state->end >= failrec->start + failrec->len - 1) {
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
2035
2036
2037
  		fs_info = BTRFS_I(inode)->root->fs_info;
  		num_copies = btrfs_num_copies(fs_info, failrec->logical,
  					      failrec->len);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2038
  		if (num_copies > 1)  {
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
2039
  			ret = repair_io_failure(fs_info, start, failrec->len,
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2040
2041
2042
2043
  						failrec->logical, page,
  						failrec->failed_mirror);
  			did_repair = !ret;
  		}
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
2044
  		ret = 0;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
  	}
  
  out:
  	if (!ret)
  		ret = free_io_failure(inode, failrec, did_repair);
  
  	return ret;
  }
  
  /*
   * this is a generic handler for readpage errors (default
   * readpage_io_failed_hook). if other copies exist, read those and write back
   * good data to the failed position. does not investigate in remapping the
   * failed extent elsewhere, hoping the device will be smart enough to do this as
   * needed
   */
facc8a224   Miao Xie   Btrfs: don't cach...
2061
2062
2063
  static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
  			      struct page *page, u64 start, u64 end,
  			      int failed_mirror)
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2064
2065
2066
2067
2068
2069
2070
2071
2072
  {
  	struct io_failure_record *failrec = NULL;
  	u64 private;
  	struct extent_map *em;
  	struct inode *inode = page->mapping->host;
  	struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree;
  	struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
  	struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
  	struct bio *bio;
facc8a224   Miao Xie   Btrfs: don't cach...
2073
2074
  	struct btrfs_io_bio *btrfs_failed_bio;
  	struct btrfs_io_bio *btrfs_bio;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
  	int num_copies;
  	int ret;
  	int read_mode;
  	u64 logical;
  
  	BUG_ON(failed_bio->bi_rw & REQ_WRITE);
  
  	ret = get_state_private(failure_tree, start, &private);
  	if (ret) {
  		failrec = kzalloc(sizeof(*failrec), GFP_NOFS);
  		if (!failrec)
  			return -ENOMEM;
  		failrec->start = start;
  		failrec->len = end - start + 1;
  		failrec->this_mirror = 0;
  		failrec->bio_flags = 0;
  		failrec->in_validation = 0;
  
  		read_lock(&em_tree->lock);
  		em = lookup_extent_mapping(em_tree, start, failrec->len);
  		if (!em) {
  			read_unlock(&em_tree->lock);
  			kfree(failrec);
  			return -EIO;
  		}
  
  		if (em->start > start || em->start + em->len < start) {
  			free_extent_map(em);
  			em = NULL;
  		}
  		read_unlock(&em_tree->lock);
7a2d6a646   Tsutomu Itoh   Btrfs: remove unn...
2106
  		if (!em) {
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
  			kfree(failrec);
  			return -EIO;
  		}
  		logical = start - em->start;
  		logical = em->block_start + logical;
  		if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) {
  			logical = em->block_start;
  			failrec->bio_flags = EXTENT_BIO_COMPRESSED;
  			extent_set_compress_type(&failrec->bio_flags,
  						 em->compress_type);
  		}
  		pr_debug("bio_readpage_error: (new) logical=%llu, start=%llu, "
  			 "len=%llu
  ", logical, start, failrec->len);
  		failrec->logical = logical;
  		free_extent_map(em);
  
  		/* set the bits in the private failure tree */
  		ret = set_extent_bits(failure_tree, start, end,
  					EXTENT_LOCKED | EXTENT_DIRTY, GFP_NOFS);
  		if (ret >= 0)
  			ret = set_state_private(failure_tree, start,
  						(u64)(unsigned long)failrec);
  		/* set the bits in the inode's tree */
  		if (ret >= 0)
  			ret = set_extent_bits(tree, start, end, EXTENT_DAMAGED,
  						GFP_NOFS);
  		if (ret < 0) {
  			kfree(failrec);
  			return ret;
  		}
  	} else {
  		failrec = (struct io_failure_record *)(unsigned long)private;
  		pr_debug("bio_readpage_error: (found) logical=%llu, "
  			 "start=%llu, len=%llu, validation=%d
  ",
  			 failrec->logical, failrec->start, failrec->len,
  			 failrec->in_validation);
  		/*
  		 * when data can be on disk more than twice, add to failrec here
  		 * (e.g. with a list for failed_mirror) to make
  		 * clean_io_failure() clean all those errors at once.
  		 */
  	}
5d9640517   Stefan Behrens   Btrfs: Pass fs_in...
2151
2152
  	num_copies = btrfs_num_copies(BTRFS_I(inode)->root->fs_info,
  				      failrec->logical, failrec->len);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2153
2154
2155
2156
2157
2158
  	if (num_copies == 1) {
  		/*
  		 * we only have a single copy of the data, so don't bother with
  		 * all the retry and error correction code that follows. no
  		 * matter what the error is, it is very likely to persist.
  		 */
09a7f7a28   Miao Xie   Btrfs: remove unn...
2159
2160
2161
  		pr_debug("bio_readpage_error: cannot repair, num_copies=%d, next_mirror %d, failed_mirror %d
  ",
  			 num_copies, failrec->this_mirror, failed_mirror);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2162
2163
2164
  		free_io_failure(inode, failrec, 0);
  		return -EIO;
  	}
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
  	/*
  	 * there are two premises:
  	 *	a) deliver good data to the caller
  	 *	b) correct the bad sectors on disk
  	 */
  	if (failed_bio->bi_vcnt > 1) {
  		/*
  		 * to fulfill b), we need to know the exact failing sectors, as
  		 * we don't want to rewrite any more than the failed ones. thus,
  		 * we need separate read requests for the failed bio
  		 *
  		 * if the following BUG_ON triggers, our validation request got
  		 * merged. we need separate requests for our algorithm to work.
  		 */
  		BUG_ON(failrec->in_validation);
  		failrec->in_validation = 1;
  		failrec->this_mirror = failed_mirror;
  		read_mode = READ_SYNC | REQ_FAILFAST_DEV;
  	} else {
  		/*
  		 * we're ready to fulfill a) and b) alongside. get a good copy
  		 * of the failed sector and if we succeed, we have setup
  		 * everything for repair_io_failure to do the rest for us.
  		 */
  		if (failrec->in_validation) {
  			BUG_ON(failrec->this_mirror != failed_mirror);
  			failrec->in_validation = 0;
  			failrec->this_mirror = 0;
  		}
  		failrec->failed_mirror = failed_mirror;
  		failrec->this_mirror++;
  		if (failrec->this_mirror == failed_mirror)
  			failrec->this_mirror++;
  		read_mode = READ_SYNC;
  	}
facc8a224   Miao Xie   Btrfs: don't cach...
2200
2201
2202
  	if (failrec->this_mirror > num_copies) {
  		pr_debug("bio_readpage_error: (fail) num_copies=%d, next_mirror %d, failed_mirror %d
  ",
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2203
2204
2205
2206
  			 num_copies, failrec->this_mirror, failed_mirror);
  		free_io_failure(inode, failrec, 0);
  		return -EIO;
  	}
9be3395bc   Chris Mason   Btrfs: use a btrf...
2207
  	bio = btrfs_io_bio_alloc(GFP_NOFS, 1);
e627ee7bc   Tsutomu Itoh   Btrfs: check retu...
2208
2209
2210
2211
  	if (!bio) {
  		free_io_failure(inode, failrec, 0);
  		return -EIO;
  	}
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2212
2213
2214
2215
  	bio->bi_end_io = failed_bio->bi_end_io;
  	bio->bi_sector = failrec->logical >> 9;
  	bio->bi_bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
  	bio->bi_size = 0;
facc8a224   Miao Xie   Btrfs: don't cach...
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
  	btrfs_failed_bio = btrfs_io_bio(failed_bio);
  	if (btrfs_failed_bio->csum) {
  		struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
  		u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
  
  		btrfs_bio = btrfs_io_bio(bio);
  		btrfs_bio->csum = btrfs_bio->csum_inline;
  		phy_offset >>= inode->i_sb->s_blocksize_bits;
  		phy_offset *= csum_size;
  		memcpy(btrfs_bio->csum, btrfs_failed_bio->csum + phy_offset,
  		       csum_size);
  	}
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2228
2229
2230
2231
2232
2233
  	bio_add_page(bio, page, failrec->len, start - page_offset(page));
  
  	pr_debug("bio_readpage_error: submitting new read[%#x] to "
  		 "this_mirror=%d, num_copies=%d, in_validation=%d
  ", read_mode,
  		 failrec->this_mirror, num_copies, failrec->in_validation);
013bd4c33   Tsutomu Itoh   Btrfs: fix return...
2234
2235
2236
2237
  	ret = tree->ops->submit_bio_hook(inode, read_mode, bio,
  					 failrec->this_mirror,
  					 failrec->bio_flags, 0);
  	return ret;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2238
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2239
  /* lots and lots of room for performance fixes in the end_bio funcs */
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2240
2241
2242
2243
  int end_extent_writepage(struct page *page, int err, u64 start, u64 end)
  {
  	int uptodate = (err == 0);
  	struct extent_io_tree *tree;
591cb1f86   Eric Sandeen   btrfs: fix use of...
2244
  	int ret = 0;
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2245
2246
2247
2248
2249
2250
2251
2252
2253
  
  	tree = &BTRFS_I(page->mapping->host)->io_tree;
  
  	if (tree->ops && tree->ops->writepage_end_io_hook) {
  		ret = tree->ops->writepage_end_io_hook(page, start,
  					       end, NULL, uptodate);
  		if (ret)
  			uptodate = 0;
  	}
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2254
  	if (!uptodate) {
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2255
2256
  		ClearPageUptodate(page);
  		SetPageError(page);
fbf046315   Liu Bo   Btrfs: mark mappi...
2257
2258
  		ret = ret < 0 ? ret : -EIO;
  		mapping_set_error(page->mapping, ret);
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2259
2260
2261
  	}
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2262
2263
2264
2265
2266
2267
2268
2269
2270
  /*
   * after a writepage IO is done, we need to:
   * clear the uptodate bits on error
   * clear the writeback bits in the extent tree for this IO
   * end_page_writeback if the page has no more pending IO
   *
   * Scheduling is not allowed, so the extent state tree is expected
   * to have one and only one object corresponding to this IO.
   */
d1310b2e0   Chris Mason   Btrfs: Split the ...
2271
  static void end_bio_extent_writepage(struct bio *bio, int err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2272
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2273
  	struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
902b22f34   David Woodhouse   Btrfs: Remove bro...
2274
  	struct extent_io_tree *tree;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2275
2276
  	u64 start;
  	u64 end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2277

d1310b2e0   Chris Mason   Btrfs: Split the ...
2278
2279
  	do {
  		struct page *page = bvec->bv_page;
902b22f34   David Woodhouse   Btrfs: Remove bro...
2280
  		tree = &BTRFS_I(page->mapping->host)->io_tree;
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
  		/* We always issue full-page reads, but if some block
  		 * in a page fails to read, blk_update_request() will
  		 * advance bv_offset and adjust bv_len to compensate.
  		 * Print a warning for nonzero offsets, and an error
  		 * if they don't add up to a full page.  */
  		if (bvec->bv_offset || bvec->bv_len != PAGE_CACHE_SIZE)
  			printk("%s page write in btrfs with offset %u and length %u
  ",
  			       bvec->bv_offset + bvec->bv_len != PAGE_CACHE_SIZE
  			       ? KERN_ERR "partial" : KERN_INFO "incomplete",
  			       bvec->bv_offset, bvec->bv_len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2292

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2293
2294
  		start = page_offset(page);
  		end = start + bvec->bv_offset + bvec->bv_len - 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2295
2296
2297
  
  		if (--bvec >= bio->bi_io_vec)
  			prefetchw(&bvec->bv_page->flags);
1259ab75c   Chris Mason   Btrfs: Handle wri...
2298

87826df0e   Jeff Mahoney   btrfs: delalloc f...
2299
2300
  		if (end_extent_writepage(page, err, start, end))
  			continue;
70dec8079   Chris Mason   Btrfs: extent_io ...
2301

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2302
  		end_page_writeback(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2303
  	} while (bvec >= bio->bi_io_vec);
2b1f55b0f   Chris Mason   Remove Btrfs comp...
2304

d1310b2e0   Chris Mason   Btrfs: Split the ...
2305
  	bio_put(bio);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2306
  }
883d0de48   Miao Xie   Btrfs: batch the ...
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
  static void
  endio_readpage_release_extent(struct extent_io_tree *tree, u64 start, u64 len,
  			      int uptodate)
  {
  	struct extent_state *cached = NULL;
  	u64 end = start + len - 1;
  
  	if (uptodate && tree->track_uptodate)
  		set_extent_uptodate(tree, start, end, &cached, GFP_ATOMIC);
  	unlock_extent_cached(tree, start, end, &cached, GFP_ATOMIC);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
  /*
   * after a readpage IO is done, we need to:
   * clear the uptodate bits on error
   * set the uptodate bits if things worked
   * set the page up to date if all extents in the tree are uptodate
   * clear the lock bit in the extent tree
   * unlock the page if there are no other extents locked for it
   *
   * Scheduling is not allowed, so the extent state tree is expected
   * to have one and only one object corresponding to this IO.
   */
d1310b2e0   Chris Mason   Btrfs: Split the ...
2329
  static void end_bio_extent_readpage(struct bio *bio, int err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2330
2331
  {
  	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
4125bf761   Chris Mason   Btrfs: finish rea...
2332
2333
  	struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
  	struct bio_vec *bvec = bio->bi_io_vec;
facc8a224   Miao Xie   Btrfs: don't cach...
2334
  	struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
902b22f34   David Woodhouse   Btrfs: Remove bro...
2335
  	struct extent_io_tree *tree;
facc8a224   Miao Xie   Btrfs: don't cach...
2336
  	u64 offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2337
2338
  	u64 start;
  	u64 end;
facc8a224   Miao Xie   Btrfs: don't cach...
2339
  	u64 len;
883d0de48   Miao Xie   Btrfs: batch the ...
2340
2341
  	u64 extent_start = 0;
  	u64 extent_len = 0;
5cf1ab561   Josef Bacik   Btrfs: always sto...
2342
  	int mirror;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2343
  	int ret;
d20f7043f   Chris Mason   Btrfs: move data ...
2344
2345
  	if (err)
  		uptodate = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2346
2347
  	do {
  		struct page *page = bvec->bv_page;
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2348
  		struct inode *inode = page->mapping->host;
507903b81   Arne Jansen   btrfs: using cach...
2349

be3940c0a   Kent Overstreet   btrfs: Kill some ...
2350
  		pr_debug("end_bio_extent_readpage: bi_sector=%llu, err=%d, "
9be3395bc   Chris Mason   Btrfs: use a btrf...
2351
2352
2353
  			 "mirror=%lu
  ", (u64)bio->bi_sector, err,
  			 io_bio->mirror_num);
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2354
  		tree = &BTRFS_I(inode)->io_tree;
902b22f34   David Woodhouse   Btrfs: Remove bro...
2355

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
  		/* We always issue full-page reads, but if some block
  		 * in a page fails to read, blk_update_request() will
  		 * advance bv_offset and adjust bv_len to compensate.
  		 * Print a warning for nonzero offsets, and an error
  		 * if they don't add up to a full page.  */
  		if (bvec->bv_offset || bvec->bv_len != PAGE_CACHE_SIZE)
  			printk("%s page read in btrfs with offset %u and length %u
  ",
  			       bvec->bv_offset + bvec->bv_len != PAGE_CACHE_SIZE
  			       ? KERN_ERR "partial" : KERN_INFO "incomplete",
  			       bvec->bv_offset, bvec->bv_len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2367

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2368
2369
  		start = page_offset(page);
  		end = start + bvec->bv_offset + bvec->bv_len - 1;
facc8a224   Miao Xie   Btrfs: don't cach...
2370
  		len = bvec->bv_len;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2371

4125bf761   Chris Mason   Btrfs: finish rea...
2372
  		if (++bvec <= bvec_end)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2373
  			prefetchw(&bvec->bv_page->flags);
9be3395bc   Chris Mason   Btrfs: use a btrf...
2374
  		mirror = io_bio->mirror_num;
f2a09da9d   Miao Xie   Btrfs: add branch...
2375
2376
  		if (likely(uptodate && tree->ops &&
  			   tree->ops->readpage_end_io_hook)) {
facc8a224   Miao Xie   Btrfs: don't cach...
2377
2378
2379
  			ret = tree->ops->readpage_end_io_hook(io_bio, offset,
  							      page, start, end,
  							      mirror);
5ee0844d6   Stefan Behrens   Btrfs: revert che...
2380
  			if (ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2381
  				uptodate = 0;
5ee0844d6   Stefan Behrens   Btrfs: revert che...
2382
  			else
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2383
  				clean_io_failure(start, page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2384
  		}
ea4667940   Josef Bacik   Btrfs: deal with ...
2385

f2a09da9d   Miao Xie   Btrfs: add branch...
2386
2387
2388
2389
  		if (likely(uptodate))
  			goto readpage_ok;
  
  		if (tree->ops && tree->ops->readpage_io_failed_hook) {
5cf1ab561   Josef Bacik   Btrfs: always sto...
2390
  			ret = tree->ops->readpage_io_failed_hook(page, mirror);
ea4667940   Josef Bacik   Btrfs: deal with ...
2391
2392
2393
  			if (!ret && !err &&
  			    test_bit(BIO_UPTODATE, &bio->bi_flags))
  				uptodate = 1;
f2a09da9d   Miao Xie   Btrfs: add branch...
2394
  		} else {
f4a8e6563   Jan Schmidt   Btrfs: fix meta d...
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
  			/*
  			 * The generic bio_readpage_error handles errors the
  			 * following way: If possible, new read requests are
  			 * created and submitted and will end up in
  			 * end_bio_extent_readpage as well (if we're lucky, not
  			 * in the !uptodate case). In that case it returns 0 and
  			 * we just go on with the next page in our bio. If it
  			 * can't handle the error it will return -EIO and we
  			 * remain responsible for that page.
  			 */
facc8a224   Miao Xie   Btrfs: don't cach...
2405
2406
  			ret = bio_readpage_error(bio, offset, page, start, end,
  						 mirror);
7e38326f5   Chris Mason   Btrfs: Handle che...
2407
  			if (ret == 0) {
3b951516e   Chris Mason   Btrfs: Use the ex...
2408
2409
  				uptodate =
  					test_bit(BIO_UPTODATE, &bio->bi_flags);
d20f7043f   Chris Mason   Btrfs: move data ...
2410
2411
  				if (err)
  					uptodate = 0;
8f543e818   Liu Bo   Btrfs: fix crash ...
2412
  				offset += len;
7e38326f5   Chris Mason   Btrfs: Handle che...
2413
2414
2415
  				continue;
  			}
  		}
f2a09da9d   Miao Xie   Btrfs: add branch...
2416
  readpage_ok:
883d0de48   Miao Xie   Btrfs: batch the ...
2417
  		if (likely(uptodate)) {
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2418
2419
2420
2421
2422
2423
2424
2425
  			loff_t i_size = i_size_read(inode);
  			pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
  			unsigned offset;
  
  			/* Zero out the end if this page straddles i_size */
  			offset = i_size & (PAGE_CACHE_SIZE-1);
  			if (page->index == end_index && offset)
  				zero_user_segment(page, offset, PAGE_CACHE_SIZE);
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2426
  			SetPageUptodate(page);
70dec8079   Chris Mason   Btrfs: extent_io ...
2427
  		} else {
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2428
2429
  			ClearPageUptodate(page);
  			SetPageError(page);
70dec8079   Chris Mason   Btrfs: extent_io ...
2430
  		}
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2431
  		unlock_page(page);
facc8a224   Miao Xie   Btrfs: don't cach...
2432
  		offset += len;
883d0de48   Miao Xie   Btrfs: batch the ...
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
  
  		if (unlikely(!uptodate)) {
  			if (extent_len) {
  				endio_readpage_release_extent(tree,
  							      extent_start,
  							      extent_len, 1);
  				extent_start = 0;
  				extent_len = 0;
  			}
  			endio_readpage_release_extent(tree, start,
  						      end - start + 1, 0);
  		} else if (!extent_len) {
  			extent_start = start;
  			extent_len = end + 1 - start;
  		} else if (extent_start + extent_len == start) {
  			extent_len += end + 1 - start;
  		} else {
  			endio_readpage_release_extent(tree, extent_start,
  						      extent_len, uptodate);
  			extent_start = start;
  			extent_len = end + 1 - start;
  		}
4125bf761   Chris Mason   Btrfs: finish rea...
2455
  	} while (bvec <= bvec_end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2456

883d0de48   Miao Xie   Btrfs: batch the ...
2457
2458
2459
  	if (extent_len)
  		endio_readpage_release_extent(tree, extent_start, extent_len,
  					      uptodate);
facc8a224   Miao Xie   Btrfs: don't cach...
2460
2461
  	if (io_bio->end_io)
  		io_bio->end_io(io_bio, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2462
  	bio_put(bio);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2463
  }
9be3395bc   Chris Mason   Btrfs: use a btrf...
2464
2465
2466
2467
  /*
   * this allocates from the btrfs_bioset.  We're returning a bio right now
   * but you can call btrfs_io_bio for the appropriate container_of magic
   */
88f794ede   Miao Xie   btrfs: cleanup du...
2468
2469
2470
  struct bio *
  btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
  		gfp_t gfp_flags)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2471
  {
facc8a224   Miao Xie   Btrfs: don't cach...
2472
  	struct btrfs_io_bio *btrfs_bio;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2473
  	struct bio *bio;
9be3395bc   Chris Mason   Btrfs: use a btrf...
2474
  	bio = bio_alloc_bioset(gfp_flags, nr_vecs, btrfs_bioset);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2475
2476
  
  	if (bio == NULL && (current->flags & PF_MEMALLOC)) {
9be3395bc   Chris Mason   Btrfs: use a btrf...
2477
2478
2479
2480
  		while (!bio && (nr_vecs /= 2)) {
  			bio = bio_alloc_bioset(gfp_flags,
  					       nr_vecs, btrfs_bioset);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2481
2482
2483
  	}
  
  	if (bio) {
e1c4b7451   Chris Mason   Fix btrfs_get_ext...
2484
  		bio->bi_size = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2485
2486
  		bio->bi_bdev = bdev;
  		bio->bi_sector = first_sector;
facc8a224   Miao Xie   Btrfs: don't cach...
2487
2488
2489
2490
  		btrfs_bio = btrfs_io_bio(bio);
  		btrfs_bio->csum = NULL;
  		btrfs_bio->csum_allocated = NULL;
  		btrfs_bio->end_io = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2491
2492
2493
  	}
  	return bio;
  }
9be3395bc   Chris Mason   Btrfs: use a btrf...
2494
2495
2496
2497
2498
2499
2500
2501
2502
  struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask)
  {
  	return bio_clone_bioset(bio, gfp_mask, btrfs_bioset);
  }
  
  
  /* this also allocates from the btrfs_bioset */
  struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
  {
facc8a224   Miao Xie   Btrfs: don't cach...
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
  	struct btrfs_io_bio *btrfs_bio;
  	struct bio *bio;
  
  	bio = bio_alloc_bioset(gfp_mask, nr_iovecs, btrfs_bioset);
  	if (bio) {
  		btrfs_bio = btrfs_io_bio(bio);
  		btrfs_bio->csum = NULL;
  		btrfs_bio->csum_allocated = NULL;
  		btrfs_bio->end_io = NULL;
  	}
  	return bio;
9be3395bc   Chris Mason   Btrfs: use a btrf...
2514
  }
355808c29   Jeff Mahoney   btrfs: ->submit_b...
2515
2516
  static int __must_check submit_one_bio(int rw, struct bio *bio,
  				       int mirror_num, unsigned long bio_flags)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2517
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2518
  	int ret = 0;
70dec8079   Chris Mason   Btrfs: extent_io ...
2519
2520
2521
  	struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
  	struct page *page = bvec->bv_page;
  	struct extent_io_tree *tree = bio->bi_private;
70dec8079   Chris Mason   Btrfs: extent_io ...
2522
  	u64 start;
70dec8079   Chris Mason   Btrfs: extent_io ...
2523

4eee4fa4f   Miao Xie   Btrfs: use wrappe...
2524
  	start = page_offset(page) + bvec->bv_offset;
70dec8079   Chris Mason   Btrfs: extent_io ...
2525

902b22f34   David Woodhouse   Btrfs: Remove bro...
2526
  	bio->bi_private = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2527
2528
  
  	bio_get(bio);
065631f6d   Chris Mason   Btrfs: checksum f...
2529
  	if (tree->ops && tree->ops->submit_bio_hook)
6b82ce8d8   liubo   btrfs: fix unchec...
2530
  		ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio,
eaf25d933   Chris Mason   Btrfs: use async ...
2531
  					   mirror_num, bio_flags, start);
0b86a832a   Chris Mason   Btrfs: Add suppor...
2532
  	else
21adbd5cb   Stefan Behrens   Btrfs: integrate ...
2533
  		btrfsic_submit_bio(rw, bio);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2534

d1310b2e0   Chris Mason   Btrfs: Split the ...
2535
2536
2537
2538
2539
  	if (bio_flagged(bio, BIO_EOPNOTSUPP))
  		ret = -EOPNOTSUPP;
  	bio_put(bio);
  	return ret;
  }
64a167011   David Woodhouse   Btrfs: add rw arg...
2540
  static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page,
3444a9725   Jeff Mahoney   btrfs: Factor out...
2541
2542
2543
2544
2545
  		     unsigned long offset, size_t size, struct bio *bio,
  		     unsigned long bio_flags)
  {
  	int ret = 0;
  	if (tree->ops && tree->ops->merge_bio_hook)
64a167011   David Woodhouse   Btrfs: add rw arg...
2546
  		ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio,
3444a9725   Jeff Mahoney   btrfs: Factor out...
2547
2548
2549
2550
2551
  						bio_flags);
  	BUG_ON(ret < 0);
  	return ret;
  
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2552
2553
2554
2555
2556
2557
  static int submit_extent_page(int rw, struct extent_io_tree *tree,
  			      struct page *page, sector_t sector,
  			      size_t size, unsigned long offset,
  			      struct block_device *bdev,
  			      struct bio **bio_ret,
  			      unsigned long max_pages,
f188591e9   Chris Mason   Btrfs: Retry meta...
2558
  			      bio_end_io_t end_io_func,
c8b978188   Chris Mason   Btrfs: Add zlib c...
2559
2560
2561
  			      int mirror_num,
  			      unsigned long prev_bio_flags,
  			      unsigned long bio_flags)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2562
2563
2564
2565
  {
  	int ret = 0;
  	struct bio *bio;
  	int nr;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2566
2567
2568
  	int contig = 0;
  	int this_compressed = bio_flags & EXTENT_BIO_COMPRESSED;
  	int old_compressed = prev_bio_flags & EXTENT_BIO_COMPRESSED;
5b050f04c   Chris Mason   Btrfs: Fix compil...
2569
  	size_t page_size = min_t(size_t, size, PAGE_CACHE_SIZE);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2570
2571
2572
  
  	if (bio_ret && *bio_ret) {
  		bio = *bio_ret;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2573
2574
2575
  		if (old_compressed)
  			contig = bio->bi_sector == sector;
  		else
f73a1c7d1   Kent Overstreet   block: Add bio_en...
2576
  			contig = bio_end_sector(bio) == sector;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2577
2578
  
  		if (prev_bio_flags != bio_flags || !contig ||
64a167011   David Woodhouse   Btrfs: add rw arg...
2579
  		    merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) ||
c8b978188   Chris Mason   Btrfs: Add zlib c...
2580
2581
2582
  		    bio_add_page(bio, page, page_size, offset) < page_size) {
  			ret = submit_one_bio(rw, bio, mirror_num,
  					     prev_bio_flags);
79787eaab   Jeff Mahoney   btrfs: replace ma...
2583
2584
  			if (ret < 0)
  				return ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2585
2586
2587
2588
2589
  			bio = NULL;
  		} else {
  			return 0;
  		}
  	}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2590
2591
2592
2593
  	if (this_compressed)
  		nr = BIO_MAX_PAGES;
  	else
  		nr = bio_get_nr_vecs(bdev);
88f794ede   Miao Xie   btrfs: cleanup du...
2594
  	bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH);
5df670834   Tsutomu Itoh   btrfs: checking N...
2595
2596
  	if (!bio)
  		return -ENOMEM;
70dec8079   Chris Mason   Btrfs: extent_io ...
2597

c8b978188   Chris Mason   Btrfs: Add zlib c...
2598
  	bio_add_page(bio, page, page_size, offset);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2599
2600
  	bio->bi_end_io = end_io_func;
  	bio->bi_private = tree;
70dec8079   Chris Mason   Btrfs: extent_io ...
2601

d397712bc   Chris Mason   Btrfs: Fix checkp...
2602
  	if (bio_ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2603
  		*bio_ret = bio;
d397712bc   Chris Mason   Btrfs: Fix checkp...
2604
  	else
c8b978188   Chris Mason   Btrfs: Add zlib c...
2605
  		ret = submit_one_bio(rw, bio, mirror_num, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2606
2607
2608
  
  	return ret;
  }
48a3b6366   Eric Sandeen   btrfs: make stati...
2609
2610
  static void attach_extent_buffer_page(struct extent_buffer *eb,
  				      struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2611
2612
2613
  {
  	if (!PagePrivate(page)) {
  		SetPagePrivate(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2614
  		page_cache_get(page);
4f2de97ac   Josef Bacik   Btrfs: set page->...
2615
2616
2617
  		set_page_private(page, (unsigned long)eb);
  	} else {
  		WARN_ON(page->private != (unsigned long)eb);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2618
2619
  	}
  }
4f2de97ac   Josef Bacik   Btrfs: set page->...
2620
  void set_page_extent_mapped(struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2621
  {
4f2de97ac   Josef Bacik   Btrfs: set page->...
2622
2623
2624
2625
2626
  	if (!PagePrivate(page)) {
  		SetPagePrivate(page);
  		page_cache_get(page);
  		set_page_private(page, EXTENT_PAGE_PRIVATE);
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2627
  }
125bac016   Miao Xie   Btrfs: cache the ...
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
  static struct extent_map *
  __get_extent_map(struct inode *inode, struct page *page, size_t pg_offset,
  		 u64 start, u64 len, get_extent_t *get_extent,
  		 struct extent_map **em_cached)
  {
  	struct extent_map *em;
  
  	if (em_cached && *em_cached) {
  		em = *em_cached;
  		if (em->in_tree && start >= em->start &&
  		    start < extent_map_end(em)) {
  			atomic_inc(&em->refs);
  			return em;
  		}
  
  		free_extent_map(em);
  		*em_cached = NULL;
  	}
  
  	em = get_extent(inode, page, pg_offset, start, len, 0);
  	if (em_cached && !IS_ERR_OR_NULL(em)) {
  		BUG_ON(*em_cached);
  		atomic_inc(&em->refs);
  		*em_cached = em;
  	}
  	return em;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2655
2656
2657
2658
  /*
   * basic readpage implementation.  Locked extent state structs are inserted
   * into the tree that are removed when the IO is done (by the end_io
   * handlers)
79787eaab   Jeff Mahoney   btrfs: replace ma...
2659
   * XXX JDM: This needs looking at to ensure proper page locking
d1310b2e0   Chris Mason   Btrfs: Split the ...
2660
   */
9974090bd   Miao Xie   Btrfs: batch the ...
2661
2662
2663
  static int __do_readpage(struct extent_io_tree *tree,
  			 struct page *page,
  			 get_extent_t *get_extent,
125bac016   Miao Xie   Btrfs: cache the ...
2664
  			 struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
2665
2666
  			 struct bio **bio, int mirror_num,
  			 unsigned long *bio_flags, int rw)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2667
2668
  {
  	struct inode *inode = page->mapping->host;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
2669
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
  	u64 page_end = start + PAGE_CACHE_SIZE - 1;
  	u64 end;
  	u64 cur = start;
  	u64 extent_offset;
  	u64 last_byte = i_size_read(inode);
  	u64 block_start;
  	u64 cur_end;
  	sector_t sector;
  	struct extent_map *em;
  	struct block_device *bdev;
  	int ret;
  	int nr = 0;
4b384318a   Mark Fasheh   btrfs: Introduce ...
2682
  	int parent_locked = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
306e16ce1   David Sterba   btrfs: rename var...
2683
  	size_t pg_offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2684
  	size_t iosize;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2685
  	size_t disk_io_size;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2686
  	size_t blocksize = inode->i_sb->s_blocksize;
4b384318a   Mark Fasheh   btrfs: Introduce ...
2687
  	unsigned long this_bio_flag = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2688
2689
  
  	set_page_extent_mapped(page);
9974090bd   Miao Xie   Btrfs: batch the ...
2690
  	end = page_end;
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2691
2692
2693
  	if (!PageUptodate(page)) {
  		if (cleancache_get_page(page) == 0) {
  			BUG_ON(blocksize != PAGE_SIZE);
9974090bd   Miao Xie   Btrfs: batch the ...
2694
  			unlock_extent(tree, start, end);
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2695
2696
2697
  			goto out;
  		}
  	}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2698
2699
2700
2701
2702
2703
  	if (page->index == last_byte >> PAGE_CACHE_SHIFT) {
  		char *userpage;
  		size_t zero_offset = last_byte & (PAGE_CACHE_SIZE - 1);
  
  		if (zero_offset) {
  			iosize = PAGE_CACHE_SIZE - zero_offset;
7ac687d9e   Cong Wang   btrfs: remove the...
2704
  			userpage = kmap_atomic(page);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2705
2706
  			memset(userpage + zero_offset, 0, iosize);
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2707
  			kunmap_atomic(userpage);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2708
2709
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2710
  	while (cur <= end) {
c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2711
  		unsigned long pnr = (last_byte >> PAGE_CACHE_SHIFT) + 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2712
2713
  		if (cur >= last_byte) {
  			char *userpage;
507903b81   Arne Jansen   btrfs: using cach...
2714
  			struct extent_state *cached = NULL;
306e16ce1   David Sterba   btrfs: rename var...
2715
  			iosize = PAGE_CACHE_SIZE - pg_offset;
7ac687d9e   Cong Wang   btrfs: remove the...
2716
  			userpage = kmap_atomic(page);
306e16ce1   David Sterba   btrfs: rename var...
2717
  			memset(userpage + pg_offset, 0, iosize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2718
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2719
  			kunmap_atomic(userpage);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2720
  			set_extent_uptodate(tree, cur, cur + iosize - 1,
507903b81   Arne Jansen   btrfs: using cach...
2721
  					    &cached, GFP_NOFS);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2722
2723
2724
2725
  			if (!parent_locked)
  				unlock_extent_cached(tree, cur,
  						     cur + iosize - 1,
  						     &cached, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2726
2727
  			break;
  		}
125bac016   Miao Xie   Btrfs: cache the ...
2728
2729
  		em = __get_extent_map(inode, page, pg_offset, cur,
  				      end - cur + 1, get_extent, em_cached);
c704005d8   David Sterba   btrfs: unify chec...
2730
  		if (IS_ERR_OR_NULL(em)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2731
  			SetPageError(page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2732
2733
  			if (!parent_locked)
  				unlock_extent(tree, cur, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2734
2735
  			break;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2736
2737
2738
  		extent_offset = cur - em->start;
  		BUG_ON(extent_map_end(em) <= cur);
  		BUG_ON(end < cur);
261507a02   Li Zefan   btrfs: Allow to a...
2739
  		if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) {
4b384318a   Mark Fasheh   btrfs: Introduce ...
2740
  			this_bio_flag |= EXTENT_BIO_COMPRESSED;
261507a02   Li Zefan   btrfs: Allow to a...
2741
2742
2743
  			extent_set_compress_type(&this_bio_flag,
  						 em->compress_type);
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2744

d1310b2e0   Chris Mason   Btrfs: Split the ...
2745
2746
  		iosize = min(extent_map_end(em) - cur, end - cur + 1);
  		cur_end = min(extent_map_end(em) - 1, end);
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
2747
  		iosize = ALIGN(iosize, blocksize);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2748
2749
2750
2751
2752
2753
2754
  		if (this_bio_flag & EXTENT_BIO_COMPRESSED) {
  			disk_io_size = em->block_len;
  			sector = em->block_start >> 9;
  		} else {
  			sector = (em->block_start + extent_offset) >> 9;
  			disk_io_size = iosize;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2755
2756
  		bdev = em->bdev;
  		block_start = em->block_start;
d899e0521   Yan Zheng   Btrfs: Add falloc...
2757
2758
  		if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
  			block_start = EXTENT_MAP_HOLE;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2759
2760
2761
2762
2763
2764
  		free_extent_map(em);
  		em = NULL;
  
  		/* we've found a hole, just zero and go on */
  		if (block_start == EXTENT_MAP_HOLE) {
  			char *userpage;
507903b81   Arne Jansen   btrfs: using cach...
2765
  			struct extent_state *cached = NULL;
7ac687d9e   Cong Wang   btrfs: remove the...
2766
  			userpage = kmap_atomic(page);
306e16ce1   David Sterba   btrfs: rename var...
2767
  			memset(userpage + pg_offset, 0, iosize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2768
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2769
  			kunmap_atomic(userpage);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2770
2771
  
  			set_extent_uptodate(tree, cur, cur + iosize - 1,
507903b81   Arne Jansen   btrfs: using cach...
2772
2773
2774
  					    &cached, GFP_NOFS);
  			unlock_extent_cached(tree, cur, cur + iosize - 1,
  			                     &cached, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2775
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2776
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2777
2778
2779
  			continue;
  		}
  		/* the get_extent function already copied into the page */
9655d2982   Chris Mason   Btrfs: use a cach...
2780
2781
  		if (test_range_bit(tree, cur, cur_end,
  				   EXTENT_UPTODATE, 1, NULL)) {
a1b32a593   Chris Mason   Btrfs: Add debugg...
2782
  			check_page_uptodate(tree, page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2783
2784
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2785
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2786
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2787
2788
  			continue;
  		}
70dec8079   Chris Mason   Btrfs: extent_io ...
2789
2790
2791
2792
2793
  		/* we have an inline extent but it didn't get marked up
  		 * to date.  Error out
  		 */
  		if (block_start == EXTENT_MAP_INLINE) {
  			SetPageError(page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2794
2795
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
70dec8079   Chris Mason   Btrfs: extent_io ...
2796
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2797
  			pg_offset += iosize;
70dec8079   Chris Mason   Btrfs: extent_io ...
2798
2799
  			continue;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2800

c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2801
  		pnr -= page->index;
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
2802
  		ret = submit_extent_page(rw, tree, page,
306e16ce1   David Sterba   btrfs: rename var...
2803
  					 sector, disk_io_size, pg_offset,
89642229a   Chris Mason   Btrfs: Search dat...
2804
  					 bdev, bio, pnr,
c8b978188   Chris Mason   Btrfs: Add zlib c...
2805
2806
2807
  					 end_bio_extent_readpage, mirror_num,
  					 *bio_flags,
  					 this_bio_flag);
c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2808
2809
2810
2811
  		if (!ret) {
  			nr++;
  			*bio_flags = this_bio_flag;
  		} else {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2812
  			SetPageError(page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2813
2814
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
edd33c99c   Josef Bacik   Btrfs: don't bug ...
2815
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2816
  		cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2817
  		pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2818
  	}
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2819
  out:
d1310b2e0   Chris Mason   Btrfs: Split the ...
2820
2821
2822
2823
2824
2825
2826
  	if (!nr) {
  		if (!PageError(page))
  			SetPageUptodate(page);
  		unlock_page(page);
  	}
  	return 0;
  }
9974090bd   Miao Xie   Btrfs: batch the ...
2827
2828
2829
2830
  static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
  					     struct page *pages[], int nr_pages,
  					     u64 start, u64 end,
  					     get_extent_t *get_extent,
125bac016   Miao Xie   Btrfs: cache the ...
2831
  					     struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
  					     struct bio **bio, int mirror_num,
  					     unsigned long *bio_flags, int rw)
  {
  	struct inode *inode;
  	struct btrfs_ordered_extent *ordered;
  	int index;
  
  	inode = pages[0]->mapping->host;
  	while (1) {
  		lock_extent(tree, start, end);
  		ordered = btrfs_lookup_ordered_range(inode, start,
  						     end - start + 1);
  		if (!ordered)
  			break;
  		unlock_extent(tree, start, end);
  		btrfs_start_ordered_extent(inode, ordered, 1);
  		btrfs_put_ordered_extent(ordered);
  	}
  
  	for (index = 0; index < nr_pages; index++) {
125bac016   Miao Xie   Btrfs: cache the ...
2852
2853
  		__do_readpage(tree, pages[index], get_extent, em_cached, bio,
  			      mirror_num, bio_flags, rw);
9974090bd   Miao Xie   Btrfs: batch the ...
2854
2855
2856
2857
2858
2859
2860
  		page_cache_release(pages[index]);
  	}
  }
  
  static void __extent_readpages(struct extent_io_tree *tree,
  			       struct page *pages[],
  			       int nr_pages, get_extent_t *get_extent,
125bac016   Miao Xie   Btrfs: cache the ...
2861
  			       struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
2862
2863
2864
  			       struct bio **bio, int mirror_num,
  			       unsigned long *bio_flags, int rw)
  {
35a3621be   Stefan Behrens   Btrfs: get rid of...
2865
  	u64 start = 0;
9974090bd   Miao Xie   Btrfs: batch the ...
2866
2867
2868
  	u64 end = 0;
  	u64 page_start;
  	int index;
35a3621be   Stefan Behrens   Btrfs: get rid of...
2869
  	int first_index = 0;
9974090bd   Miao Xie   Btrfs: batch the ...
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
  
  	for (index = 0; index < nr_pages; index++) {
  		page_start = page_offset(pages[index]);
  		if (!end) {
  			start = page_start;
  			end = start + PAGE_CACHE_SIZE - 1;
  			first_index = index;
  		} else if (end + 1 == page_start) {
  			end += PAGE_CACHE_SIZE;
  		} else {
  			__do_contiguous_readpages(tree, &pages[first_index],
  						  index - first_index, start,
125bac016   Miao Xie   Btrfs: cache the ...
2882
2883
2884
  						  end, get_extent, em_cached,
  						  bio, mirror_num, bio_flags,
  						  rw);
9974090bd   Miao Xie   Btrfs: batch the ...
2885
2886
2887
2888
2889
2890
2891
2892
2893
  			start = page_start;
  			end = start + PAGE_CACHE_SIZE - 1;
  			first_index = index;
  		}
  	}
  
  	if (end)
  		__do_contiguous_readpages(tree, &pages[first_index],
  					  index - first_index, start,
125bac016   Miao Xie   Btrfs: cache the ...
2894
  					  end, get_extent, em_cached, bio,
9974090bd   Miao Xie   Btrfs: batch the ...
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
  					  mirror_num, bio_flags, rw);
  }
  
  static int __extent_read_full_page(struct extent_io_tree *tree,
  				   struct page *page,
  				   get_extent_t *get_extent,
  				   struct bio **bio, int mirror_num,
  				   unsigned long *bio_flags, int rw)
  {
  	struct inode *inode = page->mapping->host;
  	struct btrfs_ordered_extent *ordered;
  	u64 start = page_offset(page);
  	u64 end = start + PAGE_CACHE_SIZE - 1;
  	int ret;
  
  	while (1) {
  		lock_extent(tree, start, end);
  		ordered = btrfs_lookup_ordered_extent(inode, start);
  		if (!ordered)
  			break;
  		unlock_extent(tree, start, end);
  		btrfs_start_ordered_extent(inode, ordered, 1);
  		btrfs_put_ordered_extent(ordered);
  	}
125bac016   Miao Xie   Btrfs: cache the ...
2919
2920
  	ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num,
  			    bio_flags, rw);
9974090bd   Miao Xie   Btrfs: batch the ...
2921
2922
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2923
  int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
2924
  			    get_extent_t *get_extent, int mirror_num)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2925
2926
  {
  	struct bio *bio = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2927
  	unsigned long bio_flags = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2928
  	int ret;
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
2929
  	ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num,
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
2930
  				      &bio_flags, READ);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2931
  	if (bio)
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
2932
  		ret = submit_one_bio(READ, bio, mirror_num, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2933
2934
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2935

4b384318a   Mark Fasheh   btrfs: Introduce ...
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
  int extent_read_full_page_nolock(struct extent_io_tree *tree, struct page *page,
  				 get_extent_t *get_extent, int mirror_num)
  {
  	struct bio *bio = NULL;
  	unsigned long bio_flags = EXTENT_BIO_PARENT_LOCKED;
  	int ret;
  
  	ret = __do_readpage(tree, page, get_extent, NULL, &bio, mirror_num,
  				      &bio_flags, READ);
  	if (bio)
  		ret = submit_one_bio(READ, bio, mirror_num, bio_flags);
  	return ret;
  }
11c8349b4   Chris Mason   Btrfs: fix oops o...
2949
2950
2951
2952
2953
2954
2955
2956
2957
  static noinline void update_nr_written(struct page *page,
  				      struct writeback_control *wbc,
  				      unsigned long nr_written)
  {
  	wbc->nr_to_write -= nr_written;
  	if (wbc->range_cyclic || (wbc->nr_to_write > 0 &&
  	    wbc->range_start == 0 && wbc->range_end == LLONG_MAX))
  		page->mapping->writeback_index = page->index + nr_written;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
  /*
   * the writepage semantics are similar to regular writepage.  extent
   * records are inserted to lock ranges in the tree, and as dirty areas
   * are found, they are marked writeback.  Then the lock bits are removed
   * and the end_io handler clears the writeback ranges
   */
  static int __extent_writepage(struct page *page, struct writeback_control *wbc,
  			      void *data)
  {
  	struct inode *inode = page->mapping->host;
  	struct extent_page_data *epd = data;
  	struct extent_io_tree *tree = epd->tree;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
2970
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2971
2972
2973
2974
2975
2976
2977
2978
2979
  	u64 delalloc_start;
  	u64 page_end = start + PAGE_CACHE_SIZE - 1;
  	u64 end;
  	u64 cur = start;
  	u64 extent_offset;
  	u64 last_byte = i_size_read(inode);
  	u64 block_start;
  	u64 iosize;
  	sector_t sector;
2c64c53d8   Chris Mason   Btrfs: cache valu...
2980
  	struct extent_state *cached_state = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2981
2982
2983
2984
  	struct extent_map *em;
  	struct block_device *bdev;
  	int ret;
  	int nr = 0;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
2985
  	size_t pg_offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2986
2987
2988
2989
2990
  	size_t blocksize;
  	loff_t i_size = i_size_read(inode);
  	unsigned long end_index = i_size >> PAGE_CACHE_SHIFT;
  	u64 nr_delalloc;
  	u64 delalloc_end;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2991
2992
  	int page_started;
  	int compressed;
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
2993
  	int write_flags;
771ed689d   Chris Mason   Btrfs: Optimize c...
2994
  	unsigned long nr_written = 0;
9e4871070   Josef Bacik   Btrfs: skip looki...
2995
  	bool fill_delalloc = true;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2996

ffbd517d5   Chris Mason   Btrfs: use WRITE_...
2997
  	if (wbc->sync_mode == WB_SYNC_ALL)
721a9602e   Jens Axboe   block: kill off R...
2998
  		write_flags = WRITE_SYNC;
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
2999
3000
  	else
  		write_flags = WRITE;
1abe9b8a1   liubo   Btrfs: add initia...
3001
  	trace___extent_writepage(page, inode, wbc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3002
  	WARN_ON(!PageLocked(page));
bf0da8c18   Chris Mason   Btrfs: ClearPageE...
3003
3004
  
  	ClearPageError(page);
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3005
  	pg_offset = i_size & (PAGE_CACHE_SIZE - 1);
211c17f51   Chris Mason   Fix corners in wr...
3006
  	if (page->index > end_index ||
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3007
  	   (page->index == end_index && !pg_offset)) {
d47992f86   Lukas Czerner   mm: change invali...
3008
  		page->mapping->a_ops->invalidatepage(page, 0, PAGE_CACHE_SIZE);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3009
3010
3011
3012
3013
3014
  		unlock_page(page);
  		return 0;
  	}
  
  	if (page->index == end_index) {
  		char *userpage;
7ac687d9e   Cong Wang   btrfs: remove the...
3015
  		userpage = kmap_atomic(page);
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3016
3017
  		memset(userpage + pg_offset, 0,
  		       PAGE_CACHE_SIZE - pg_offset);
7ac687d9e   Cong Wang   btrfs: remove the...
3018
  		kunmap_atomic(userpage);
211c17f51   Chris Mason   Fix corners in wr...
3019
  		flush_dcache_page(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3020
  	}
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3021
  	pg_offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3022
3023
  
  	set_page_extent_mapped(page);
9e4871070   Josef Bacik   Btrfs: skip looki...
3024
3025
  	if (!tree->ops || !tree->ops->fill_delalloc)
  		fill_delalloc = false;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3026
3027
  	delalloc_start = start;
  	delalloc_end = 0;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3028
  	page_started = 0;
9e4871070   Josef Bacik   Btrfs: skip looki...
3029
  	if (!epd->extent_locked && fill_delalloc) {
f85d7d6c8   Chris Mason   Btrfs: properly h...
3030
  		u64 delalloc_to_write = 0;
11c8349b4   Chris Mason   Btrfs: fix oops o...
3031
3032
3033
3034
3035
  		/*
  		 * make sure the wbc mapping index is at least updated
  		 * to this page.
  		 */
  		update_nr_written(page, wbc, 0);
d397712bc   Chris Mason   Btrfs: Fix checkp...
3036
  		while (delalloc_end < page_end) {
771ed689d   Chris Mason   Btrfs: Optimize c...
3037
  			nr_delalloc = find_lock_delalloc_range(inode, tree,
c8b978188   Chris Mason   Btrfs: Add zlib c...
3038
3039
  						       page,
  						       &delalloc_start,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3040
3041
  						       &delalloc_end,
  						       128 * 1024 * 1024);
771ed689d   Chris Mason   Btrfs: Optimize c...
3042
3043
3044
3045
  			if (nr_delalloc == 0) {
  				delalloc_start = delalloc_end + 1;
  				continue;
  			}
013bd4c33   Tsutomu Itoh   Btrfs: fix return...
3046
3047
3048
3049
3050
  			ret = tree->ops->fill_delalloc(inode, page,
  						       delalloc_start,
  						       delalloc_end,
  						       &page_started,
  						       &nr_written);
79787eaab   Jeff Mahoney   btrfs: replace ma...
3051
3052
3053
3054
3055
  			/* File system has been set read-only */
  			if (ret) {
  				SetPageError(page);
  				goto done;
  			}
f85d7d6c8   Chris Mason   Btrfs: properly h...
3056
3057
3058
3059
3060
3061
3062
3063
  			/*
  			 * delalloc_end is already one less than the total
  			 * length, so we don't subtract one from
  			 * PAGE_CACHE_SIZE
  			 */
  			delalloc_to_write += (delalloc_end - delalloc_start +
  					      PAGE_CACHE_SIZE) >>
  					      PAGE_CACHE_SHIFT;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3064
  			delalloc_start = delalloc_end + 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3065
  		}
f85d7d6c8   Chris Mason   Btrfs: properly h...
3066
3067
3068
3069
3070
3071
3072
3073
  		if (wbc->nr_to_write < delalloc_to_write) {
  			int thresh = 8192;
  
  			if (delalloc_to_write < thresh * 2)
  				thresh = delalloc_to_write;
  			wbc->nr_to_write = min_t(u64, delalloc_to_write,
  						 thresh);
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
3074

771ed689d   Chris Mason   Btrfs: Optimize c...
3075
3076
3077
3078
3079
  		/* did the fill delalloc function already unlock and start
  		 * the IO?
  		 */
  		if (page_started) {
  			ret = 0;
11c8349b4   Chris Mason   Btrfs: fix oops o...
3080
3081
3082
3083
3084
3085
3086
  			/*
  			 * we've unlocked the page, so we can't update
  			 * the mapping's writeback index, just update
  			 * nr_to_write.
  			 */
  			wbc->nr_to_write -= nr_written;
  			goto done_unlocked;
771ed689d   Chris Mason   Btrfs: Optimize c...
3087
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
3088
  	}
247e743cb   Chris Mason   Btrfs: Use async ...
3089
  	if (tree->ops && tree->ops->writepage_start_hook) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
3090
3091
  		ret = tree->ops->writepage_start_hook(page, start,
  						      page_end);
87826df0e   Jeff Mahoney   btrfs: delalloc f...
3092
3093
3094
3095
3096
3097
  		if (ret) {
  			/* Fixup worker will requeue */
  			if (ret == -EBUSY)
  				wbc->pages_skipped++;
  			else
  				redirty_page_for_writepage(wbc, page);
11c8349b4   Chris Mason   Btrfs: fix oops o...
3098
  			update_nr_written(page, wbc, nr_written);
247e743cb   Chris Mason   Btrfs: Use async ...
3099
  			unlock_page(page);
771ed689d   Chris Mason   Btrfs: Optimize c...
3100
  			ret = 0;
11c8349b4   Chris Mason   Btrfs: fix oops o...
3101
  			goto done_unlocked;
247e743cb   Chris Mason   Btrfs: Use async ...
3102
3103
  		}
  	}
11c8349b4   Chris Mason   Btrfs: fix oops o...
3104
3105
3106
3107
3108
  	/*
  	 * we don't want to touch the inode after unlocking the page,
  	 * so we update the mapping writeback index now
  	 */
  	update_nr_written(page, wbc, nr_written + 1);
771ed689d   Chris Mason   Btrfs: Optimize c...
3109

d1310b2e0   Chris Mason   Btrfs: Split the ...
3110
  	end = page_end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3111
  	if (last_byte <= start) {
e6dcd2dc9   Chris Mason   Btrfs: New data=o...
3112
3113
3114
  		if (tree->ops && tree->ops->writepage_end_io_hook)
  			tree->ops->writepage_end_io_hook(page, start,
  							 page_end, NULL, 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3115
3116
  		goto done;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3117
3118
3119
3120
  	blocksize = inode->i_sb->s_blocksize;
  
  	while (cur <= end) {
  		if (cur >= last_byte) {
e6dcd2dc9   Chris Mason   Btrfs: New data=o...
3121
3122
3123
  			if (tree->ops && tree->ops->writepage_end_io_hook)
  				tree->ops->writepage_end_io_hook(page, cur,
  							 page_end, NULL, 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3124
3125
  			break;
  		}
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3126
  		em = epd->get_extent(inode, page, pg_offset, cur,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3127
  				     end - cur + 1, 1);
c704005d8   David Sterba   btrfs: unify chec...
3128
  		if (IS_ERR_OR_NULL(em)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3129
3130
3131
3132
3133
3134
3135
3136
  			SetPageError(page);
  			break;
  		}
  
  		extent_offset = cur - em->start;
  		BUG_ON(extent_map_end(em) <= cur);
  		BUG_ON(end < cur);
  		iosize = min(extent_map_end(em) - cur, end - cur + 1);
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
3137
  		iosize = ALIGN(iosize, blocksize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3138
3139
3140
  		sector = (em->block_start + extent_offset) >> 9;
  		bdev = em->bdev;
  		block_start = em->block_start;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3141
  		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3142
3143
  		free_extent_map(em);
  		em = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3144
3145
3146
3147
3148
  		/*
  		 * compressed and inline extents are written through other
  		 * paths in the FS
  		 */
  		if (compressed || block_start == EXTENT_MAP_HOLE ||
d1310b2e0   Chris Mason   Btrfs: Split the ...
3149
  		    block_start == EXTENT_MAP_INLINE) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
3150
3151
3152
3153
3154
3155
  			/*
  			 * end_io notification does not happen here for
  			 * compressed extents
  			 */
  			if (!compressed && tree->ops &&
  			    tree->ops->writepage_end_io_hook)
e6dcd2dc9   Chris Mason   Btrfs: New data=o...
3156
3157
3158
  				tree->ops->writepage_end_io_hook(page, cur,
  							 cur + iosize - 1,
  							 NULL, 1);
c8b978188   Chris Mason   Btrfs: Add zlib c...
3159
3160
3161
3162
3163
3164
3165
3166
3167
  			else if (compressed) {
  				/* we don't want to end_page_writeback on
  				 * a compressed extent.  this happens
  				 * elsewhere
  				 */
  				nr++;
  			}
  
  			cur += iosize;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3168
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3169
3170
  			continue;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3171
3172
  		/* leave this out until we have a page_mkwrite call */
  		if (0 && !test_range_bit(tree, cur, cur + iosize - 1,
9655d2982   Chris Mason   Btrfs: use a cach...
3173
  				   EXTENT_DIRTY, 0, NULL)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3174
  			cur = cur + iosize;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3175
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3176
3177
  			continue;
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
3178

d1310b2e0   Chris Mason   Btrfs: Split the ...
3179
3180
3181
3182
3183
3184
  		if (tree->ops && tree->ops->writepage_io_hook) {
  			ret = tree->ops->writepage_io_hook(page, cur,
  						cur + iosize - 1);
  		} else {
  			ret = 0;
  		}
1259ab75c   Chris Mason   Btrfs: Handle wri...
3185
  		if (ret) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3186
  			SetPageError(page);
1259ab75c   Chris Mason   Btrfs: Handle wri...
3187
  		} else {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3188
  			unsigned long max_nr = end_index + 1;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3189

d1310b2e0   Chris Mason   Btrfs: Split the ...
3190
3191
  			set_range_writeback(tree, cur, cur + iosize - 1);
  			if (!PageWriteback(page)) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
3192
3193
3194
  				printk(KERN_ERR "btrfs warning page %lu not "
  				       "writeback, cur %llu end %llu
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
3195
  				       page->index, cur, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3196
  			}
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3197
3198
3199
  			ret = submit_extent_page(write_flags, tree, page,
  						 sector, iosize, pg_offset,
  						 bdev, &epd->bio, max_nr,
c8b978188   Chris Mason   Btrfs: Add zlib c...
3200
3201
  						 end_bio_extent_writepage,
  						 0, 0, 0);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3202
3203
3204
3205
  			if (ret)
  				SetPageError(page);
  		}
  		cur = cur + iosize;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3206
  		pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3207
3208
3209
3210
3211
3212
3213
3214
  		nr++;
  	}
  done:
  	if (nr == 0) {
  		/* make sure the mapping tag for page dirty gets cleared */
  		set_page_writeback(page);
  		end_page_writeback(page);
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3215
  	unlock_page(page);
771ed689d   Chris Mason   Btrfs: Optimize c...
3216

11c8349b4   Chris Mason   Btrfs: fix oops o...
3217
  done_unlocked:
2c64c53d8   Chris Mason   Btrfs: cache valu...
3218
3219
  	/* drop our reference on any cached states */
  	free_extent_state(cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3220
3221
  	return 0;
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3222
3223
3224
3225
3226
  static int eb_wait(void *word)
  {
  	io_schedule();
  	return 0;
  }
fd8b2b611   Josef Bacik   Btrfs: cleanup de...
3227
  void wait_on_extent_buffer_writeback(struct extent_buffer *eb)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
  {
  	wait_on_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK, eb_wait,
  		    TASK_UNINTERRUPTIBLE);
  }
  
  static int lock_extent_buffer_for_io(struct extent_buffer *eb,
  				     struct btrfs_fs_info *fs_info,
  				     struct extent_page_data *epd)
  {
  	unsigned long i, num_pages;
  	int flush = 0;
  	int ret = 0;
  
  	if (!btrfs_try_tree_write_lock(eb)) {
  		flush = 1;
  		flush_write_bio(epd);
  		btrfs_tree_lock(eb);
  	}
  
  	if (test_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags)) {
  		btrfs_tree_unlock(eb);
  		if (!epd->sync_io)
  			return 0;
  		if (!flush) {
  			flush_write_bio(epd);
  			flush = 1;
  		}
a098d8e8e   Chris Mason   Btrfs: loop waiti...
3255
3256
3257
3258
3259
  		while (1) {
  			wait_on_extent_buffer_writeback(eb);
  			btrfs_tree_lock(eb);
  			if (!test_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags))
  				break;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3260
  			btrfs_tree_unlock(eb);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3261
3262
  		}
  	}
51561ffec   Josef Bacik   Btrfs: lock the t...
3263
3264
3265
3266
3267
3268
  	/*
  	 * We need to do this to prevent races in people who check if the eb is
  	 * under IO since we can end up having no IO bits set for a short period
  	 * of time.
  	 */
  	spin_lock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3269
3270
  	if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) {
  		set_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
51561ffec   Josef Bacik   Btrfs: lock the t...
3271
  		spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3272
  		btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
e2d845211   Miao Xie   Btrfs: use percpu...
3273
3274
3275
  		__percpu_counter_add(&fs_info->dirty_metadata_bytes,
  				     -eb->len,
  				     fs_info->dirty_metadata_batch);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3276
  		ret = 1;
51561ffec   Josef Bacik   Btrfs: lock the t...
3277
3278
  	} else {
  		spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
  	}
  
  	btrfs_tree_unlock(eb);
  
  	if (!ret)
  		return ret;
  
  	num_pages = num_extent_pages(eb->start, eb->len);
  	for (i = 0; i < num_pages; i++) {
  		struct page *p = extent_buffer_page(eb, i);
  
  		if (!trylock_page(p)) {
  			if (!flush) {
  				flush_write_bio(epd);
  				flush = 1;
  			}
  			lock_page(p);
  		}
  	}
  
  	return ret;
  }
  
  static void end_extent_buffer_writeback(struct extent_buffer *eb)
  {
  	clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
  	smp_mb__after_clear_bit();
  	wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
  }
  
  static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
  {
  	int uptodate = err == 0;
  	struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
  	struct extent_buffer *eb;
  	int done;
  
  	do {
  		struct page *page = bvec->bv_page;
  
  		bvec--;
  		eb = (struct extent_buffer *)page->private;
  		BUG_ON(!eb);
  		done = atomic_dec_and_test(&eb->io_pages);
  
  		if (!uptodate || test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) {
  			set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
  			ClearPageUptodate(page);
  			SetPageError(page);
  		}
  
  		end_page_writeback(page);
  
  		if (!done)
  			continue;
  
  		end_extent_buffer_writeback(eb);
  	} while (bvec >= bio->bi_io_vec);
  
  	bio_put(bio);
  
  }
  
  static int write_one_eb(struct extent_buffer *eb,
  			struct btrfs_fs_info *fs_info,
  			struct writeback_control *wbc,
  			struct extent_page_data *epd)
  {
  	struct block_device *bdev = fs_info->fs_devices->latest_bdev;
  	u64 offset = eb->start;
  	unsigned long i, num_pages;
de0022b9d   Josef Bacik   Btrfs: do not asy...
3350
  	unsigned long bio_flags = 0;
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
3351
  	int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META;
d7dbe9e7f   Josef Bacik   Btrfs: fix compil...
3352
  	int ret = 0;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3353
3354
3355
3356
  
  	clear_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
  	num_pages = num_extent_pages(eb->start, eb->len);
  	atomic_set(&eb->io_pages, num_pages);
de0022b9d   Josef Bacik   Btrfs: do not asy...
3357
3358
  	if (btrfs_header_owner(eb) == BTRFS_TREE_LOG_OBJECTID)
  		bio_flags = EXTENT_BIO_TREE_LOG;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3359
3360
3361
3362
3363
3364
3365
3366
  	for (i = 0; i < num_pages; i++) {
  		struct page *p = extent_buffer_page(eb, i);
  
  		clear_page_dirty_for_io(p);
  		set_page_writeback(p);
  		ret = submit_extent_page(rw, eb->tree, p, offset >> 9,
  					 PAGE_CACHE_SIZE, 0, bdev, &epd->bio,
  					 -1, end_bio_extent_buffer_writepage,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3367
3368
  					 0, epd->bio_flags, bio_flags);
  		epd->bio_flags = bio_flags;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
  		if (ret) {
  			set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
  			SetPageError(p);
  			if (atomic_sub_and_test(num_pages - i, &eb->io_pages))
  				end_extent_buffer_writeback(eb);
  			ret = -EIO;
  			break;
  		}
  		offset += PAGE_CACHE_SIZE;
  		update_nr_written(p, wbc, 1);
  		unlock_page(p);
  	}
  
  	if (unlikely(ret)) {
  		for (; i < num_pages; i++) {
  			struct page *p = extent_buffer_page(eb, i);
  			unlock_page(p);
  		}
  	}
  
  	return ret;
  }
  
  int btree_write_cache_pages(struct address_space *mapping,
  				   struct writeback_control *wbc)
  {
  	struct extent_io_tree *tree = &BTRFS_I(mapping->host)->io_tree;
  	struct btrfs_fs_info *fs_info = BTRFS_I(mapping->host)->root->fs_info;
  	struct extent_buffer *eb, *prev_eb = NULL;
  	struct extent_page_data epd = {
  		.bio = NULL,
  		.tree = tree,
  		.extent_locked = 0,
  		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3403
  		.bio_flags = 0,
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
  	};
  	int ret = 0;
  	int done = 0;
  	int nr_to_write_done = 0;
  	struct pagevec pvec;
  	int nr_pages;
  	pgoff_t index;
  	pgoff_t end;		/* Inclusive */
  	int scanned = 0;
  	int tag;
  
  	pagevec_init(&pvec, 0);
  	if (wbc->range_cyclic) {
  		index = mapping->writeback_index; /* Start from prev offset */
  		end = -1;
  	} else {
  		index = wbc->range_start >> PAGE_CACHE_SHIFT;
  		end = wbc->range_end >> PAGE_CACHE_SHIFT;
  		scanned = 1;
  	}
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag = PAGECACHE_TAG_TOWRITE;
  	else
  		tag = PAGECACHE_TAG_DIRTY;
  retry:
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag_pages_for_writeback(mapping, index, end);
  	while (!done && !nr_to_write_done && (index <= end) &&
  	       (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, tag,
  			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
  		unsigned i;
  
  		scanned = 1;
  		for (i = 0; i < nr_pages; i++) {
  			struct page *page = pvec.pages[i];
  
  			if (!PagePrivate(page))
  				continue;
  
  			if (!wbc->range_cyclic && page->index > end) {
  				done = 1;
  				break;
  			}
b5bae2612   Josef Bacik   Btrfs: fix race w...
3447
3448
3449
3450
3451
  			spin_lock(&mapping->private_lock);
  			if (!PagePrivate(page)) {
  				spin_unlock(&mapping->private_lock);
  				continue;
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3452
  			eb = (struct extent_buffer *)page->private;
b5bae2612   Josef Bacik   Btrfs: fix race w...
3453
3454
3455
3456
3457
3458
  
  			/*
  			 * Shouldn't happen and normally this would be a BUG_ON
  			 * but no sense in crashing the users box for something
  			 * we can survive anyway.
  			 */
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3459
  			if (!eb) {
b5bae2612   Josef Bacik   Btrfs: fix race w...
3460
  				spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3461
3462
3463
  				WARN_ON(1);
  				continue;
  			}
b5bae2612   Josef Bacik   Btrfs: fix race w...
3464
3465
  			if (eb == prev_eb) {
  				spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3466
  				continue;
b5bae2612   Josef Bacik   Btrfs: fix race w...
3467
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3468

b5bae2612   Josef Bacik   Btrfs: fix race w...
3469
3470
3471
  			ret = atomic_inc_not_zero(&eb->refs);
  			spin_unlock(&mapping->private_lock);
  			if (!ret)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3472
  				continue;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
  
  			prev_eb = eb;
  			ret = lock_extent_buffer_for_io(eb, fs_info, &epd);
  			if (!ret) {
  				free_extent_buffer(eb);
  				continue;
  			}
  
  			ret = write_one_eb(eb, fs_info, wbc, &epd);
  			if (ret) {
  				done = 1;
  				free_extent_buffer(eb);
  				break;
  			}
  			free_extent_buffer(eb);
  
  			/*
  			 * the filesystem may choose to bump up nr_to_write.
  			 * We have to make sure to honor the new nr_to_write
  			 * at any time
  			 */
  			nr_to_write_done = wbc->nr_to_write <= 0;
  		}
  		pagevec_release(&pvec);
  		cond_resched();
  	}
  	if (!scanned && !done) {
  		/*
  		 * We hit the last page and there is more work to be done: wrap
  		 * back to the start of the file
  		 */
  		scanned = 1;
  		index = 0;
  		goto retry;
  	}
  	flush_write_bio(&epd);
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3511
  /**
4bef08485   Chris Mason   Btrfs: Tree loggi...
3512
   * write_cache_pages - walk the list of dirty pages of the given address space and write all of them.
d1310b2e0   Chris Mason   Btrfs: Split the ...
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
   * @mapping: address space structure to write
   * @wbc: subtract the number of written pages from *@wbc->nr_to_write
   * @writepage: function called for each page
   * @data: data passed to writepage function
   *
   * If a page is already under I/O, write_cache_pages() skips it, even
   * if it's dirty.  This is desirable behaviour for memory-cleaning writeback,
   * but it is INCORRECT for data-integrity system calls such as fsync().  fsync()
   * and msync() need to guarantee that all the data which was dirty at the time
   * the call was made get new I/O started against them.  If wbc->sync_mode is
   * WB_SYNC_ALL then we were called for data integrity and we must wait for
   * existing IO to complete.
   */
b2950863c   Christoph Hellwig   Btrfs: make thing...
3526
  static int extent_write_cache_pages(struct extent_io_tree *tree,
4bef08485   Chris Mason   Btrfs: Tree loggi...
3527
3528
  			     struct address_space *mapping,
  			     struct writeback_control *wbc,
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3529
3530
  			     writepage_t writepage, void *data,
  			     void (*flush_fn)(void *))
d1310b2e0   Chris Mason   Btrfs: Split the ...
3531
  {
7fd1a3f73   Josef Bacik   Btrfs: hold a ref...
3532
  	struct inode *inode = mapping->host;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3533
3534
  	int ret = 0;
  	int done = 0;
f85d7d6c8   Chris Mason   Btrfs: properly h...
3535
  	int nr_to_write_done = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3536
3537
3538
3539
3540
  	struct pagevec pvec;
  	int nr_pages;
  	pgoff_t index;
  	pgoff_t end;		/* Inclusive */
  	int scanned = 0;
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3541
  	int tag;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3542

7fd1a3f73   Josef Bacik   Btrfs: hold a ref...
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
  	/*
  	 * We have to hold onto the inode so that ordered extents can do their
  	 * work when the IO finishes.  The alternative to this is failing to add
  	 * an ordered extent if the igrab() fails there and that is a huge pain
  	 * to deal with, so instead just hold onto the inode throughout the
  	 * writepages operation.  If it fails here we are freeing up the inode
  	 * anyway and we'd rather not waste our time writing out stuff that is
  	 * going to be truncated anyway.
  	 */
  	if (!igrab(inode))
  		return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3554
3555
3556
3557
3558
3559
3560
  	pagevec_init(&pvec, 0);
  	if (wbc->range_cyclic) {
  		index = mapping->writeback_index; /* Start from prev offset */
  		end = -1;
  	} else {
  		index = wbc->range_start >> PAGE_CACHE_SHIFT;
  		end = wbc->range_end >> PAGE_CACHE_SHIFT;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3561
3562
  		scanned = 1;
  	}
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3563
3564
3565
3566
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag = PAGECACHE_TAG_TOWRITE;
  	else
  		tag = PAGECACHE_TAG_DIRTY;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3567
  retry:
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3568
3569
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag_pages_for_writeback(mapping, index, end);
f85d7d6c8   Chris Mason   Btrfs: properly h...
3570
  	while (!done && !nr_to_write_done && (index <= end) &&
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3571
3572
  	       (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, tag,
  			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
  		unsigned i;
  
  		scanned = 1;
  		for (i = 0; i < nr_pages; i++) {
  			struct page *page = pvec.pages[i];
  
  			/*
  			 * At this point we hold neither mapping->tree_lock nor
  			 * lock on the page itself: the page may be truncated or
  			 * invalidated (changing page->mapping to NULL), or even
  			 * swizzled back from swapper_space to tmpfs file
  			 * mapping
  			 */
c8f2f24bd   Josef Bacik   Btrfs: remove unu...
3586
3587
3588
  			if (!trylock_page(page)) {
  				flush_fn(data);
  				lock_page(page);
01d658f2c   Chris Mason   Btrfs: make sure ...
3589
  			}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
  
  			if (unlikely(page->mapping != mapping)) {
  				unlock_page(page);
  				continue;
  			}
  
  			if (!wbc->range_cyclic && page->index > end) {
  				done = 1;
  				unlock_page(page);
  				continue;
  			}
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3601
  			if (wbc->sync_mode != WB_SYNC_NONE) {
0e6bd956e   Chris Mason   Btrfs: only flush...
3602
3603
  				if (PageWriteback(page))
  					flush_fn(data);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3604
  				wait_on_page_writeback(page);
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3605
  			}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
  
  			if (PageWriteback(page) ||
  			    !clear_page_dirty_for_io(page)) {
  				unlock_page(page);
  				continue;
  			}
  
  			ret = (*writepage)(page, wbc, data);
  
  			if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) {
  				unlock_page(page);
  				ret = 0;
  			}
f85d7d6c8   Chris Mason   Btrfs: properly h...
3619
  			if (ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
3620
  				done = 1;
f85d7d6c8   Chris Mason   Btrfs: properly h...
3621
3622
3623
3624
3625
3626
3627
  
  			/*
  			 * the filesystem may choose to bump up nr_to_write.
  			 * We have to make sure to honor the new nr_to_write
  			 * at any time
  			 */
  			nr_to_write_done = wbc->nr_to_write <= 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
  		}
  		pagevec_release(&pvec);
  		cond_resched();
  	}
  	if (!scanned && !done) {
  		/*
  		 * We hit the last page and there is more work to be done: wrap
  		 * back to the start of the file
  		 */
  		scanned = 1;
  		index = 0;
  		goto retry;
  	}
7fd1a3f73   Josef Bacik   Btrfs: hold a ref...
3641
  	btrfs_add_delayed_iput(inode);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3642
3643
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3644

ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3645
  static void flush_epd_write_bio(struct extent_page_data *epd)
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3646
  {
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3647
  	if (epd->bio) {
355808c29   Jeff Mahoney   btrfs: ->submit_b...
3648
3649
  		int rw = WRITE;
  		int ret;
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3650
  		if (epd->sync_io)
355808c29   Jeff Mahoney   btrfs: ->submit_b...
3651
  			rw = WRITE_SYNC;
de0022b9d   Josef Bacik   Btrfs: do not asy...
3652
  		ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags);
79787eaab   Jeff Mahoney   btrfs: replace ma...
3653
  		BUG_ON(ret < 0); /* -ENOMEM */
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3654
3655
3656
  		epd->bio = NULL;
  	}
  }
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3657
3658
3659
3660
3661
  static noinline void flush_write_bio(void *data)
  {
  	struct extent_page_data *epd = data;
  	flush_epd_write_bio(epd);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3662
3663
3664
3665
3666
  int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
  			  get_extent_t *get_extent,
  			  struct writeback_control *wbc)
  {
  	int ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3667
3668
3669
3670
  	struct extent_page_data epd = {
  		.bio = NULL,
  		.tree = tree,
  		.get_extent = get_extent,
771ed689d   Chris Mason   Btrfs: Optimize c...
3671
  		.extent_locked = 0,
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3672
  		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3673
  		.bio_flags = 0,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3674
  	};
d1310b2e0   Chris Mason   Btrfs: Split the ...
3675

d1310b2e0   Chris Mason   Btrfs: Split the ...
3676
  	ret = __extent_writepage(page, wbc, &epd);
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3677
  	flush_epd_write_bio(&epd);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3678
3679
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3680

771ed689d   Chris Mason   Btrfs: Optimize c...
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
  int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
  			      u64 start, u64 end, get_extent_t *get_extent,
  			      int mode)
  {
  	int ret = 0;
  	struct address_space *mapping = inode->i_mapping;
  	struct page *page;
  	unsigned long nr_pages = (end - start + PAGE_CACHE_SIZE) >>
  		PAGE_CACHE_SHIFT;
  
  	struct extent_page_data epd = {
  		.bio = NULL,
  		.tree = tree,
  		.get_extent = get_extent,
  		.extent_locked = 1,
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3696
  		.sync_io = mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3697
  		.bio_flags = 0,
771ed689d   Chris Mason   Btrfs: Optimize c...
3698
3699
  	};
  	struct writeback_control wbc_writepages = {
771ed689d   Chris Mason   Btrfs: Optimize c...
3700
  		.sync_mode	= mode,
771ed689d   Chris Mason   Btrfs: Optimize c...
3701
3702
3703
3704
  		.nr_to_write	= nr_pages * 2,
  		.range_start	= start,
  		.range_end	= end + 1,
  	};
d397712bc   Chris Mason   Btrfs: Fix checkp...
3705
  	while (start <= end) {
771ed689d   Chris Mason   Btrfs: Optimize c...
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
  		page = find_get_page(mapping, start >> PAGE_CACHE_SHIFT);
  		if (clear_page_dirty_for_io(page))
  			ret = __extent_writepage(page, &wbc_writepages, &epd);
  		else {
  			if (tree->ops && tree->ops->writepage_end_io_hook)
  				tree->ops->writepage_end_io_hook(page, start,
  						 start + PAGE_CACHE_SIZE - 1,
  						 NULL, 1);
  			unlock_page(page);
  		}
  		page_cache_release(page);
  		start += PAGE_CACHE_SIZE;
  	}
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3719
  	flush_epd_write_bio(&epd);
771ed689d   Chris Mason   Btrfs: Optimize c...
3720
3721
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
  
  int extent_writepages(struct extent_io_tree *tree,
  		      struct address_space *mapping,
  		      get_extent_t *get_extent,
  		      struct writeback_control *wbc)
  {
  	int ret = 0;
  	struct extent_page_data epd = {
  		.bio = NULL,
  		.tree = tree,
  		.get_extent = get_extent,
771ed689d   Chris Mason   Btrfs: Optimize c...
3733
  		.extent_locked = 0,
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3734
  		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3735
  		.bio_flags = 0,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3736
  	};
4bef08485   Chris Mason   Btrfs: Tree loggi...
3737
  	ret = extent_write_cache_pages(tree, mapping, wbc,
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3738
3739
  				       __extent_writepage, &epd,
  				       flush_write_bio);
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3740
  	flush_epd_write_bio(&epd);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3741
3742
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3743
3744
3745
3746
3747
3748
3749
3750
  
  int extent_readpages(struct extent_io_tree *tree,
  		     struct address_space *mapping,
  		     struct list_head *pages, unsigned nr_pages,
  		     get_extent_t get_extent)
  {
  	struct bio *bio = NULL;
  	unsigned page_idx;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3751
  	unsigned long bio_flags = 0;
67c9684f4   Liu Bo   Btrfs: improve mu...
3752
3753
  	struct page *pagepool[16];
  	struct page *page;
125bac016   Miao Xie   Btrfs: cache the ...
3754
  	struct extent_map *em_cached = NULL;
67c9684f4   Liu Bo   Btrfs: improve mu...
3755
  	int nr = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3756

d1310b2e0   Chris Mason   Btrfs: Split the ...
3757
  	for (page_idx = 0; page_idx < nr_pages; page_idx++) {
67c9684f4   Liu Bo   Btrfs: improve mu...
3758
  		page = list_entry(pages->prev, struct page, lru);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3759
3760
3761
  
  		prefetchw(&page->flags);
  		list_del(&page->lru);
67c9684f4   Liu Bo   Btrfs: improve mu...
3762
  		if (add_to_page_cache_lru(page, mapping,
43e817a1f   Itaru Kitayama   btrfs: fix wrong ...
3763
  					page->index, GFP_NOFS)) {
67c9684f4   Liu Bo   Btrfs: improve mu...
3764
3765
  			page_cache_release(page);
  			continue;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3766
  		}
67c9684f4   Liu Bo   Btrfs: improve mu...
3767
3768
3769
3770
  
  		pagepool[nr++] = page;
  		if (nr < ARRAY_SIZE(pagepool))
  			continue;
125bac016   Miao Xie   Btrfs: cache the ...
3771
  		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
3772
  				   &bio, 0, &bio_flags, READ);
67c9684f4   Liu Bo   Btrfs: improve mu...
3773
  		nr = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3774
  	}
9974090bd   Miao Xie   Btrfs: batch the ...
3775
  	if (nr)
125bac016   Miao Xie   Btrfs: cache the ...
3776
  		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
3777
  				   &bio, 0, &bio_flags, READ);
67c9684f4   Liu Bo   Btrfs: improve mu...
3778

125bac016   Miao Xie   Btrfs: cache the ...
3779
3780
  	if (em_cached)
  		free_extent_map(em_cached);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3781
3782
  	BUG_ON(!list_empty(pages));
  	if (bio)
79787eaab   Jeff Mahoney   btrfs: replace ma...
3783
  		return submit_one_bio(READ, bio, 0, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3784
3785
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3786
3787
3788
3789
3790
3791
3792
3793
3794
  
  /*
   * basic invalidatepage code, this waits on any locked or writeback
   * ranges corresponding to the page, and then deletes any extent state
   * records from the tree
   */
  int extent_invalidatepage(struct extent_io_tree *tree,
  			  struct page *page, unsigned long offset)
  {
2ac55d41b   Josef Bacik   Btrfs: cache the ...
3795
  	struct extent_state *cached_state = NULL;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
3796
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3797
3798
  	u64 end = start + PAGE_CACHE_SIZE - 1;
  	size_t blocksize = page->mapping->host->i_sb->s_blocksize;
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
3799
  	start += ALIGN(offset, blocksize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3800
3801
  	if (start > end)
  		return 0;
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
3802
  	lock_extent_bits(tree, start, end, 0, &cached_state);
1edbb734b   Chris Mason   Btrfs: reduce CPU...
3803
  	wait_on_page_writeback(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3804
  	clear_extent_bit(tree, start, end,
32c00aff7   Josef Bacik   Btrfs: release de...
3805
3806
  			 EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC |
  			 EXTENT_DO_ACCOUNTING,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
3807
  			 1, 1, &cached_state, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3808
3809
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3810
3811
  
  /*
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3812
3813
3814
3815
   * a helper for releasepage, this tests for areas of the page that
   * are locked or under IO and drops the related state bits if it is safe
   * to drop the page.
   */
48a3b6366   Eric Sandeen   btrfs: make stati...
3816
3817
3818
  static int try_release_extent_state(struct extent_map_tree *map,
  				    struct extent_io_tree *tree,
  				    struct page *page, gfp_t mask)
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3819
  {
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
3820
  	u64 start = page_offset(page);
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3821
3822
  	u64 end = start + PAGE_CACHE_SIZE - 1;
  	int ret = 1;
211f90e68   Chris Mason   Btrfs: Don't allo...
3823
  	if (test_range_bit(tree, start, end,
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
3824
  			   EXTENT_IOBITS, 0, NULL))
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3825
3826
3827
3828
  		ret = 0;
  	else {
  		if ((mask & GFP_NOFS) == GFP_NOFS)
  			mask = GFP_NOFS;
11ef160fd   Chris Mason   Btrfs: fix releas...
3829
3830
3831
3832
  		/*
  		 * at this point we can safely clear everything except the
  		 * locked bit and the nodatasum bit
  		 */
e3f24cc52   Chris Mason   Btrfs: don't rele...
3833
  		ret = clear_extent_bit(tree, start, end,
11ef160fd   Chris Mason   Btrfs: fix releas...
3834
3835
  				 ~(EXTENT_LOCKED | EXTENT_NODATASUM),
  				 0, 0, NULL, mask);
e3f24cc52   Chris Mason   Btrfs: don't rele...
3836
3837
3838
3839
3840
3841
3842
3843
  
  		/* if clear_extent_bit failed for enomem reasons,
  		 * we can't allow the release to continue.
  		 */
  		if (ret < 0)
  			ret = 0;
  		else
  			ret = 1;
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3844
3845
3846
  	}
  	return ret;
  }
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3847
3848
  
  /*
d1310b2e0   Chris Mason   Btrfs: Split the ...
3849
3850
3851
3852
3853
   * a helper for releasepage.  As long as there are no locked extents
   * in the range corresponding to the page, both state records and extent
   * map records are removed
   */
  int try_release_extent_mapping(struct extent_map_tree *map,
70dec8079   Chris Mason   Btrfs: extent_io ...
3854
3855
  			       struct extent_io_tree *tree, struct page *page,
  			       gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
3856
3857
  {
  	struct extent_map *em;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
3858
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3859
  	u64 end = start + PAGE_CACHE_SIZE - 1;
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3860

70dec8079   Chris Mason   Btrfs: extent_io ...
3861
3862
  	if ((mask & __GFP_WAIT) &&
  	    page->mapping->host->i_size > 16 * 1024 * 1024) {
39b5637f6   Yan   Btrfs: Fix "no cs...
3863
  		u64 len;
70dec8079   Chris Mason   Btrfs: extent_io ...
3864
  		while (start <= end) {
39b5637f6   Yan   Btrfs: Fix "no cs...
3865
  			len = end - start + 1;
890871be8   Chris Mason   Btrfs: switch ext...
3866
  			write_lock(&map->lock);
39b5637f6   Yan   Btrfs: Fix "no cs...
3867
  			em = lookup_extent_mapping(map, start, len);
285190d99   Tsutomu Itoh   Btrfs: check retu...
3868
  			if (!em) {
890871be8   Chris Mason   Btrfs: switch ext...
3869
  				write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
3870
3871
  				break;
  			}
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3872
3873
  			if (test_bit(EXTENT_FLAG_PINNED, &em->flags) ||
  			    em->start != start) {
890871be8   Chris Mason   Btrfs: switch ext...
3874
  				write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
3875
3876
3877
3878
3879
  				free_extent_map(em);
  				break;
  			}
  			if (!test_range_bit(tree, em->start,
  					    extent_map_end(em) - 1,
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
3880
  					    EXTENT_LOCKED | EXTENT_WRITEBACK,
9655d2982   Chris Mason   Btrfs: use a cach...
3881
  					    0, NULL)) {
70dec8079   Chris Mason   Btrfs: extent_io ...
3882
3883
3884
3885
3886
  				remove_extent_mapping(map, em);
  				/* once for the rb tree */
  				free_extent_map(em);
  			}
  			start = extent_map_end(em);
890871be8   Chris Mason   Btrfs: switch ext...
3887
  			write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
3888
3889
  
  			/* once for us */
d1310b2e0   Chris Mason   Btrfs: Split the ...
3890
3891
  			free_extent_map(em);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3892
  	}
7b13b7b11   Chris Mason   Btrfs: Don't drop...
3893
  	return try_release_extent_state(map, tree, page, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3894
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3895

ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
  /*
   * helper function for fiemap, which doesn't want to see any holes.
   * This maps until we find something past 'last'
   */
  static struct extent_map *get_extent_skip_holes(struct inode *inode,
  						u64 offset,
  						u64 last,
  						get_extent_t *get_extent)
  {
  	u64 sectorsize = BTRFS_I(inode)->root->sectorsize;
  	struct extent_map *em;
  	u64 len;
  
  	if (offset >= last)
  		return NULL;
  
  	while(1) {
  		len = last - offset;
  		if (len == 0)
  			break;
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
3916
  		len = ALIGN(len, sectorsize);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3917
  		em = get_extent(inode, NULL, 0, offset, len, 0);
c704005d8   David Sterba   btrfs: unify chec...
3918
  		if (IS_ERR_OR_NULL(em))
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
  			return em;
  
  		/* if this isn't a hole return it */
  		if (!test_bit(EXTENT_FLAG_VACANCY, &em->flags) &&
  		    em->block_start != EXTENT_MAP_HOLE) {
  			return em;
  		}
  
  		/* this is a hole, advance to the next extent */
  		offset = extent_map_end(em);
  		free_extent_map(em);
  		if (offset >= last)
  			break;
  	}
  	return NULL;
  }
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3935
3936
3937
  int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
  		__u64 start, __u64 len, get_extent_t *get_extent)
  {
975f84fee   Josef Bacik   Btrfs: fix fiemap
3938
  	int ret = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3939
3940
3941
  	u64 off = start;
  	u64 max = start + len;
  	u32 flags = 0;
975f84fee   Josef Bacik   Btrfs: fix fiemap
3942
3943
  	u32 found_type;
  	u64 last;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3944
  	u64 last_for_get_extent = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3945
  	u64 disko = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3946
  	u64 isize = i_size_read(inode);
975f84fee   Josef Bacik   Btrfs: fix fiemap
3947
  	struct btrfs_key found_key;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3948
  	struct extent_map *em = NULL;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
3949
  	struct extent_state *cached_state = NULL;
975f84fee   Josef Bacik   Btrfs: fix fiemap
3950
3951
  	struct btrfs_path *path;
  	struct btrfs_file_extent_item *item;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3952
  	int end = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3953
3954
3955
  	u64 em_start = 0;
  	u64 em_len = 0;
  	u64 em_end = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3956
  	unsigned long emflags;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
3957
3958
3959
  
  	if (len == 0)
  		return -EINVAL;
975f84fee   Josef Bacik   Btrfs: fix fiemap
3960
3961
3962
3963
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
  	path->leave_spinning = 1;
4d479cf01   Josef Bacik   Btrfs: sectorsize...
3964
3965
  	start = ALIGN(start, BTRFS_I(inode)->root->sectorsize);
  	len = ALIGN(len, BTRFS_I(inode)->root->sectorsize);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3966
3967
3968
3969
  	/*
  	 * lookup the last file extent.  We're not using i_size here
  	 * because there might be preallocation past i_size
  	 */
975f84fee   Josef Bacik   Btrfs: fix fiemap
3970
  	ret = btrfs_lookup_file_extent(NULL, BTRFS_I(inode)->root,
33345d015   Li Zefan   Btrfs: Always use...
3971
  				       path, btrfs_ino(inode), -1, 0);
975f84fee   Josef Bacik   Btrfs: fix fiemap
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
  	if (ret < 0) {
  		btrfs_free_path(path);
  		return ret;
  	}
  	WARN_ON(!ret);
  	path->slots[0]--;
  	item = btrfs_item_ptr(path->nodes[0], path->slots[0],
  			      struct btrfs_file_extent_item);
  	btrfs_item_key_to_cpu(path->nodes[0], &found_key, path->slots[0]);
  	found_type = btrfs_key_type(&found_key);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3982
  	/* No extents, but there might be delalloc bits */
33345d015   Li Zefan   Btrfs: Always use...
3983
  	if (found_key.objectid != btrfs_ino(inode) ||
975f84fee   Josef Bacik   Btrfs: fix fiemap
3984
  	    found_type != BTRFS_EXTENT_DATA_KEY) {
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
  		/* have to trust i_size as the end */
  		last = (u64)-1;
  		last_for_get_extent = isize;
  	} else {
  		/*
  		 * remember the start of the last extent.  There are a
  		 * bunch of different factors that go into the length of the
  		 * extent, so its much less complex to remember where it started
  		 */
  		last = found_key.offset;
  		last_for_get_extent = last + 1;
975f84fee   Josef Bacik   Btrfs: fix fiemap
3996
  	}
975f84fee   Josef Bacik   Btrfs: fix fiemap
3997
  	btrfs_free_path(path);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
3998
3999
4000
4001
4002
4003
4004
4005
4006
  	/*
  	 * we might have some extents allocated but more delalloc past those
  	 * extents.  so, we trust isize unless the start of the last extent is
  	 * beyond isize
  	 */
  	if (last < isize) {
  		last = (u64)-1;
  		last_for_get_extent = isize;
  	}
a52f4cd2b   Liu Bo   Btrfs: fix off-by...
4007
  	lock_extent_bits(&BTRFS_I(inode)->io_tree, start, start + len - 1, 0,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
4008
  			 &cached_state);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4009

4d479cf01   Josef Bacik   Btrfs: sectorsize...
4010
  	em = get_extent_skip_holes(inode, start, last_for_get_extent,
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4011
  				   get_extent);
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4012
4013
4014
4015
4016
4017
  	if (!em)
  		goto out;
  	if (IS_ERR(em)) {
  		ret = PTR_ERR(em);
  		goto out;
  	}
975f84fee   Josef Bacik   Btrfs: fix fiemap
4018

1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4019
  	while (!end) {
b76bb7013   Josef Bacik   Btrfs: do not off...
4020
  		u64 offset_in_extent = 0;
ea8efc74b   Chris Mason   Btrfs: make sure ...
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
  
  		/* break if the extent we found is outside the range */
  		if (em->start >= max || extent_map_end(em) < off)
  			break;
  
  		/*
  		 * get_extent may return an extent that starts before our
  		 * requested range.  We have to make sure the ranges
  		 * we return to fiemap always move forward and don't
  		 * overlap, so adjust the offsets here
  		 */
  		em_start = max(em->start, off);
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4033

ea8efc74b   Chris Mason   Btrfs: make sure ...
4034
4035
  		/*
  		 * record the offset from the start of the extent
b76bb7013   Josef Bacik   Btrfs: do not off...
4036
4037
4038
  		 * for adjusting the disk offset below.  Only do this if the
  		 * extent isn't compressed since our in ram offset may be past
  		 * what we have actually allocated on disk.
ea8efc74b   Chris Mason   Btrfs: make sure ...
4039
  		 */
b76bb7013   Josef Bacik   Btrfs: do not off...
4040
4041
  		if (!test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
  			offset_in_extent = em_start - em->start;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4042
  		em_end = extent_map_end(em);
ea8efc74b   Chris Mason   Btrfs: make sure ...
4043
  		em_len = em_end - em_start;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4044
  		emflags = em->flags;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4045
4046
  		disko = 0;
  		flags = 0;
ea8efc74b   Chris Mason   Btrfs: make sure ...
4047
4048
4049
4050
4051
4052
  		/*
  		 * bump off for our next call to get_extent
  		 */
  		off = extent_map_end(em);
  		if (off >= max)
  			end = 1;
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4053
  		if (em->block_start == EXTENT_MAP_LAST_BYTE) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4054
4055
  			end = 1;
  			flags |= FIEMAP_EXTENT_LAST;
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4056
  		} else if (em->block_start == EXTENT_MAP_INLINE) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4057
4058
  			flags |= (FIEMAP_EXTENT_DATA_INLINE |
  				  FIEMAP_EXTENT_NOT_ALIGNED);
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4059
  		} else if (em->block_start == EXTENT_MAP_DELALLOC) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4060
4061
  			flags |= (FIEMAP_EXTENT_DELALLOC |
  				  FIEMAP_EXTENT_UNKNOWN);
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4062
  		} else {
ea8efc74b   Chris Mason   Btrfs: make sure ...
4063
  			disko = em->block_start + offset_in_extent;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4064
4065
4066
  		}
  		if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
  			flags |= FIEMAP_EXTENT_ENCODED;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4067
4068
  		free_extent_map(em);
  		em = NULL;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4069
4070
  		if ((em_start >= last) || em_len == (u64)-1 ||
  		   (last == (u64)-1 && isize <= em_end)) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4071
4072
4073
  			flags |= FIEMAP_EXTENT_LAST;
  			end = 1;
  		}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4074
4075
4076
4077
4078
4079
4080
4081
  		/* now scan forward to see if this is really the last extent. */
  		em = get_extent_skip_holes(inode, off, last_for_get_extent,
  					   get_extent);
  		if (IS_ERR(em)) {
  			ret = PTR_ERR(em);
  			goto out;
  		}
  		if (!em) {
975f84fee   Josef Bacik   Btrfs: fix fiemap
4082
4083
4084
  			flags |= FIEMAP_EXTENT_LAST;
  			end = 1;
  		}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4085
4086
4087
4088
  		ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
  					      em_len, flags);
  		if (ret)
  			goto out_free;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4089
4090
4091
4092
  	}
  out_free:
  	free_extent_map(em);
  out:
a52f4cd2b   Liu Bo   Btrfs: fix off-by...
4093
  	unlock_extent_cached(&BTRFS_I(inode)->io_tree, start, start + len - 1,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
4094
  			     &cached_state, GFP_NOFS);
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4095
4096
  	return ret;
  }
727011e07   Chris Mason   Btrfs: allow meta...
4097
4098
  static void __free_extent_buffer(struct extent_buffer *eb)
  {
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
4099
  	btrfs_leak_debug_del(&eb->leak_list);
727011e07   Chris Mason   Btrfs: allow meta...
4100
4101
  	kmem_cache_free(extent_buffer_cache, eb);
  }
db7f3436c   Josef Bacik   Btrfs: deal with ...
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
  static int extent_buffer_under_io(struct extent_buffer *eb)
  {
  	return (atomic_read(&eb->io_pages) ||
  		test_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags) ||
  		test_bit(EXTENT_BUFFER_DIRTY, &eb->bflags));
  }
  
  /*
   * Helper for releasing extent buffer page.
   */
  static void btrfs_release_extent_buffer_page(struct extent_buffer *eb,
  						unsigned long start_idx)
  {
  	unsigned long index;
  	unsigned long num_pages;
  	struct page *page;
  	int mapped = !test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags);
  
  	BUG_ON(extent_buffer_under_io(eb));
  
  	num_pages = num_extent_pages(eb->start, eb->len);
  	index = start_idx + num_pages;
  	if (start_idx >= index)
  		return;
  
  	do {
  		index--;
  		page = extent_buffer_page(eb, index);
  		if (page && mapped) {
  			spin_lock(&page->mapping->private_lock);
  			/*
  			 * We do this since we'll remove the pages after we've
  			 * removed the eb from the radix tree, so we could race
  			 * and have this page now attached to the new eb.  So
  			 * only clear page_private if it's still connected to
  			 * this eb.
  			 */
  			if (PagePrivate(page) &&
  			    page->private == (unsigned long)eb) {
  				BUG_ON(test_bit(EXTENT_BUFFER_DIRTY, &eb->bflags));
  				BUG_ON(PageDirty(page));
  				BUG_ON(PageWriteback(page));
  				/*
  				 * We need to make sure we haven't be attached
  				 * to a new eb.
  				 */
  				ClearPagePrivate(page);
  				set_page_private(page, 0);
  				/* One for the page private */
  				page_cache_release(page);
  			}
  			spin_unlock(&page->mapping->private_lock);
  
  		}
  		if (page) {
  			/* One for when we alloced the page */
  			page_cache_release(page);
  		}
  	} while (index != start_idx);
  }
  
  /*
   * Helper for releasing the extent buffer.
   */
  static inline void btrfs_release_extent_buffer(struct extent_buffer *eb)
  {
  	btrfs_release_extent_buffer_page(eb, 0);
  	__free_extent_buffer(eb);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4171
4172
4173
4174
4175
4176
  static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
  						   u64 start,
  						   unsigned long len,
  						   gfp_t mask)
  {
  	struct extent_buffer *eb = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4177
  	eb = kmem_cache_zalloc(extent_buffer_cache, mask);
91ca338d7   Tsutomu Itoh   btrfs: check NULL...
4178
4179
  	if (eb == NULL)
  		return NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4180
4181
  	eb->start = start;
  	eb->len = len;
4f2de97ac   Josef Bacik   Btrfs: set page->...
4182
  	eb->tree = tree;
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4183
  	eb->bflags = 0;
bd681513f   Chris Mason   Btrfs: switch the...
4184
4185
4186
4187
4188
4189
4190
  	rwlock_init(&eb->lock);
  	atomic_set(&eb->write_locks, 0);
  	atomic_set(&eb->read_locks, 0);
  	atomic_set(&eb->blocking_readers, 0);
  	atomic_set(&eb->blocking_writers, 0);
  	atomic_set(&eb->spinning_readers, 0);
  	atomic_set(&eb->spinning_writers, 0);
5b25f70f4   Arne Jansen   Btrfs: add nested...
4191
  	eb->lock_nested = 0;
bd681513f   Chris Mason   Btrfs: switch the...
4192
4193
  	init_waitqueue_head(&eb->write_lock_wq);
  	init_waitqueue_head(&eb->read_lock_wq);
b4ce94de9   Chris Mason   Btrfs: Change btr...
4194

6d49ba1b4   Eric Sandeen   btrfs: move leak ...
4195
  	btrfs_leak_debug_add(&eb->leak_list, &buffers);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4196
  	spin_lock_init(&eb->refs_lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4197
  	atomic_set(&eb->refs, 1);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4198
  	atomic_set(&eb->io_pages, 0);
727011e07   Chris Mason   Btrfs: allow meta...
4199

b8dae3138   David Sterba   btrfs: use only i...
4200
4201
4202
4203
4204
4205
  	/*
  	 * Sanity checks, currently the maximum is 64k covered by 16x 4k pages
  	 */
  	BUILD_BUG_ON(BTRFS_MAX_METADATA_BLOCKSIZE
  		> MAX_INLINE_EXTENT_BUFFER_SIZE);
  	BUG_ON(len > MAX_INLINE_EXTENT_BUFFER_SIZE);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4206
4207
4208
  
  	return eb;
  }
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4209
4210
4211
4212
4213
4214
  struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
  {
  	unsigned long i;
  	struct page *p;
  	struct extent_buffer *new;
  	unsigned long num_pages = num_extent_pages(src->start, src->len);
9ec726775   Josef Bacik   Btrfs: stop using...
4215
  	new = __alloc_extent_buffer(NULL, src->start, src->len, GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4216
4217
4218
4219
  	if (new == NULL)
  		return NULL;
  
  	for (i = 0; i < num_pages; i++) {
9ec726775   Josef Bacik   Btrfs: stop using...
4220
  		p = alloc_page(GFP_NOFS);
db7f3436c   Josef Bacik   Btrfs: deal with ...
4221
4222
4223
4224
  		if (!p) {
  			btrfs_release_extent_buffer(new);
  			return NULL;
  		}
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
  		attach_extent_buffer_page(new, p);
  		WARN_ON(PageDirty(p));
  		SetPageUptodate(p);
  		new->pages[i] = p;
  	}
  
  	copy_extent_buffer(new, src, 0, 0, src->len);
  	set_bit(EXTENT_BUFFER_UPTODATE, &new->bflags);
  	set_bit(EXTENT_BUFFER_DUMMY, &new->bflags);
  
  	return new;
  }
  
  struct extent_buffer *alloc_dummy_extent_buffer(u64 start, unsigned long len)
  {
  	struct extent_buffer *eb;
  	unsigned long num_pages = num_extent_pages(0, len);
  	unsigned long i;
9ec726775   Josef Bacik   Btrfs: stop using...
4243
  	eb = __alloc_extent_buffer(NULL, start, len, GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4244
4245
4246
4247
  	if (!eb)
  		return NULL;
  
  	for (i = 0; i < num_pages; i++) {
9ec726775   Josef Bacik   Btrfs: stop using...
4248
  		eb->pages[i] = alloc_page(GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4249
4250
4251
4252
4253
4254
4255
4256
4257
  		if (!eb->pages[i])
  			goto err;
  	}
  	set_extent_buffer_uptodate(eb);
  	btrfs_set_header_nritems(eb, 0);
  	set_bit(EXTENT_BUFFER_DUMMY, &eb->bflags);
  
  	return eb;
  err:
84167d190   Stefan Behrens   Btrfs: Fix wrong ...
4258
4259
  	for (; i > 0; i--)
  		__free_page(eb->pages[i - 1]);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4260
4261
4262
  	__free_extent_buffer(eb);
  	return NULL;
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4263
4264
  static void check_buffer_tree_ref(struct extent_buffer *eb)
  {
242e18c7c   Chris Mason   Btrfs: reduce loc...
4265
  	int refs;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
  	/* the ref bit is tricky.  We have to make sure it is set
  	 * if we have the buffer dirty.   Otherwise the
  	 * code to free a buffer can end up dropping a dirty
  	 * page
  	 *
  	 * Once the ref bit is set, it won't go away while the
  	 * buffer is dirty or in writeback, and it also won't
  	 * go away while we have the reference count on the
  	 * eb bumped.
  	 *
  	 * We can't just set the ref bit without bumping the
  	 * ref on the eb because free_extent_buffer might
  	 * see the ref bit and try to clear it.  If this happens
  	 * free_extent_buffer might end up dropping our original
  	 * ref by mistake and freeing the page before we are able
  	 * to add one more ref.
  	 *
  	 * So bump the ref count first, then set the bit.  If someone
  	 * beat us to it, drop the ref we added.
  	 */
242e18c7c   Chris Mason   Btrfs: reduce loc...
4286
4287
4288
  	refs = atomic_read(&eb->refs);
  	if (refs >= 2 && test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
  		return;
594831c4b   Josef Bacik   Btrfs: fix potent...
4289
4290
  	spin_lock(&eb->refs_lock);
  	if (!test_and_set_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4291
  		atomic_inc(&eb->refs);
594831c4b   Josef Bacik   Btrfs: fix potent...
4292
  	spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4293
  }
d618a27c7   Mel Gorman   mm: non-atomicall...
4294
4295
  static void mark_extent_buffer_accessed(struct extent_buffer *eb,
  		struct page *accessed)
5df4235ea   Josef Bacik   Btrfs: introduce ...
4296
4297
  {
  	unsigned long num_pages, i;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4298
  	check_buffer_tree_ref(eb);
5df4235ea   Josef Bacik   Btrfs: introduce ...
4299
4300
4301
  	num_pages = num_extent_pages(eb->start, eb->len);
  	for (i = 0; i < num_pages; i++) {
  		struct page *p = extent_buffer_page(eb, i);
d618a27c7   Mel Gorman   mm: non-atomicall...
4302
4303
  		if (p != accessed)
  			mark_page_accessed(p);
5df4235ea   Josef Bacik   Btrfs: introduce ...
4304
4305
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4306
  struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
727011e07   Chris Mason   Btrfs: allow meta...
4307
  					  u64 start, unsigned long len)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4308
4309
4310
4311
4312
  {
  	unsigned long num_pages = num_extent_pages(start, len);
  	unsigned long i;
  	unsigned long index = start >> PAGE_CACHE_SHIFT;
  	struct extent_buffer *eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
4313
  	struct extent_buffer *exists = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4314
4315
4316
  	struct page *p;
  	struct address_space *mapping = tree->mapping;
  	int uptodate = 1;
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4317
  	int ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4318

19fe0a8b7   Miao Xie   Btrfs: Switch the...
4319
4320
4321
4322
  	rcu_read_lock();
  	eb = radix_tree_lookup(&tree->buffer, start >> PAGE_CACHE_SHIFT);
  	if (eb && atomic_inc_not_zero(&eb->refs)) {
  		rcu_read_unlock();
d618a27c7   Mel Gorman   mm: non-atomicall...
4323
  		mark_extent_buffer_accessed(eb, NULL);
6af118ce5   Chris Mason   Btrfs: Index exte...
4324
4325
  		return eb;
  	}
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4326
  	rcu_read_unlock();
6af118ce5   Chris Mason   Btrfs: Index exte...
4327

ba1441926   David Sterba   btrfs: drop gfp p...
4328
  	eb = __alloc_extent_buffer(tree, start, len, GFP_NOFS);
2b114d1d3   Peter   Btrfs: Correct us...
4329
  	if (!eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4330
  		return NULL;
727011e07   Chris Mason   Btrfs: allow meta...
4331
  	for (i = 0; i < num_pages; i++, index++) {
a65917156   Chris Mason   Btrfs: stop using...
4332
  		p = find_or_create_page(mapping, index, GFP_NOFS);
4804b3829   Josef Bacik   Btrfs: do not war...
4333
  		if (!p)
6af118ce5   Chris Mason   Btrfs: Index exte...
4334
  			goto free_eb;
4f2de97ac   Josef Bacik   Btrfs: set page->...
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
  
  		spin_lock(&mapping->private_lock);
  		if (PagePrivate(p)) {
  			/*
  			 * We could have already allocated an eb for this page
  			 * and attached one so lets see if we can get a ref on
  			 * the existing eb, and if we can we know it's good and
  			 * we can just return that one, else we know we can just
  			 * overwrite page->private.
  			 */
  			exists = (struct extent_buffer *)p->private;
  			if (atomic_inc_not_zero(&exists->refs)) {
  				spin_unlock(&mapping->private_lock);
  				unlock_page(p);
17de39ac1   Josef Bacik   Btrfs: fix page l...
4349
  				page_cache_release(p);
d618a27c7   Mel Gorman   mm: non-atomicall...
4350
  				mark_extent_buffer_accessed(exists, p);
4f2de97ac   Josef Bacik   Btrfs: set page->...
4351
4352
  				goto free_eb;
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4353
  			/*
4f2de97ac   Josef Bacik   Btrfs: set page->...
4354
4355
4356
4357
  			 * Do this so attach doesn't complain and we need to
  			 * drop the ref the old guy had.
  			 */
  			ClearPagePrivate(p);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4358
  			WARN_ON(PageDirty(p));
4f2de97ac   Josef Bacik   Btrfs: set page->...
4359
  			page_cache_release(p);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4360
  		}
4f2de97ac   Josef Bacik   Btrfs: set page->...
4361
4362
  		attach_extent_buffer_page(eb, p);
  		spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4363
  		WARN_ON(PageDirty(p));
727011e07   Chris Mason   Btrfs: allow meta...
4364
  		eb->pages[i] = p;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4365
4366
  		if (!PageUptodate(p))
  			uptodate = 0;
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4367
4368
4369
4370
4371
  
  		/*
  		 * see below about how we avoid a nasty race with release page
  		 * and why we unlock later
  		 */
d1310b2e0   Chris Mason   Btrfs: Split the ...
4372
4373
  	}
  	if (uptodate)
b4ce94de9   Chris Mason   Btrfs: Change btr...
4374
  		set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
115391d23   Josef Bacik   Btrfs: only use t...
4375
  again:
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4376
4377
4378
  	ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
  	if (ret)
  		goto free_eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
4379
  	spin_lock(&tree->buffer_lock);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4380
4381
4382
4383
  	ret = radix_tree_insert(&tree->buffer, start >> PAGE_CACHE_SHIFT, eb);
  	if (ret == -EEXIST) {
  		exists = radix_tree_lookup(&tree->buffer,
  						start >> PAGE_CACHE_SHIFT);
115391d23   Josef Bacik   Btrfs: only use t...
4384
4385
4386
  		if (!atomic_inc_not_zero(&exists->refs)) {
  			spin_unlock(&tree->buffer_lock);
  			radix_tree_preload_end();
115391d23   Josef Bacik   Btrfs: only use t...
4387
4388
4389
  			exists = NULL;
  			goto again;
  		}
6af118ce5   Chris Mason   Btrfs: Index exte...
4390
  		spin_unlock(&tree->buffer_lock);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4391
  		radix_tree_preload_end();
d618a27c7   Mel Gorman   mm: non-atomicall...
4392
  		mark_extent_buffer_accessed(exists, NULL);
6af118ce5   Chris Mason   Btrfs: Index exte...
4393
4394
  		goto free_eb;
  	}
6af118ce5   Chris Mason   Btrfs: Index exte...
4395
  	/* add one reference for the tree */
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4396
  	check_buffer_tree_ref(eb);
f044ba783   Yan, Zheng   Btrfs: fix race b...
4397
  	spin_unlock(&tree->buffer_lock);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4398
  	radix_tree_preload_end();
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
  
  	/*
  	 * there is a race where release page may have
  	 * tried to find this extent buffer in the radix
  	 * but failed.  It will tell the VM it is safe to
  	 * reclaim the, and it will clear the page private bit.
  	 * We must make sure to set the page private bit properly
  	 * after the extent buffer is in the radix tree so
  	 * it doesn't get lost
  	 */
727011e07   Chris Mason   Btrfs: allow meta...
4409
4410
4411
  	SetPageChecked(eb->pages[0]);
  	for (i = 1; i < num_pages; i++) {
  		p = extent_buffer_page(eb, i);
727011e07   Chris Mason   Btrfs: allow meta...
4412
4413
4414
4415
  		ClearPageChecked(p);
  		unlock_page(p);
  	}
  	unlock_page(eb->pages[0]);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4416
  	return eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
4417
  free_eb:
727011e07   Chris Mason   Btrfs: allow meta...
4418
4419
4420
4421
  	for (i = 0; i < num_pages; i++) {
  		if (eb->pages[i])
  			unlock_page(eb->pages[i]);
  	}
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4422

17de39ac1   Josef Bacik   Btrfs: fix page l...
4423
  	WARN_ON(!atomic_dec_and_test(&eb->refs));
897ca6e9b   Miao Xie   Btrfs: restructur...
4424
  	btrfs_release_extent_buffer(eb);
6af118ce5   Chris Mason   Btrfs: Index exte...
4425
  	return exists;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4426
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4427
4428
  
  struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
f09d1f60e   David Sterba   btrfs: drop gfp p...
4429
  					 u64 start, unsigned long len)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4430
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4431
  	struct extent_buffer *eb;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4432

19fe0a8b7   Miao Xie   Btrfs: Switch the...
4433
4434
4435
4436
  	rcu_read_lock();
  	eb = radix_tree_lookup(&tree->buffer, start >> PAGE_CACHE_SHIFT);
  	if (eb && atomic_inc_not_zero(&eb->refs)) {
  		rcu_read_unlock();
d618a27c7   Mel Gorman   mm: non-atomicall...
4437
  		mark_extent_buffer_accessed(eb, NULL);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4438
4439
4440
  		return eb;
  	}
  	rcu_read_unlock();
0f9dd46cd   Josef Bacik   Btrfs: free space...
4441

19fe0a8b7   Miao Xie   Btrfs: Switch the...
4442
  	return NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4443
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4444

3083ee2e1   Josef Bacik   Btrfs: introduce ...
4445
4446
4447
4448
4449
4450
4451
  static inline void btrfs_release_extent_buffer_rcu(struct rcu_head *head)
  {
  	struct extent_buffer *eb =
  			container_of(head, struct extent_buffer, rcu_head);
  
  	__free_extent_buffer(eb);
  }
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4452
  /* Expects to have eb->eb_lock already held */
f7a52a40c   David Sterba   btrfs: remove unu...
4453
  static int release_extent_buffer(struct extent_buffer *eb)
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4454
4455
4456
  {
  	WARN_ON(atomic_read(&eb->refs) == 0);
  	if (atomic_dec_and_test(&eb->refs)) {
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4457
4458
4459
4460
  		if (test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags)) {
  			spin_unlock(&eb->refs_lock);
  		} else {
  			struct extent_io_tree *tree = eb->tree;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4461

815a51c74   Jan Schmidt   Btrfs: dummy exte...
4462
  			spin_unlock(&eb->refs_lock);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4463

815a51c74   Jan Schmidt   Btrfs: dummy exte...
4464
4465
4466
4467
4468
  			spin_lock(&tree->buffer_lock);
  			radix_tree_delete(&tree->buffer,
  					  eb->start >> PAGE_CACHE_SHIFT);
  			spin_unlock(&tree->buffer_lock);
  		}
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4469
4470
4471
  
  		/* Should be safe to release our pages at this point */
  		btrfs_release_extent_buffer_page(eb, 0);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4472
  		call_rcu(&eb->rcu_head, btrfs_release_extent_buffer_rcu);
e64860aa0   Josef Bacik   Btrfs: don't retu...
4473
  		return 1;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4474
4475
  	}
  	spin_unlock(&eb->refs_lock);
e64860aa0   Josef Bacik   Btrfs: don't retu...
4476
4477
  
  	return 0;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4478
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4479
4480
  void free_extent_buffer(struct extent_buffer *eb)
  {
242e18c7c   Chris Mason   Btrfs: reduce loc...
4481
4482
  	int refs;
  	int old;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4483
4484
  	if (!eb)
  		return;
242e18c7c   Chris Mason   Btrfs: reduce loc...
4485
4486
4487
4488
4489
4490
4491
4492
  	while (1) {
  		refs = atomic_read(&eb->refs);
  		if (refs <= 3)
  			break;
  		old = atomic_cmpxchg(&eb->refs, refs, refs - 1);
  		if (old == refs)
  			return;
  	}
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4493
4494
  	spin_lock(&eb->refs_lock);
  	if (atomic_read(&eb->refs) == 2 &&
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4495
4496
4497
4498
  	    test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags))
  		atomic_dec(&eb->refs);
  
  	if (atomic_read(&eb->refs) == 2 &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4499
  	    test_bit(EXTENT_BUFFER_STALE, &eb->bflags) &&
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4500
  	    !extent_buffer_under_io(eb) &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4501
4502
4503
4504
4505
4506
4507
  	    test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
  		atomic_dec(&eb->refs);
  
  	/*
  	 * I know this is terrible, but it's temporary until we stop tracking
  	 * the uptodate bits and such for the extent buffers.
  	 */
f7a52a40c   David Sterba   btrfs: remove unu...
4508
  	release_extent_buffer(eb);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4509
4510
4511
4512
4513
  }
  
  void free_extent_buffer_stale(struct extent_buffer *eb)
  {
  	if (!eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4514
  		return;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4515
4516
  	spin_lock(&eb->refs_lock);
  	set_bit(EXTENT_BUFFER_STALE, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4517
  	if (atomic_read(&eb->refs) == 2 && !extent_buffer_under_io(eb) &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4518
4519
  	    test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
  		atomic_dec(&eb->refs);
f7a52a40c   David Sterba   btrfs: remove unu...
4520
  	release_extent_buffer(eb);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4521
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4522

1d4284bd6   Chris Mason   Merge branch 'err...
4523
  void clear_extent_buffer_dirty(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4524
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4525
4526
4527
  	unsigned long i;
  	unsigned long num_pages;
  	struct page *page;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4528
4529
4530
4531
  	num_pages = num_extent_pages(eb->start, eb->len);
  
  	for (i = 0; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
b9473439d   Chris Mason   Btrfs: leave btre...
4532
  		if (!PageDirty(page))
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
4533
  			continue;
a61e6f29d   Chris Mason   Btrfs: Use a mute...
4534
  		lock_page(page);
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4535
  		WARN_ON(!PagePrivate(page));
d1310b2e0   Chris Mason   Btrfs: Split the ...
4536
  		clear_page_dirty_for_io(page);
0ee0fda06   Sven Wegener   Btrfs: Add compat...
4537
  		spin_lock_irq(&page->mapping->tree_lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4538
4539
4540
4541
4542
  		if (!PageDirty(page)) {
  			radix_tree_tag_clear(&page->mapping->page_tree,
  						page_index(page),
  						PAGECACHE_TAG_DIRTY);
  		}
0ee0fda06   Sven Wegener   Btrfs: Add compat...
4543
  		spin_unlock_irq(&page->mapping->tree_lock);
bf0da8c18   Chris Mason   Btrfs: ClearPageE...
4544
  		ClearPageError(page);
a61e6f29d   Chris Mason   Btrfs: Use a mute...
4545
  		unlock_page(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4546
  	}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4547
  	WARN_ON(atomic_read(&eb->refs) == 0);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4548
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4549

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4550
  int set_extent_buffer_dirty(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4551
4552
4553
  {
  	unsigned long i;
  	unsigned long num_pages;
b9473439d   Chris Mason   Btrfs: leave btre...
4554
  	int was_dirty = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4555

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4556
  	check_buffer_tree_ref(eb);
b9473439d   Chris Mason   Btrfs: leave btre...
4557
  	was_dirty = test_and_set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4558

d1310b2e0   Chris Mason   Btrfs: Split the ...
4559
  	num_pages = num_extent_pages(eb->start, eb->len);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4560
  	WARN_ON(atomic_read(&eb->refs) == 0);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4561
  	WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
b9473439d   Chris Mason   Btrfs: leave btre...
4562
  	for (i = 0; i < num_pages; i++)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4563
  		set_page_dirty(extent_buffer_page(eb, i));
b9473439d   Chris Mason   Btrfs: leave btre...
4564
  	return was_dirty;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4565
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4566

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4567
  int clear_extent_buffer_uptodate(struct extent_buffer *eb)
1259ab75c   Chris Mason   Btrfs: Handle wri...
4568
4569
4570
4571
  {
  	unsigned long i;
  	struct page *page;
  	unsigned long num_pages;
b4ce94de9   Chris Mason   Btrfs: Change btr...
4572
  	clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4573
  	num_pages = num_extent_pages(eb->start, eb->len);
1259ab75c   Chris Mason   Btrfs: Handle wri...
4574
4575
  	for (i = 0; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
33958dc6d   Chris Mason   Btrfs: Fix verify...
4576
4577
  		if (page)
  			ClearPageUptodate(page);
1259ab75c   Chris Mason   Btrfs: Handle wri...
4578
4579
4580
  	}
  	return 0;
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4581
  int set_extent_buffer_uptodate(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4582
4583
4584
4585
  {
  	unsigned long i;
  	struct page *page;
  	unsigned long num_pages;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4586
  	set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4587
  	num_pages = num_extent_pages(eb->start, eb->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4588
4589
  	for (i = 0; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4590
4591
4592
4593
  		SetPageUptodate(page);
  	}
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4594

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4595
  int extent_buffer_uptodate(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4596
  {
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4597
  	return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4598
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4599
4600
  
  int read_extent_buffer_pages(struct extent_io_tree *tree,
bb82ab88d   Arne Jansen   btrfs: add an ext...
4601
  			     struct extent_buffer *eb, u64 start, int wait,
f188591e9   Chris Mason   Btrfs: Retry meta...
4602
  			     get_extent_t *get_extent, int mirror_num)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4603
4604
4605
4606
4607
4608
  {
  	unsigned long i;
  	unsigned long start_i;
  	struct page *page;
  	int err;
  	int ret = 0;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4609
4610
  	int locked_pages = 0;
  	int all_uptodate = 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4611
  	unsigned long num_pages;
727011e07   Chris Mason   Btrfs: allow meta...
4612
  	unsigned long num_reads = 0;
a86c12c73   Chris Mason   Btrfs: Create lar...
4613
  	struct bio *bio = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
4614
  	unsigned long bio_flags = 0;
a86c12c73   Chris Mason   Btrfs: Create lar...
4615

b4ce94de9   Chris Mason   Btrfs: Change btr...
4616
  	if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
d1310b2e0   Chris Mason   Btrfs: Split the ...
4617
  		return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
  	if (start) {
  		WARN_ON(start < eb->start);
  		start_i = (start >> PAGE_CACHE_SHIFT) -
  			(eb->start >> PAGE_CACHE_SHIFT);
  	} else {
  		start_i = 0;
  	}
  
  	num_pages = num_extent_pages(eb->start, eb->len);
  	for (i = start_i; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
bb82ab88d   Arne Jansen   btrfs: add an ext...
4629
  		if (wait == WAIT_NONE) {
2db04966a   David Woodhouse   Btrfs: Change Tes...
4630
  			if (!trylock_page(page))
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4631
  				goto unlock_exit;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4632
4633
4634
  		} else {
  			lock_page(page);
  		}
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4635
  		locked_pages++;
727011e07   Chris Mason   Btrfs: allow meta...
4636
4637
  		if (!PageUptodate(page)) {
  			num_reads++;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4638
  			all_uptodate = 0;
727011e07   Chris Mason   Btrfs: allow meta...
4639
  		}
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4640
4641
4642
  	}
  	if (all_uptodate) {
  		if (start_i == 0)
b4ce94de9   Chris Mason   Btrfs: Change btr...
4643
  			set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4644
4645
  		goto unlock_exit;
  	}
ea4667940   Josef Bacik   Btrfs: deal with ...
4646
  	clear_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
5cf1ab561   Josef Bacik   Btrfs: always sto...
4647
  	eb->read_mirror = 0;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4648
  	atomic_set(&eb->io_pages, num_reads);
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4649
4650
  	for (i = start_i; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4651
  		if (!PageUptodate(page)) {
f188591e9   Chris Mason   Btrfs: Retry meta...
4652
  			ClearPageError(page);
a86c12c73   Chris Mason   Btrfs: Create lar...
4653
  			err = __extent_read_full_page(tree, page,
f188591e9   Chris Mason   Btrfs: Retry meta...
4654
  						      get_extent, &bio,
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
4655
4656
  						      mirror_num, &bio_flags,
  						      READ | REQ_META);
d397712bc   Chris Mason   Btrfs: Fix checkp...
4657
  			if (err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4658
  				ret = err;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4659
4660
4661
4662
  		} else {
  			unlock_page(page);
  		}
  	}
355808c29   Jeff Mahoney   btrfs: ->submit_b...
4663
  	if (bio) {
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
4664
4665
  		err = submit_one_bio(READ | REQ_META, bio, mirror_num,
  				     bio_flags);
79787eaab   Jeff Mahoney   btrfs: replace ma...
4666
4667
  		if (err)
  			return err;
355808c29   Jeff Mahoney   btrfs: ->submit_b...
4668
  	}
a86c12c73   Chris Mason   Btrfs: Create lar...
4669

bb82ab88d   Arne Jansen   btrfs: add an ext...
4670
  	if (ret || wait != WAIT_COMPLETE)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4671
  		return ret;
d397712bc   Chris Mason   Btrfs: Fix checkp...
4672

d1310b2e0   Chris Mason   Btrfs: Split the ...
4673
4674
4675
  	for (i = start_i; i < num_pages; i++) {
  		page = extent_buffer_page(eb, i);
  		wait_on_page_locked(page);
d397712bc   Chris Mason   Btrfs: Fix checkp...
4676
  		if (!PageUptodate(page))
d1310b2e0   Chris Mason   Btrfs: Split the ...
4677
  			ret = -EIO;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4678
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
4679

d1310b2e0   Chris Mason   Btrfs: Split the ...
4680
  	return ret;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4681
4682
4683
  
  unlock_exit:
  	i = start_i;
d397712bc   Chris Mason   Btrfs: Fix checkp...
4684
  	while (locked_pages > 0) {
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4685
4686
4687
4688
4689
4690
  		page = extent_buffer_page(eb, i);
  		i++;
  		unlock_page(page);
  		locked_pages--;
  	}
  	return ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4691
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
  
  void read_extent_buffer(struct extent_buffer *eb, void *dstv,
  			unsigned long start,
  			unsigned long len)
  {
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	char *dst = (char *)dstv;
  	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4704
4705
4706
  
  	WARN_ON(start > eb->len);
  	WARN_ON(start + len > eb->start + eb->len);
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4707
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4708

d397712bc   Chris Mason   Btrfs: Fix checkp...
4709
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4710
  		page = extent_buffer_page(eb, i);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4711
4712
  
  		cur = min(len, (PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
4713
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4714
  		memcpy(dst, kaddr + offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4715
4716
4717
4718
4719
4720
4721
  
  		dst += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4722
4723
  
  int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
a65917156   Chris Mason   Btrfs: stop using...
4724
  			       unsigned long min_len, char **map,
d1310b2e0   Chris Mason   Btrfs: Split the ...
4725
  			       unsigned long *map_start,
a65917156   Chris Mason   Btrfs: stop using...
4726
  			       unsigned long *map_len)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
  {
  	size_t offset = start & (PAGE_CACHE_SIZE - 1);
  	char *kaddr;
  	struct page *p;
  	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
  	unsigned long end_i = (start_offset + start + min_len - 1) >>
  		PAGE_CACHE_SHIFT;
  
  	if (i != end_i)
  		return -EINVAL;
  
  	if (i == 0) {
  		offset = start_offset;
  		*map_start = 0;
  	} else {
  		offset = 0;
  		*map_start = ((u64)i << PAGE_CACHE_SHIFT) - start_offset;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
4746

d1310b2e0   Chris Mason   Btrfs: Split the ...
4747
  	if (start + min_len > eb->len) {
31b1a2bd7   Julia Lawall   fs/btrfs: use WARN
4748
  		WARN(1, KERN_ERR "btrfs bad mapping eb start %llu len %lu, "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
4749
4750
4751
  		       "wanted %lu %lu
  ",
  		       eb->start, eb->len, start, min_len);
850265335   Josef Bacik   Btrfs: return err...
4752
  		return -EINVAL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4753
4754
4755
  	}
  
  	p = extent_buffer_page(eb, i);
a65917156   Chris Mason   Btrfs: stop using...
4756
  	kaddr = page_address(p);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4757
4758
4759
4760
  	*map = kaddr + offset;
  	*map_len = PAGE_CACHE_SIZE - offset;
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4761

d1310b2e0   Chris Mason   Btrfs: Split the ...
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
  int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
  			  unsigned long start,
  			  unsigned long len)
  {
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	char *ptr = (char *)ptrv;
  	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
  	int ret = 0;
  
  	WARN_ON(start > eb->len);
  	WARN_ON(start + len > eb->start + eb->len);
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4777
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4778

d397712bc   Chris Mason   Btrfs: Fix checkp...
4779
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4780
  		page = extent_buffer_page(eb, i);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4781
4782
  
  		cur = min(len, (PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
4783
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4784
  		ret = memcmp(ptr, kaddr + offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
  		if (ret)
  			break;
  
  		ptr += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
  
  void write_extent_buffer(struct extent_buffer *eb, const void *srcv,
  			 unsigned long start, unsigned long len)
  {
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	char *src = (char *)srcv;
  	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
  
  	WARN_ON(start > eb->len);
  	WARN_ON(start + len > eb->start + eb->len);
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4809
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4810

d397712bc   Chris Mason   Btrfs: Fix checkp...
4811
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4812
4813
4814
4815
  		page = extent_buffer_page(eb, i);
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, PAGE_CACHE_SIZE - offset);
a65917156   Chris Mason   Btrfs: stop using...
4816
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4817
  		memcpy(kaddr + offset, src, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4818
4819
4820
4821
4822
4823
4824
  
  		src += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
  
  void memset_extent_buffer(struct extent_buffer *eb, char c,
  			  unsigned long start, unsigned long len)
  {
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
  
  	WARN_ON(start > eb->len);
  	WARN_ON(start + len > eb->start + eb->len);
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4838
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4839

d397712bc   Chris Mason   Btrfs: Fix checkp...
4840
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4841
4842
4843
4844
  		page = extent_buffer_page(eb, i);
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, PAGE_CACHE_SIZE - offset);
a65917156   Chris Mason   Btrfs: stop using...
4845
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4846
  		memset(kaddr + offset, c, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4847
4848
4849
4850
4851
4852
  
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
  
  void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
  			unsigned long dst_offset, unsigned long src_offset,
  			unsigned long len)
  {
  	u64 dst_len = dst->len;
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long i = (start_offset + dst_offset) >> PAGE_CACHE_SHIFT;
  
  	WARN_ON(src->len != dst_len);
  
  	offset = (start_offset + dst_offset) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4869
  		(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4870

d397712bc   Chris Mason   Btrfs: Fix checkp...
4871
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4872
4873
4874
4875
  		page = extent_buffer_page(dst, i);
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
4876
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4877
  		read_extent_buffer(src, kaddr + offset, src_offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4878
4879
4880
4881
4882
4883
4884
  
  		src_offset += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4885
4886
4887
4888
4889
  
  static void move_pages(struct page *dst_page, struct page *src_page,
  		       unsigned long dst_off, unsigned long src_off,
  		       unsigned long len)
  {
a65917156   Chris Mason   Btrfs: stop using...
4890
  	char *dst_kaddr = page_address(dst_page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4891
4892
4893
  	if (dst_page == src_page) {
  		memmove(dst_kaddr + dst_off, dst_kaddr + src_off, len);
  	} else {
a65917156   Chris Mason   Btrfs: stop using...
4894
  		char *src_kaddr = page_address(src_page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4895
4896
4897
4898
4899
  		char *p = dst_kaddr + dst_off + len;
  		char *s = src_kaddr + src_off + len;
  
  		while (len--)
  			*--p = *--s;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4900
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
4901
  }
3387206f2   Sergei Trofimovich   btrfs: properly h...
4902
4903
4904
4905
4906
  static inline bool areas_overlap(unsigned long src, unsigned long dst, unsigned long len)
  {
  	unsigned long distance = (src > dst) ? src - dst : dst - src;
  	return distance < len;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4907
4908
4909
4910
  static void copy_pages(struct page *dst_page, struct page *src_page,
  		       unsigned long dst_off, unsigned long src_off,
  		       unsigned long len)
  {
a65917156   Chris Mason   Btrfs: stop using...
4911
  	char *dst_kaddr = page_address(dst_page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4912
  	char *src_kaddr;
727011e07   Chris Mason   Btrfs: allow meta...
4913
  	int must_memmove = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4914

3387206f2   Sergei Trofimovich   btrfs: properly h...
4915
  	if (dst_page != src_page) {
a65917156   Chris Mason   Btrfs: stop using...
4916
  		src_kaddr = page_address(src_page);
3387206f2   Sergei Trofimovich   btrfs: properly h...
4917
  	} else {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4918
  		src_kaddr = dst_kaddr;
727011e07   Chris Mason   Btrfs: allow meta...
4919
4920
  		if (areas_overlap(src_off, dst_off, len))
  			must_memmove = 1;
3387206f2   Sergei Trofimovich   btrfs: properly h...
4921
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
4922

727011e07   Chris Mason   Btrfs: allow meta...
4923
4924
4925
4926
  	if (must_memmove)
  		memmove(dst_kaddr + dst_off, src_kaddr + src_off, len);
  	else
  		memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
  }
  
  void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
  			   unsigned long src_offset, unsigned long len)
  {
  	size_t cur;
  	size_t dst_off_in_page;
  	size_t src_off_in_page;
  	size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long dst_i;
  	unsigned long src_i;
  
  	if (src_offset + len > dst->len) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
4940
4941
4942
  		printk(KERN_ERR "btrfs memmove bogus src_offset %lu move "
  		       "len %lu dst len %lu
  ", src_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4943
4944
4945
  		BUG_ON(1);
  	}
  	if (dst_offset + len > dst->len) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
4946
4947
4948
  		printk(KERN_ERR "btrfs memmove bogus dst_offset %lu move "
  		       "len %lu dst len %lu
  ", dst_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4949
4950
  		BUG_ON(1);
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
4951
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4952
  		dst_off_in_page = (start_offset + dst_offset) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4953
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4954
  		src_off_in_page = (start_offset + src_offset) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
4955
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
  
  		dst_i = (start_offset + dst_offset) >> PAGE_CACHE_SHIFT;
  		src_i = (start_offset + src_offset) >> PAGE_CACHE_SHIFT;
  
  		cur = min(len, (unsigned long)(PAGE_CACHE_SIZE -
  					       src_off_in_page));
  		cur = min_t(unsigned long, cur,
  			(unsigned long)(PAGE_CACHE_SIZE - dst_off_in_page));
  
  		copy_pages(extent_buffer_page(dst, dst_i),
  			   extent_buffer_page(dst, src_i),
  			   dst_off_in_page, src_off_in_page, cur);
  
  		src_offset += cur;
  		dst_offset += cur;
  		len -= cur;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
  
  void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
  			   unsigned long src_offset, unsigned long len)
  {
  	size_t cur;
  	size_t dst_off_in_page;
  	size_t src_off_in_page;
  	unsigned long dst_end = dst_offset + len - 1;
  	unsigned long src_end = src_offset + len - 1;
  	size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1);
  	unsigned long dst_i;
  	unsigned long src_i;
  
  	if (src_offset + len > dst->len) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
4988
4989
4990
  		printk(KERN_ERR "btrfs memmove bogus src_offset %lu move "
  		       "len %lu len %lu
  ", src_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4991
4992
4993
  		BUG_ON(1);
  	}
  	if (dst_offset + len > dst->len) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
4994
4995
4996
  		printk(KERN_ERR "btrfs memmove bogus dst_offset %lu move "
  		       "len %lu len %lu
  ", dst_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4997
4998
  		BUG_ON(1);
  	}
727011e07   Chris Mason   Btrfs: allow meta...
4999
  	if (dst_offset < src_offset) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5000
5001
5002
  		memcpy_extent_buffer(dst, dst_offset, src_offset, len);
  		return;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
5003
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5004
5005
5006
5007
  		dst_i = (start_offset + dst_end) >> PAGE_CACHE_SHIFT;
  		src_i = (start_offset + src_end) >> PAGE_CACHE_SHIFT;
  
  		dst_off_in_page = (start_offset + dst_end) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5008
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5009
  		src_off_in_page = (start_offset + src_end) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5010
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
  
  		cur = min_t(unsigned long, len, src_off_in_page + 1);
  		cur = min(cur, dst_off_in_page + 1);
  		move_pages(extent_buffer_page(dst, dst_i),
  			   extent_buffer_page(dst, src_i),
  			   dst_off_in_page - cur + 1,
  			   src_off_in_page - cur + 1, cur);
  
  		dst_end -= cur;
  		src_end -= cur;
  		len -= cur;
  	}
  }
6af118ce5   Chris Mason   Btrfs: Index exte...
5024

f7a52a40c   David Sterba   btrfs: remove unu...
5025
  int try_release_extent_buffer(struct page *page)
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5026
  {
6af118ce5   Chris Mason   Btrfs: Index exte...
5027
  	struct extent_buffer *eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
5028

3083ee2e1   Josef Bacik   Btrfs: introduce ...
5029
5030
5031
5032
5033
5034
5035
  	/*
  	 * We need to make sure noboody is attaching this page to an eb right
  	 * now.
  	 */
  	spin_lock(&page->mapping->private_lock);
  	if (!PagePrivate(page)) {
  		spin_unlock(&page->mapping->private_lock);
4f2de97ac   Josef Bacik   Btrfs: set page->...
5036
  		return 1;
45f49bce9   Chris Mason   Btrfs: avoid NULL...
5037
  	}
6af118ce5   Chris Mason   Btrfs: Index exte...
5038

3083ee2e1   Josef Bacik   Btrfs: introduce ...
5039
5040
  	eb = (struct extent_buffer *)page->private;
  	BUG_ON(!eb);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5041
5042
  
  	/*
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5043
5044
5045
  	 * This is a little awful but should be ok, we need to make sure that
  	 * the eb doesn't disappear out from under us while we're looking at
  	 * this page.
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5046
  	 */
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5047
  	spin_lock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
5048
  	if (atomic_read(&eb->refs) != 1 || extent_buffer_under_io(eb)) {
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5049
5050
5051
  		spin_unlock(&eb->refs_lock);
  		spin_unlock(&page->mapping->private_lock);
  		return 0;
b9473439d   Chris Mason   Btrfs: leave btre...
5052
  	}
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5053
  	spin_unlock(&page->mapping->private_lock);
897ca6e9b   Miao Xie   Btrfs: restructur...
5054

19fe0a8b7   Miao Xie   Btrfs: Switch the...
5055
  	/*
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5056
5057
  	 * If tree ref isn't set then we know the ref on this eb is a real ref,
  	 * so just return, this page will likely be freed soon anyway.
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5058
  	 */
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5059
5060
5061
  	if (!test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags)) {
  		spin_unlock(&eb->refs_lock);
  		return 0;
b9473439d   Chris Mason   Btrfs: leave btre...
5062
  	}
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5063

f7a52a40c   David Sterba   btrfs: remove unu...
5064
  	return release_extent_buffer(eb);
6af118ce5   Chris Mason   Btrfs: Index exte...
5065
  }