Blame view

fs/btrfs/extent_io.c 140 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"
902b22f34   David Woodhouse   Btrfs: Remove bro...
16
17
  #include "ctree.h"
  #include "btrfs_inode.h"
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
18
  #include "volumes.h"
21adbd5cb   Stefan Behrens   Btrfs: integrate ...
19
  #include "check-integrity.h"
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
20
  #include "locking.h"
606686eea   Josef Bacik   Btrfs: use rcu to...
21
  #include "rcu-string.h"
fe09e16cc   Liu Bo   Btrfs: export btr...
22
  #include "backref.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

27a3507de   Filipe Manana   Btrfs: reduce siz...
28
29
30
31
  static inline bool extent_state_in_tree(const struct extent_state *state)
  {
  	return !RB_EMPTY_NODE(&state->rb_node);
  }
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
32
  #ifdef CONFIG_BTRFS_DEBUG
d1310b2e0   Chris Mason   Btrfs: Split the ...
33
34
  static LIST_HEAD(buffers);
  static LIST_HEAD(states);
4bef08485   Chris Mason   Btrfs: Tree loggi...
35

d397712bc   Chris Mason   Btrfs: Fix checkp...
36
  static DEFINE_SPINLOCK(leak_lock);
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
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
65
  
  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);
27a3507de   Filipe Manana   Btrfs: reduce siz...
66
67
68
69
  		pr_err("BTRFS: state leak: start %llu end %llu state %lu in tree %d refs %d
  ",
  		       state->start, state->end, state->state,
  		       extent_state_in_tree(state),
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
70
  		       atomic_read(&state->refs));
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
71
72
73
74
75
76
  		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);
efe120a06   Frank Holton   Btrfs: convert pr...
77
  		printk(KERN_ERR "BTRFS: buffer leak start %llu len %lu "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
78
79
80
  		       "refs %d
  ",
  		       eb->start, eb->len, atomic_read(&eb->refs));
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
81
82
83
84
  		list_del(&eb->leak_list);
  		kmem_cache_free(extent_buffer_cache, eb);
  	}
  }
8d599ae1b   David Sterba   btrfs: add debug ...
85

a5dee37d3   Josef Bacik   Btrfs: deal with ...
86
87
  #define btrfs_debug_check_extent_io_range(tree, start, end)		\
  	__btrfs_debug_check_extent_io_range(__func__, (tree), (start), (end))
8d599ae1b   David Sterba   btrfs: add debug ...
88
  static inline void __btrfs_debug_check_extent_io_range(const char *caller,
a5dee37d3   Josef Bacik   Btrfs: deal with ...
89
  		struct extent_io_tree *tree, u64 start, u64 end)
8d599ae1b   David Sterba   btrfs: add debug ...
90
  {
a5dee37d3   Josef Bacik   Btrfs: deal with ...
91
92
  	struct inode *inode;
  	u64 isize;
8d599ae1b   David Sterba   btrfs: add debug ...
93

a5dee37d3   Josef Bacik   Btrfs: deal with ...
94
95
  	if (!tree->mapping)
  		return;
8d599ae1b   David Sterba   btrfs: add debug ...
96

a5dee37d3   Josef Bacik   Btrfs: deal with ...
97
98
  	inode = tree->mapping->host;
  	isize = i_size_read(inode);
8d599ae1b   David Sterba   btrfs: add debug ...
99
100
  	if (end >= PAGE_SIZE && (end % 2) == 0 && end != isize - 1) {
  		printk_ratelimited(KERN_DEBUG
efe120a06   Frank Holton   Btrfs: convert pr...
101
102
  		    "BTRFS: %s: ino %llu isize %llu odd range [%llu,%llu]
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
103
  				caller, btrfs_ino(inode), isize, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
104
105
  	}
  }
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
106
107
108
109
  #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 ...
110
  #define btrfs_debug_check_extent_io_range(c, s, e)	do {} while (0)
4bef08485   Chris Mason   Btrfs: Tree loggi...
111
  #endif
d1310b2e0   Chris Mason   Btrfs: Split the ...
112

d1310b2e0   Chris Mason   Btrfs: Split the ...
113
114
115
116
117
  #define BUFFER_LRU_MAX 64
  
  struct tree_entry {
  	u64 start;
  	u64 end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
118
119
120
121
122
123
124
  	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...
125
  	unsigned long bio_flags;
771ed689d   Chris Mason   Btrfs: Optimize c...
126
127
128
129
  
  	/* tells writepage not to lock the state bits for this range
  	 * it still does the unlocking
  	 */
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
130
131
132
133
  	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 ...
134
  };
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
135
  static noinline void flush_write_bio(void *data);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
136
137
138
  static inline struct btrfs_fs_info *
  tree_fs_info(struct extent_io_tree *tree)
  {
a5dee37d3   Josef Bacik   Btrfs: deal with ...
139
140
  	if (!tree->mapping)
  		return NULL;
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
141
142
  	return btrfs_sb(tree->mapping->host->i_sb);
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
143

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

b2950863c   Christoph Hellwig   Btrfs: make thing...
204
  static struct extent_state *alloc_extent_state(gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
205
206
  {
  	struct extent_state *state;
d1310b2e0   Chris Mason   Btrfs: Split the ...
207
208
  
  	state = kmem_cache_alloc(extent_state_cache, mask);
2b114d1d3   Peter   Btrfs: Correct us...
209
  	if (!state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
210
211
  		return state;
  	state->state = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
212
  	state->private = 0;
27a3507de   Filipe Manana   Btrfs: reduce siz...
213
  	RB_CLEAR_NODE(&state->rb_node);
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
214
  	btrfs_leak_debug_add(&state->leak_list, &states);
d1310b2e0   Chris Mason   Btrfs: Split the ...
215
216
  	atomic_set(&state->refs, 1);
  	init_waitqueue_head(&state->wq);
143bede52   Jeff Mahoney   btrfs: return voi...
217
  	trace_alloc_extent_state(state, mask, _RET_IP_);
d1310b2e0   Chris Mason   Btrfs: Split the ...
218
219
  	return state;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
220

4845e44ff   Chris Mason   Btrfs: rework O_D...
221
  void free_extent_state(struct extent_state *state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
222
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
223
224
225
  	if (!state)
  		return;
  	if (atomic_dec_and_test(&state->refs)) {
27a3507de   Filipe Manana   Btrfs: reduce siz...
226
  		WARN_ON(extent_state_in_tree(state));
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
227
  		btrfs_leak_debug_del(&state->leak_list);
143bede52   Jeff Mahoney   btrfs: return voi...
228
  		trace_free_extent_state(state, _RET_IP_);
d1310b2e0   Chris Mason   Btrfs: Split the ...
229
230
231
  		kmem_cache_free(extent_state_cache, state);
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
232

f2071b215   Filipe Manana   Btrfs: more effic...
233
234
235
  static struct rb_node *tree_insert(struct rb_root *root,
  				   struct rb_node *search_start,
  				   u64 offset,
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
236
237
238
  				   struct rb_node *node,
  				   struct rb_node ***p_in,
  				   struct rb_node **parent_in)
d1310b2e0   Chris Mason   Btrfs: Split the ...
239
  {
f2071b215   Filipe Manana   Btrfs: more effic...
240
  	struct rb_node **p;
d397712bc   Chris Mason   Btrfs: Fix checkp...
241
  	struct rb_node *parent = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
242
  	struct tree_entry *entry;
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
243
244
245
246
247
  	if (p_in && parent_in) {
  		p = *p_in;
  		parent = *parent_in;
  		goto do_insert;
  	}
f2071b215   Filipe Manana   Btrfs: more effic...
248
  	p = search_start ? &search_start : &root->rb_node;
d397712bc   Chris Mason   Btrfs: Fix checkp...
249
  	while (*p) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
250
251
252
253
254
255
256
257
258
259
  		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;
  	}
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
260
  do_insert:
d1310b2e0   Chris Mason   Btrfs: Split the ...
261
262
263
264
  	rb_link_node(node, parent, p);
  	rb_insert_color(node, root);
  	return NULL;
  }
80ea96b1f   Chris Mason   Btrfs: Add a look...
265
  static struct rb_node *__etree_search(struct extent_io_tree *tree, u64 offset,
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
266
267
268
269
  				      struct rb_node **prev_ret,
  				      struct rb_node **next_ret,
  				      struct rb_node ***p_ret,
  				      struct rb_node **parent_ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
270
  {
80ea96b1f   Chris Mason   Btrfs: Add a look...
271
  	struct rb_root *root = &tree->state;
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
272
  	struct rb_node **n = &root->rb_node;
d1310b2e0   Chris Mason   Btrfs: Split the ...
273
274
275
276
  	struct rb_node *prev = NULL;
  	struct rb_node *orig_prev = NULL;
  	struct tree_entry *entry;
  	struct tree_entry *prev_entry = NULL;
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
277
278
279
  	while (*n) {
  		prev = *n;
  		entry = rb_entry(prev, struct tree_entry, rb_node);
d1310b2e0   Chris Mason   Btrfs: Split the ...
280
281
282
  		prev_entry = entry;
  
  		if (offset < entry->start)
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
283
  			n = &(*n)->rb_left;
d1310b2e0   Chris Mason   Btrfs: Split the ...
284
  		else if (offset > entry->end)
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
285
  			n = &(*n)->rb_right;
d397712bc   Chris Mason   Btrfs: Fix checkp...
286
  		else
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
287
  			return *n;
d1310b2e0   Chris Mason   Btrfs: Split the ...
288
  	}
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
289
290
291
292
  	if (p_ret)
  		*p_ret = n;
  	if (parent_ret)
  		*parent_ret = prev;
d1310b2e0   Chris Mason   Btrfs: Split the ...
293
294
  	if (prev_ret) {
  		orig_prev = prev;
d397712bc   Chris Mason   Btrfs: Fix checkp...
295
  		while (prev && offset > prev_entry->end) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
296
297
298
299
300
301
302
303
304
  			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...
305
  		while (prev && offset < prev_entry->start) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
306
307
308
309
310
311
312
  			prev = rb_prev(prev);
  			prev_entry = rb_entry(prev, struct tree_entry, rb_node);
  		}
  		*next_ret = prev;
  	}
  	return NULL;
  }
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
313
314
315
316
317
  static inline struct rb_node *
  tree_search_for_insert(struct extent_io_tree *tree,
  		       u64 offset,
  		       struct rb_node ***p_ret,
  		       struct rb_node **parent_ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
318
  {
70dec8079   Chris Mason   Btrfs: extent_io ...
319
  	struct rb_node *prev = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
320
  	struct rb_node *ret;
70dec8079   Chris Mason   Btrfs: extent_io ...
321

12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
322
  	ret = __etree_search(tree, offset, &prev, NULL, p_ret, parent_ret);
d397712bc   Chris Mason   Btrfs: Fix checkp...
323
  	if (!ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
324
325
326
  		return prev;
  	return ret;
  }
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
327
328
329
330
331
  static inline struct rb_node *tree_search(struct extent_io_tree *tree,
  					  u64 offset)
  {
  	return tree_search_for_insert(tree, offset, NULL, NULL);
  }
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
332
333
334
335
336
337
338
  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 ...
339
340
341
342
343
344
345
346
347
  /*
   * 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...
348
349
  static void merge_state(struct extent_io_tree *tree,
  		        struct extent_state *state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
350
351
352
  {
  	struct extent_state *other;
  	struct rb_node *other_node;
5b21f2ed3   Zheng Yan   Btrfs: extent_map...
353
  	if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY))
1bf85046e   Jeff Mahoney   btrfs: Make exten...
354
  		return;
d1310b2e0   Chris Mason   Btrfs: Split the ...
355
356
357
358
359
360
  
  	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...
361
  			merge_cb(tree, state, other);
d1310b2e0   Chris Mason   Btrfs: Split the ...
362
  			state->start = other->start;
d1310b2e0   Chris Mason   Btrfs: Split the ...
363
  			rb_erase(&other->rb_node, &tree->state);
27a3507de   Filipe Manana   Btrfs: reduce siz...
364
  			RB_CLEAR_NODE(&other->rb_node);
d1310b2e0   Chris Mason   Btrfs: Split the ...
365
366
367
368
369
370
371
372
  			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...
373
  			merge_cb(tree, state, other);
df98b6e2c   Josef Bacik   Btrfs: fix how we...
374
  			state->end = other->end;
df98b6e2c   Josef Bacik   Btrfs: fix how we...
375
  			rb_erase(&other->rb_node, &tree->state);
27a3507de   Filipe Manana   Btrfs: reduce siz...
376
  			RB_CLEAR_NODE(&other->rb_node);
df98b6e2c   Josef Bacik   Btrfs: fix how we...
377
  			free_extent_state(other);
d1310b2e0   Chris Mason   Btrfs: Split the ...
378
379
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
380
  }
1bf85046e   Jeff Mahoney   btrfs: Make exten...
381
  static void set_state_cb(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
382
  			 struct extent_state *state, unsigned long *bits)
291d673e6   Chris Mason   Btrfs: Do delallo...
383
  {
1bf85046e   Jeff Mahoney   btrfs: Make exten...
384
385
  	if (tree->ops && tree->ops->set_bit_hook)
  		tree->ops->set_bit_hook(tree->mapping->host, state, bits);
291d673e6   Chris Mason   Btrfs: Do delallo...
386
387
388
  }
  
  static void clear_state_cb(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
389
  			   struct extent_state *state, unsigned long *bits)
291d673e6   Chris Mason   Btrfs: Do delallo...
390
  {
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
391
392
  	if (tree->ops && tree->ops->clear_bit_hook)
  		tree->ops->clear_bit_hook(tree->mapping->host, state, bits);
291d673e6   Chris Mason   Btrfs: Do delallo...
393
  }
3150b6996   Xiao Guangrong   Btrfs: clean up f...
394
  static void set_state_bits(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
395
  			   struct extent_state *state, unsigned long *bits);
3150b6996   Xiao Guangrong   Btrfs: clean up f...
396

d1310b2e0   Chris Mason   Btrfs: Split the ...
397
398
399
400
401
402
403
404
405
406
407
408
  /*
   * 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,
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
409
410
  			struct rb_node ***p,
  			struct rb_node **parent,
410748882   David Sterba   btrfs: use unsign...
411
  			unsigned long *bits)
d1310b2e0   Chris Mason   Btrfs: Split the ...
412
413
  {
  	struct rb_node *node;
31b1a2bd7   Julia Lawall   fs/btrfs: use WARN
414
  	if (end < start)
efe120a06   Frank Holton   Btrfs: convert pr...
415
416
  		WARN(1, KERN_ERR "BTRFS: end < start %llu %llu
  ",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
417
  		       end, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
418
419
  	state->start = start;
  	state->end = end;
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
420

3150b6996   Xiao Guangrong   Btrfs: clean up f...
421
  	set_state_bits(tree, state, bits);
f2071b215   Filipe Manana   Btrfs: more effic...
422
  	node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent);
d1310b2e0   Chris Mason   Btrfs: Split the ...
423
424
425
  	if (node) {
  		struct extent_state *found;
  		found = rb_entry(node, struct extent_state, rb_node);
efe120a06   Frank Holton   Btrfs: convert pr...
426
  		printk(KERN_ERR "BTRFS: found node %llu %llu on insert of "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
427
428
429
  		       "%llu %llu
  ",
  		       found->start, found->end, start, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
430
431
432
433
434
  		return -EEXIST;
  	}
  	merge_state(tree, state);
  	return 0;
  }
1bf85046e   Jeff Mahoney   btrfs: Make exten...
435
  static void split_cb(struct extent_io_tree *tree, struct extent_state *orig,
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
436
437
438
  		     u64 split)
  {
  	if (tree->ops && tree->ops->split_extent_hook)
1bf85046e   Jeff Mahoney   btrfs: Make exten...
439
  		tree->ops->split_extent_hook(tree->mapping->host, orig, split);
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
440
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
  /*
   * 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...
459
460
  
  	split_cb(tree, orig, split);
d1310b2e0   Chris Mason   Btrfs: Split the ...
461
462
463
464
  	prealloc->start = orig->start;
  	prealloc->end = split - 1;
  	prealloc->state = orig->state;
  	orig->start = split;
f2071b215   Filipe Manana   Btrfs: more effic...
465
466
  	node = tree_insert(&tree->state, &orig->rb_node, prealloc->end,
  			   &prealloc->rb_node, NULL, NULL);
d1310b2e0   Chris Mason   Btrfs: Split the ...
467
  	if (node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
468
469
470
471
472
  		free_extent_state(prealloc);
  		return -EEXIST;
  	}
  	return 0;
  }
cdc6a3952   Li Zefan   Btrfs: avoid poss...
473
474
475
476
477
478
479
480
  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 ...
481
482
  /*
   * utility function to clear some bits in an extent state struct.
1b303fc05   Wang Sheng-Hui   Btrfs: cleanup th...
483
   * it will optionally wake up any one waiting on this state (wake == 1).
d1310b2e0   Chris Mason   Btrfs: Split the ...
484
485
486
487
   *
   * 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...
488
489
  static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
  					    struct extent_state *state,
410748882   David Sterba   btrfs: use unsign...
490
  					    unsigned long *bits, int wake)
d1310b2e0   Chris Mason   Btrfs: Split the ...
491
  {
cdc6a3952   Li Zefan   Btrfs: avoid poss...
492
  	struct extent_state *next;
410748882   David Sterba   btrfs: use unsign...
493
  	unsigned long bits_to_clear = *bits & ~EXTENT_CTLBITS;
d1310b2e0   Chris Mason   Btrfs: Split the ...
494

0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
495
  	if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
496
497
498
499
  		u64 range = state->end - state->start + 1;
  		WARN_ON(range > tree->dirty_bytes);
  		tree->dirty_bytes -= range;
  	}
291d673e6   Chris Mason   Btrfs: Do delallo...
500
  	clear_state_cb(tree, state, bits);
32c00aff7   Josef Bacik   Btrfs: release de...
501
  	state->state &= ~bits_to_clear;
d1310b2e0   Chris Mason   Btrfs: Split the ...
502
503
  	if (wake)
  		wake_up(&state->wq);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
504
  	if (state->state == 0) {
cdc6a3952   Li Zefan   Btrfs: avoid poss...
505
  		next = next_state(state);
27a3507de   Filipe Manana   Btrfs: reduce siz...
506
  		if (extent_state_in_tree(state)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
507
  			rb_erase(&state->rb_node, &tree->state);
27a3507de   Filipe Manana   Btrfs: reduce siz...
508
  			RB_CLEAR_NODE(&state->rb_node);
d1310b2e0   Chris Mason   Btrfs: Split the ...
509
510
511
512
513
514
  			free_extent_state(state);
  		} else {
  			WARN_ON(1);
  		}
  	} else {
  		merge_state(tree, state);
cdc6a3952   Li Zefan   Btrfs: avoid poss...
515
  		next = next_state(state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
516
  	}
cdc6a3952   Li Zefan   Btrfs: avoid poss...
517
  	return next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
518
  }
8233767a2   Xiao Guangrong   Btrfs: allocate e...
519
520
521
522
523
524
525
526
  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...
527
  static void extent_io_tree_panic(struct extent_io_tree *tree, int err)
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
528
529
530
531
532
  {
  	btrfs_panic(tree_fs_info(tree), err, "Locking error: "
  		    "Extent tree was modified by another "
  		    "thread while locked.");
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
533
534
535
536
537
538
539
540
541
542
  /*
   * 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...
543
   * This takes the tree lock, and returns 0 on success and < 0 on error.
d1310b2e0   Chris Mason   Btrfs: Split the ...
544
545
   */
  int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
546
  		     unsigned long bits, int wake, int delete,
2c64c53d8   Chris Mason   Btrfs: cache valu...
547
548
  		     struct extent_state **cached_state,
  		     gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
549
550
  {
  	struct extent_state *state;
2c64c53d8   Chris Mason   Btrfs: cache valu...
551
  	struct extent_state *cached;
d1310b2e0   Chris Mason   Btrfs: Split the ...
552
553
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
5c939df56   Yan Zheng   btrfs: Fix set/cl...
554
  	u64 last_end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
555
  	int err;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
556
  	int clear = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
557

a5dee37d3   Josef Bacik   Btrfs: deal with ...
558
  	btrfs_debug_check_extent_io_range(tree, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
559

7ee9e4405   Josef Bacik   Btrfs: check if w...
560
561
  	if (bits & EXTENT_DELALLOC)
  		bits |= EXTENT_NORESERVE;
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
562
563
564
  	if (delete)
  		bits |= ~EXTENT_CTLBITS;
  	bits |= EXTENT_FIRST_DELALLOC;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
565
566
  	if (bits & (EXTENT_IOBITS | EXTENT_BOUNDARY))
  		clear = 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
567
568
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
c7bc6319c   Filipe Manana   Btrfs: avoid prem...
569
570
571
572
573
574
575
  		/*
  		 * Don't care for allocation failure here because we might end
  		 * up not needing the pre-allocated extent state at all, which
  		 * is the case if we only have in the tree extent states that
  		 * cover our input range and don't cover too any other range.
  		 * If we end up needing a new extent state we allocate it later.
  		 */
d1310b2e0   Chris Mason   Btrfs: Split the ...
576
  		prealloc = alloc_extent_state(mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
577
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
578
  	spin_lock(&tree->lock);
2c64c53d8   Chris Mason   Btrfs: cache valu...
579
580
  	if (cached_state) {
  		cached = *cached_state;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
581
582
583
584
585
  
  		if (clear) {
  			*cached_state = NULL;
  			cached_state = NULL;
  		}
27a3507de   Filipe Manana   Btrfs: reduce siz...
586
587
  		if (cached && extent_state_in_tree(cached) &&
  		    cached->start <= start && cached->end > start) {
2ac55d41b   Josef Bacik   Btrfs: cache the ...
588
589
  			if (clear)
  				atomic_dec(&cached->refs);
2c64c53d8   Chris Mason   Btrfs: cache valu...
590
  			state = cached;
42daec299   Chris Mason   Btrfs: fix errors...
591
  			goto hit_next;
2c64c53d8   Chris Mason   Btrfs: cache valu...
592
  		}
2ac55d41b   Josef Bacik   Btrfs: cache the ...
593
594
  		if (clear)
  			free_extent_state(cached);
2c64c53d8   Chris Mason   Btrfs: cache valu...
595
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
596
597
598
599
  	/*
  	 * this search will find the extents that end after
  	 * our range starts
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
600
  	node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
601
602
603
  	if (!node)
  		goto out;
  	state = rb_entry(node, struct extent_state, rb_node);
2c64c53d8   Chris Mason   Btrfs: cache valu...
604
  hit_next:
d1310b2e0   Chris Mason   Btrfs: Split the ...
605
606
607
  	if (state->start > end)
  		goto out;
  	WARN_ON(state->end < start);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
608
  	last_end = state->end;
d1310b2e0   Chris Mason   Btrfs: Split the ...
609

0449314a9   Liu Bo   Btrfs: skip state...
610
  	/* the state doesn't have the wanted bits, go ahead */
cdc6a3952   Li Zefan   Btrfs: avoid poss...
611
612
  	if (!(state->state & bits)) {
  		state = next_state(state);
0449314a9   Liu Bo   Btrfs: skip state...
613
  		goto next;
cdc6a3952   Li Zefan   Btrfs: avoid poss...
614
  	}
0449314a9   Liu Bo   Btrfs: skip state...
615

d1310b2e0   Chris Mason   Btrfs: Split the ...
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
  	/*
  	 *     | ---- 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...
633
634
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
635
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
636
637
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
638
639
640
641
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
642
643
  			state = clear_state_bit(tree, state, &bits, wake);
  			goto next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
644
645
646
647
648
649
650
651
652
653
  		}
  		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...
654
655
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
656
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
657
658
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
659
660
  		if (wake)
  			wake_up(&state->wq);
42daec299   Chris Mason   Btrfs: fix errors...
661

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

d1310b2e0   Chris Mason   Btrfs: Split the ...
664
665
666
  		prealloc = NULL;
  		goto out;
  	}
42daec299   Chris Mason   Btrfs: fix errors...
667

cdc6a3952   Li Zefan   Btrfs: avoid poss...
668
  	state = clear_state_bit(tree, state, &bits, wake);
0449314a9   Liu Bo   Btrfs: skip state...
669
  next:
5c939df56   Yan Zheng   btrfs: Fix set/cl...
670
671
672
  	if (last_end == (u64)-1)
  		goto out;
  	start = last_end + 1;
cdc6a3952   Li Zefan   Btrfs: avoid poss...
673
  	if (start <= end && state && !need_resched())
692e5759a   Liu Bo   Btrfs: be less st...
674
  		goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
675
676
677
  	goto search_again;
  
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
678
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
679
680
  	if (prealloc)
  		free_extent_state(prealloc);
6763af84a   Jeff Mahoney   btrfs: Remove set...
681
  	return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
682
683
684
685
  
  search_again:
  	if (start > end)
  		goto out;
cad321ad5   Chris Mason   Btrfs: shift all ...
686
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
687
688
689
690
  	if (mask & __GFP_WAIT)
  		cond_resched();
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
691

143bede52   Jeff Mahoney   btrfs: return voi...
692
693
  static void wait_on_state(struct extent_io_tree *tree,
  			  struct extent_state *state)
641f5219f   Christoph Hellwig   Btrfs: sparse loc...
694
695
  		__releases(tree->lock)
  		__acquires(tree->lock)
d1310b2e0   Chris Mason   Btrfs: Split the ...
696
697
698
  {
  	DEFINE_WAIT(wait);
  	prepare_to_wait(&state->wq, &wait, TASK_UNINTERRUPTIBLE);
cad321ad5   Chris Mason   Btrfs: shift all ...
699
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
700
  	schedule();
cad321ad5   Chris Mason   Btrfs: shift all ...
701
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
702
  	finish_wait(&state->wq, &wait);
d1310b2e0   Chris Mason   Btrfs: Split the ...
703
704
705
706
707
708
709
  }
  
  /*
   * 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...
710
711
  static void wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
  			    unsigned long bits)
d1310b2e0   Chris Mason   Btrfs: Split the ...
712
713
714
  {
  	struct extent_state *state;
  	struct rb_node *node;
a5dee37d3   Josef Bacik   Btrfs: deal with ...
715
  	btrfs_debug_check_extent_io_range(tree, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
716

cad321ad5   Chris Mason   Btrfs: shift all ...
717
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
718
719
720
721
722
723
  again:
  	while (1) {
  		/*
  		 * this search will find all the extents that end after
  		 * our range starts
  		 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
724
  		node = tree_search(tree, start);
c50d3e71c   Filipe Manana   Btrfs: more effic...
725
  process_node:
d1310b2e0   Chris Mason   Btrfs: Split the ...
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
  		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;
c50d3e71c   Filipe Manana   Btrfs: more effic...
745
746
747
748
  		if (!cond_resched_lock(&tree->lock)) {
  			node = rb_next(node);
  			goto process_node;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
749
750
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
751
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
752
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
753

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

1bf85046e   Jeff Mahoney   btrfs: Make exten...
760
  	set_state_cb(tree, state, bits);
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
761
  	if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
762
763
764
  		u64 range = state->end - state->start + 1;
  		tree->dirty_bytes += range;
  	}
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
765
  	state->state |= bits_to_set;
d1310b2e0   Chris Mason   Btrfs: Split the ...
766
  }
e38e2ed70   Filipe Manana   Btrfs: make find_...
767
768
769
  static void cache_state_if_flags(struct extent_state *state,
  				 struct extent_state **cached_ptr,
  				 const u64 flags)
2c64c53d8   Chris Mason   Btrfs: cache valu...
770
771
  {
  	if (cached_ptr && !(*cached_ptr)) {
e38e2ed70   Filipe Manana   Btrfs: make find_...
772
  		if (!flags || (state->state & flags)) {
2c64c53d8   Chris Mason   Btrfs: cache valu...
773
774
775
776
777
  			*cached_ptr = state;
  			atomic_inc(&state->refs);
  		}
  	}
  }
e38e2ed70   Filipe Manana   Btrfs: make find_...
778
779
780
781
782
783
  static void cache_state(struct extent_state *state,
  			struct extent_state **cached_ptr)
  {
  	return cache_state_if_flags(state, cached_ptr,
  				    EXTENT_IOBITS | EXTENT_BOUNDARY);
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
784
  /*
1edbb734b   Chris Mason   Btrfs: reduce CPU...
785
786
   * 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 ...
787
   *
1edbb734b   Chris Mason   Btrfs: reduce CPU...
788
789
790
   * 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 ...
791
   *
1edbb734b   Chris Mason   Btrfs: reduce CPU...
792
   * [start, end] is inclusive This takes the tree lock.
d1310b2e0   Chris Mason   Btrfs: Split the ...
793
   */
1edbb734b   Chris Mason   Btrfs: reduce CPU...
794

3fbe5c02a   Jeff Mahoney   btrfs: split exte...
795
796
  static int __must_check
  __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
797
798
799
  		 unsigned long bits, unsigned long exclusive_bits,
  		 u64 *failed_start, struct extent_state **cached_state,
  		 gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
800
801
802
803
  {
  	struct extent_state *state;
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
804
805
  	struct rb_node **p;
  	struct rb_node *parent;
d1310b2e0   Chris Mason   Btrfs: Split the ...
806
  	int err = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
807
808
  	u64 last_start;
  	u64 last_end;
42daec299   Chris Mason   Btrfs: fix errors...
809

a5dee37d3   Josef Bacik   Btrfs: deal with ...
810
  	btrfs_debug_check_extent_io_range(tree, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
811

0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
812
  	bits |= EXTENT_FIRST_DELALLOC;
d1310b2e0   Chris Mason   Btrfs: Split the ...
813
814
815
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
  		prealloc = alloc_extent_state(mask);
8233767a2   Xiao Guangrong   Btrfs: allocate e...
816
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
817
  	}
cad321ad5   Chris Mason   Btrfs: shift all ...
818
  	spin_lock(&tree->lock);
9655d2982   Chris Mason   Btrfs: use a cach...
819
820
  	if (cached_state && *cached_state) {
  		state = *cached_state;
df98b6e2c   Josef Bacik   Btrfs: fix how we...
821
  		if (state->start <= start && state->end > start &&
27a3507de   Filipe Manana   Btrfs: reduce siz...
822
  		    extent_state_in_tree(state)) {
9655d2982   Chris Mason   Btrfs: use a cach...
823
824
825
826
  			node = &state->rb_node;
  			goto hit_next;
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
827
828
829
830
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
831
  	node = tree_search_for_insert(tree, start, &p, &parent);
d1310b2e0   Chris Mason   Btrfs: Split the ...
832
  	if (!node) {
8233767a2   Xiao Guangrong   Btrfs: allocate e...
833
834
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
835
836
  		err = insert_state(tree, prealloc, start, end,
  				   &p, &parent, &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
837
838
  		if (err)
  			extent_io_tree_panic(tree, err);
c42ac0bc9   Filipe David Borba Manana   Btrfs: add missin...
839
  		cache_state(prealloc, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
840
  		prealloc = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
841
842
  		goto out;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
843
  	state = rb_entry(node, struct extent_state, rb_node);
40431d6c1   Chris Mason   Btrfs: optimize s...
844
  hit_next:
d1310b2e0   Chris Mason   Btrfs: Split the ...
845
846
847
848
849
850
851
852
853
854
  	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...
855
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
856
857
858
859
  			*failed_start = state->start;
  			err = -EEXIST;
  			goto out;
  		}
42daec299   Chris Mason   Btrfs: fix errors...
860

1bf85046e   Jeff Mahoney   btrfs: Make exten...
861
  		set_state_bits(tree, state, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
862
  		cache_state(state, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
863
  		merge_state(tree, state);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
864
865
866
  		if (last_end == (u64)-1)
  			goto out;
  		start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
867
868
869
870
  		state = next_state(state);
  		if (start < end && state && state->start == start &&
  		    !need_resched())
  			goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
  		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...
891
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
892
893
894
895
  			*failed_start = start;
  			err = -EEXIST;
  			goto out;
  		}
8233767a2   Xiao Guangrong   Btrfs: allocate e...
896
897
898
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
899
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
900
901
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
902
903
904
905
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
1bf85046e   Jeff Mahoney   btrfs: Make exten...
906
  			set_state_bits(tree, state, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
907
  			cache_state(state, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
908
  			merge_state(tree, state);
5c939df56   Yan Zheng   btrfs: Fix set/cl...
909
910
911
  			if (last_end == (u64)-1)
  				goto out;
  			start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
912
913
914
915
  			state = next_state(state);
  			if (start < end && state && state->start == start &&
  			    !need_resched())
  				goto hit_next;
d1310b2e0   Chris Mason   Btrfs: Split the ...
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
  		}
  		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...
931
  			this_end = last_start - 1;
8233767a2   Xiao Guangrong   Btrfs: allocate e...
932
933
934
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
c7f895a2b   Xiao Guangrong   Btrfs: fix unsafe...
935
936
937
938
939
  
  		/*
  		 * Avoid to free 'prealloc' if it can be merged with
  		 * the later extent.
  		 */
d1310b2e0   Chris Mason   Btrfs: Split the ...
940
  		err = insert_state(tree, prealloc, start, this_end,
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
941
  				   NULL, NULL, &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
942
943
  		if (err)
  			extent_io_tree_panic(tree, err);
9ed74f2db   Josef Bacik   Btrfs: proper -EN...
944
945
  		cache_state(prealloc, cached_state);
  		prealloc = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
946
947
948
949
950
951
952
953
954
955
  		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...
956
  		if (state->state & exclusive_bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
957
958
959
960
  			*failed_start = start;
  			err = -EEXIST;
  			goto out;
  		}
8233767a2   Xiao Guangrong   Btrfs: allocate e...
961
962
963
  
  		prealloc = alloc_extent_state_atomic(prealloc);
  		BUG_ON(!prealloc);
d1310b2e0   Chris Mason   Btrfs: Split the ...
964
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
965
966
  		if (err)
  			extent_io_tree_panic(tree, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
967

1bf85046e   Jeff Mahoney   btrfs: Make exten...
968
  		set_state_bits(tree, prealloc, &bits);
2c64c53d8   Chris Mason   Btrfs: cache valu...
969
  		cache_state(prealloc, cached_state);
d1310b2e0   Chris Mason   Btrfs: Split the ...
970
971
972
973
974
975
976
977
  		merge_state(tree, prealloc);
  		prealloc = NULL;
  		goto out;
  	}
  
  	goto search_again;
  
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
978
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
979
980
981
982
983
984
985
986
  	if (prealloc)
  		free_extent_state(prealloc);
  
  	return err;
  
  search_again:
  	if (start > end)
  		goto out;
cad321ad5   Chris Mason   Btrfs: shift all ...
987
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
988
989
990
991
  	if (mask & __GFP_WAIT)
  		cond_resched();
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
992

410748882   David Sterba   btrfs: use unsign...
993
994
995
  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...
996
997
998
999
  {
  	return __set_extent_bit(tree, start, end, bits, 0, failed_start,
  				cached_state, mask);
  }
462d6fac8   Josef Bacik   Btrfs: introduce ...
1000
  /**
10983f2e8   Liu Bo   Btrfs: fix typo i...
1001
1002
   * convert_extent_bit - convert all bits in a given range from one bit to
   * 			another
462d6fac8   Josef Bacik   Btrfs: introduce ...
1003
1004
1005
1006
1007
   * @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...
1008
   * @cached_state:	state that we're going to cache
462d6fac8   Josef Bacik   Btrfs: introduce ...
1009
1010
1011
1012
1013
1014
1015
1016
1017
   * @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...
1018
  		       unsigned long bits, unsigned long clear_bits,
e6138876a   Josef Bacik   Btrfs: cache exte...
1019
  		       struct extent_state **cached_state, gfp_t mask)
462d6fac8   Josef Bacik   Btrfs: introduce ...
1020
1021
1022
1023
  {
  	struct extent_state *state;
  	struct extent_state *prealloc = NULL;
  	struct rb_node *node;
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
1024
1025
  	struct rb_node **p;
  	struct rb_node *parent;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1026
1027
1028
  	int err = 0;
  	u64 last_start;
  	u64 last_end;
c8fd3de79   Filipe Manana   Btrfs: avoid retu...
1029
  	bool first_iteration = true;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1030

a5dee37d3   Josef Bacik   Btrfs: deal with ...
1031
  	btrfs_debug_check_extent_io_range(tree, start, end);
8d599ae1b   David Sterba   btrfs: add debug ...
1032

462d6fac8   Josef Bacik   Btrfs: introduce ...
1033
1034
  again:
  	if (!prealloc && (mask & __GFP_WAIT)) {
c8fd3de79   Filipe Manana   Btrfs: avoid retu...
1035
1036
1037
1038
1039
1040
1041
  		/*
  		 * Best effort, don't worry if extent state allocation fails
  		 * here for the first iteration. We might have a cached state
  		 * that matches exactly the target range, in which case no
  		 * extent state allocations are needed. We'll only know this
  		 * after locking the tree.
  		 */
462d6fac8   Josef Bacik   Btrfs: introduce ...
1042
  		prealloc = alloc_extent_state(mask);
c8fd3de79   Filipe Manana   Btrfs: avoid retu...
1043
  		if (!prealloc && !first_iteration)
462d6fac8   Josef Bacik   Btrfs: introduce ...
1044
1045
1046
1047
  			return -ENOMEM;
  	}
  
  	spin_lock(&tree->lock);
e6138876a   Josef Bacik   Btrfs: cache exte...
1048
1049
1050
  	if (cached_state && *cached_state) {
  		state = *cached_state;
  		if (state->start <= start && state->end > start &&
27a3507de   Filipe Manana   Btrfs: reduce siz...
1051
  		    extent_state_in_tree(state)) {
e6138876a   Josef Bacik   Btrfs: cache exte...
1052
1053
1054
1055
  			node = &state->rb_node;
  			goto hit_next;
  		}
  	}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1056
1057
1058
1059
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
1060
  	node = tree_search_for_insert(tree, start, &p, &parent);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1061
1062
  	if (!node) {
  		prealloc = alloc_extent_state_atomic(prealloc);
1cf4ffdb3   Liu Bo   Btrfs: drop spin ...
1063
1064
1065
1066
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
1067
1068
  		err = insert_state(tree, prealloc, start, end,
  				   &p, &parent, &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1069
1070
  		if (err)
  			extent_io_tree_panic(tree, err);
c42ac0bc9   Filipe David Borba Manana   Btrfs: add missin...
1071
1072
  		cache_state(prealloc, cached_state);
  		prealloc = NULL;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
  		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 ...
1087
  		set_state_bits(tree, state, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1088
  		cache_state(state, cached_state);
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1089
  		state = clear_state_bit(tree, state, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1090
1091
  		if (last_end == (u64)-1)
  			goto out;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1092
  		start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1093
1094
1095
  		if (start < end && state && state->start == start &&
  		    !need_resched())
  			goto hit_next;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  		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 ...
1117
1118
1119
1120
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1121
  		err = split_state(tree, state, prealloc, start);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1122
1123
  		if (err)
  			extent_io_tree_panic(tree, err);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1124
1125
1126
1127
1128
  		prealloc = NULL;
  		if (err)
  			goto out;
  		if (state->end <= end) {
  			set_state_bits(tree, state, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1129
  			cache_state(state, cached_state);
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1130
  			state = clear_state_bit(tree, state, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1131
1132
1133
  			if (last_end == (u64)-1)
  				goto out;
  			start = last_end + 1;
d1ac6e41d   Liu Bo   Btrfs: use fastpa...
1134
1135
1136
  			if (start < end && state && state->start == start &&
  			    !need_resched())
  				goto hit_next;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
  		}
  		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 ...
1155
1156
1157
1158
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1159
1160
1161
1162
1163
1164
  
  		/*
  		 * Avoid to free 'prealloc' if it can be merged with
  		 * the later extent.
  		 */
  		err = insert_state(tree, prealloc, start, this_end,
12cfbad90   Filipe David Borba Manana   Btrfs: more effic...
1165
  				   NULL, NULL, &bits);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1166
1167
  		if (err)
  			extent_io_tree_panic(tree, err);
e6138876a   Josef Bacik   Btrfs: cache exte...
1168
  		cache_state(prealloc, cached_state);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
  		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 ...
1181
1182
1183
1184
  		if (!prealloc) {
  			err = -ENOMEM;
  			goto out;
  		}
462d6fac8   Josef Bacik   Btrfs: introduce ...
1185
1186
  
  		err = split_state(tree, state, prealloc, end + 1);
c2d904e08   Jeff Mahoney   btrfs: Catch lock...
1187
1188
  		if (err)
  			extent_io_tree_panic(tree, err);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1189
1190
  
  		set_state_bits(tree, prealloc, &bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1191
  		cache_state(prealloc, cached_state);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1192
  		clear_state_bit(tree, prealloc, &clear_bits, 0);
462d6fac8   Josef Bacik   Btrfs: introduce ...
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
  		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();
c8fd3de79   Filipe Manana   Btrfs: avoid retu...
1212
  	first_iteration = false;
462d6fac8   Josef Bacik   Btrfs: introduce ...
1213
1214
  	goto again;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1215
1216
1217
1218
  /* 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...
1219
  	return set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1220
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1221
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1222
1223
  
  int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1224
  		    unsigned long bits, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1225
  {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1226
  	return set_extent_bit(tree, start, end, bits, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1227
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1228
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1229
1230
  
  int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1231
  		      unsigned long bits, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1232
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1233
  	return clear_extent_bit(tree, start, end, bits, 0, 0, NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1234
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1235
1236
  
  int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
1237
  			struct extent_state **cached_state, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1238
1239
  {
  	return set_extent_bit(tree, start, end,
fee187d9d   Liu Bo   Btrfs: do not set...
1240
  			      EXTENT_DELALLOC | EXTENT_UPTODATE,
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1241
  			      NULL, cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1242
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1243

9e8a4a8b0   Liu Bo   Btrfs: use flag E...
1244
1245
1246
1247
1248
1249
1250
  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 ...
1251
1252
1253
1254
  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...
1255
  				EXTENT_DIRTY | EXTENT_DELALLOC |
0ca1f7ceb   Yan, Zheng   Btrfs: Update met...
1256
  				EXTENT_DO_ACCOUNTING, 0, 0, NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1257
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1258
1259
1260
1261
  
  int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
  		     gfp_t mask)
  {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1262
  	return set_extent_bit(tree, start, end, EXTENT_NEW, NULL,
2c64c53d8   Chris Mason   Btrfs: cache valu...
1263
  			      NULL, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1264
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1265

d1310b2e0   Chris Mason   Btrfs: Split the ...
1266
  int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
507903b81   Arne Jansen   btrfs: using cach...
1267
  			struct extent_state **cached_state, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1268
  {
6b67a3200   Liu Bo   Btrfs: pass NULL ...
1269
  	return set_extent_bit(tree, start, end, EXTENT_UPTODATE, NULL,
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1270
  			      cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1271
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1272

5fd020435   Josef Bacik   Btrfs: finish ord...
1273
1274
  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 ...
1275
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1276
  	return clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
1277
  				cached_state, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1278
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1279

d352ac681   Chris Mason   Btrfs: add and im...
1280
1281
1282
1283
  /*
   * 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...
1284
  int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
410748882   David Sterba   btrfs: use unsign...
1285
  		     unsigned long bits, struct extent_state **cached_state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1286
1287
1288
1289
  {
  	int err;
  	u64 failed_start;
  	while (1) {
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1290
1291
1292
  		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...
1293
  		if (err == -EEXIST) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1294
1295
  			wait_extent_bit(tree, failed_start, end, EXTENT_LOCKED);
  			start = failed_start;
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1296
  		} else
d1310b2e0   Chris Mason   Btrfs: Split the ...
1297
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1298
1299
1300
1301
  		WARN_ON(start > end);
  	}
  	return err;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1302

d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1303
  int lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
1edbb734b   Chris Mason   Btrfs: reduce CPU...
1304
  {
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1305
  	return lock_extent_bits(tree, start, end, 0, NULL);
1edbb734b   Chris Mason   Btrfs: reduce CPU...
1306
  }
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1307
  int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
251792013   Josef Bacik   Btrfs: nuke fs wi...
1308
1309
1310
  {
  	int err;
  	u64 failed_start;
3fbe5c02a   Jeff Mahoney   btrfs: split exte...
1311
1312
  	err = __set_extent_bit(tree, start, end, EXTENT_LOCKED, EXTENT_LOCKED,
  			       &failed_start, NULL, GFP_NOFS);
6643558db   Yan Zheng   Btrfs: Fix booken...
1313
1314
1315
  	if (err == -EEXIST) {
  		if (failed_start > start)
  			clear_extent_bit(tree, start, failed_start - 1,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1316
  					 EXTENT_LOCKED, 1, 0, NULL, GFP_NOFS);
251792013   Josef Bacik   Btrfs: nuke fs wi...
1317
  		return 0;
6643558db   Yan Zheng   Btrfs: Fix booken...
1318
  	}
251792013   Josef Bacik   Btrfs: nuke fs wi...
1319
1320
  	return 1;
  }
251792013   Josef Bacik   Btrfs: nuke fs wi...
1321

2c64c53d8   Chris Mason   Btrfs: cache valu...
1322
1323
1324
1325
1326
1327
  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...
1328
  int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1329
  {
2c64c53d8   Chris Mason   Btrfs: cache valu...
1330
  	return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, NULL,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1331
  				GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1332
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1333

4adaa6110   Chris Mason   Btrfs: fix race b...
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
  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 ...
1366
  /*
d1310b2e0   Chris Mason   Btrfs: Split the ...
1367
1368
   * helper function to set both pages and extents in the tree writeback
   */
b2950863c   Christoph Hellwig   Btrfs: make thing...
1369
  static int set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1370
1371
1372
1373
1374
1375
1376
  {
  	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...
1377
  		BUG_ON(!page); /* Pages should be in the extent_io_tree */
d1310b2e0   Chris Mason   Btrfs: Split the ...
1378
1379
1380
1381
  		set_page_writeback(page);
  		page_cache_release(page);
  		index++;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
1382
1383
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1384

d352ac681   Chris Mason   Btrfs: add and im...
1385
1386
1387
1388
  /* 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...
1389
1390
  static struct extent_state *
  find_first_extent_bit_state(struct extent_io_tree *tree,
410748882   David Sterba   btrfs: use unsign...
1391
  			    u64 start, unsigned long bits)
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1392
1393
1394
1395
1396
1397
1398
1399
1400
  {
  	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...
1401
  	if (!node)
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1402
  		goto out;
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1403

d397712bc   Chris Mason   Btrfs: Fix checkp...
1404
  	while (1) {
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1405
  		state = rb_entry(node, struct extent_state, rb_node);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1406
  		if (state->end >= start && (state->state & bits))
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1407
  			return state;
d397712bc   Chris Mason   Btrfs: Fix checkp...
1408

d7fc640e6   Chris Mason   Btrfs: Allocator ...
1409
1410
1411
1412
1413
1414
1415
  		node = rb_next(node);
  		if (!node)
  			break;
  	}
  out:
  	return NULL;
  }
d7fc640e6   Chris Mason   Btrfs: Allocator ...
1416

d352ac681   Chris Mason   Btrfs: add and im...
1417
  /*
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1418
1419
1420
1421
   * 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...
1422
   * If nothing was found, 1 is returned. If found something, return 0.
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1423
1424
   */
  int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
410748882   David Sterba   btrfs: use unsign...
1425
  			  u64 *start_ret, u64 *end_ret, unsigned long bits,
e6138876a   Josef Bacik   Btrfs: cache exte...
1426
  			  struct extent_state **cached_state)
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1427
1428
  {
  	struct extent_state *state;
e6138876a   Josef Bacik   Btrfs: cache exte...
1429
  	struct rb_node *n;
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1430
1431
1432
  	int ret = 1;
  
  	spin_lock(&tree->lock);
e6138876a   Josef Bacik   Btrfs: cache exte...
1433
1434
  	if (cached_state && *cached_state) {
  		state = *cached_state;
27a3507de   Filipe Manana   Btrfs: reduce siz...
1435
  		if (state->end == start - 1 && extent_state_in_tree(state)) {
e6138876a   Josef Bacik   Btrfs: cache exte...
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
  			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...
1451
  	state = find_first_extent_bit_state(tree, start, bits);
e6138876a   Josef Bacik   Btrfs: cache exte...
1452
  got_it:
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1453
  	if (state) {
e38e2ed70   Filipe Manana   Btrfs: make find_...
1454
  		cache_state_if_flags(state, cached_state, 0);
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1455
1456
1457
1458
  		*start_ret = state->start;
  		*end_ret = state->end;
  		ret = 0;
  	}
e6138876a   Josef Bacik   Btrfs: cache exte...
1459
  out:
69261c4b6   Xiao Guangrong   Btrfs: clean up f...
1460
1461
1462
1463
1464
  	spin_unlock(&tree->lock);
  	return ret;
  }
  
  /*
d352ac681   Chris Mason   Btrfs: add and im...
1465
1466
1467
1468
1469
   * 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...
1470
  static noinline u64 find_delalloc_range(struct extent_io_tree *tree,
c2a128d28   Josef Bacik   Btrfs: cache exte...
1471
1472
  					u64 *start, u64 *end, u64 max_bytes,
  					struct extent_state **cached_state)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1473
1474
1475
1476
1477
1478
  {
  	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 ...
1479
  	spin_lock(&tree->lock);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1480

d1310b2e0   Chris Mason   Btrfs: Split the ...
1481
1482
1483
1484
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1485
  	node = tree_search(tree, cur_start);
2b114d1d3   Peter   Btrfs: Correct us...
1486
  	if (!node) {
3b951516e   Chris Mason   Btrfs: Use the ex...
1487
1488
  		if (!found)
  			*end = (u64)-1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1489
1490
  		goto out;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
1491
  	while (1) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1492
  		state = rb_entry(node, struct extent_state, rb_node);
5b21f2ed3   Zheng Yan   Btrfs: extent_map...
1493
1494
  		if (found && (state->start != cur_start ||
  			      (state->state & EXTENT_BOUNDARY))) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1495
1496
1497
1498
1499
1500
1501
  			goto out;
  		}
  		if (!(state->state & EXTENT_DELALLOC)) {
  			if (!found)
  				*end = state->end;
  			goto out;
  		}
c2a128d28   Josef Bacik   Btrfs: cache exte...
1502
  		if (!found) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1503
  			*start = state->start;
c2a128d28   Josef Bacik   Btrfs: cache exte...
1504
1505
1506
  			*cached_state = state;
  			atomic_inc(&state->refs);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
1507
1508
1509
1510
  		found++;
  		*end = state->end;
  		cur_start = state->end + 1;
  		node = rb_next(node);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1511
  		total_bytes += state->end - state->start + 1;
7bf811a59   Josef Bacik   Btrfs: limit dela...
1512
  		if (total_bytes >= max_bytes)
573aecafc   Josef Bacik   Btrfs: actually l...
1513
  			break;
573aecafc   Josef Bacik   Btrfs: actually l...
1514
  		if (!node)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1515
1516
1517
  			break;
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1518
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1519
1520
  	return found;
  }
143bede52   Jeff Mahoney   btrfs: return voi...
1521
1522
1523
  static noinline void __unlock_for_delalloc(struct inode *inode,
  					   struct page *locked_page,
  					   u64 start, u64 end)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1524
1525
1526
1527
1528
1529
1530
1531
1532
  {
  	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...
1533
  		return;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1534

d397712bc   Chris Mason   Btrfs: Fix checkp...
1535
  	while (nr_pages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1536
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1537
1538
  				     min_t(unsigned long, nr_pages,
  				     ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1539
1540
1541
1542
1543
1544
1545
1546
1547
  		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...
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
  }
  
  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...
1570
  	while (nrpages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1571
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1572
1573
  				     min_t(unsigned long,
  				     nrpages, ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
  		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...
1584
  			if (pages[i] != locked_page) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1585
  				lock_page(pages[i]);
f2b1c41cf   Chris Mason   Btrfs: Make sure ...
1586
1587
  				if (!PageDirty(pages[i]) ||
  				    pages[i]->mapping != inode->i_mapping) {
771ed689d   Chris Mason   Btrfs: Optimize c...
1588
1589
1590
1591
1592
1593
  					ret = -EAGAIN;
  					unlock_page(pages[i]);
  					page_cache_release(pages[i]);
  					goto done;
  				}
  			}
c8b978188   Chris Mason   Btrfs: Add zlib c...
1594
  			page_cache_release(pages[i]);
771ed689d   Chris Mason   Btrfs: Optimize c...
1595
  			pages_locked++;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1596
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
  		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
   */
294e30fee   Josef Bacik   Btrfs: add tests ...
1618
1619
1620
1621
  STATIC u64 find_lock_delalloc_range(struct inode *inode,
  				    struct extent_io_tree *tree,
  				    struct page *locked_page, u64 *start,
  				    u64 *end, u64 max_bytes)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1622
1623
1624
1625
  {
  	u64 delalloc_start;
  	u64 delalloc_end;
  	u64 found;
9655d2982   Chris Mason   Btrfs: use a cach...
1626
  	struct extent_state *cached_state = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1627
1628
1629
1630
1631
1632
1633
1634
  	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...
1635
  				    max_bytes, &cached_state);
70b99e695   Chris Mason   Btrfs: Compressio...
1636
  	if (!found || delalloc_end <= *start) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1637
1638
  		*start = delalloc_start;
  		*end = delalloc_end;
c2a128d28   Josef Bacik   Btrfs: cache exte...
1639
  		free_extent_state(cached_state);
385fe0bed   Liu Bo   Btrfs: fix crash ...
1640
  		return 0;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1641
1642
1643
  	}
  
  	/*
70b99e695   Chris Mason   Btrfs: Compressio...
1644
1645
1646
1647
  	 * 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...
1648
  	if (delalloc_start < *start)
70b99e695   Chris Mason   Btrfs: Compressio...
1649
  		delalloc_start = *start;
70b99e695   Chris Mason   Btrfs: Compressio...
1650
1651
  
  	/*
c8b978188   Chris Mason   Btrfs: Add zlib c...
1652
  	 * make sure to limit the number of pages we try to lock down
c8b978188   Chris Mason   Btrfs: Add zlib c...
1653
  	 */
7bf811a59   Josef Bacik   Btrfs: limit dela...
1654
1655
  	if (delalloc_end + 1 - delalloc_start > max_bytes)
  		delalloc_end = delalloc_start + max_bytes - 1;
d397712bc   Chris Mason   Btrfs: Fix checkp...
1656

c8b978188   Chris Mason   Btrfs: Add zlib c...
1657
1658
1659
1660
1661
1662
1663
  	/* 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...
1664
  		free_extent_state(cached_state);
7d7887427   Chris Mason   Btrfs: fix double...
1665
  		cached_state = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1666
  		if (!loops) {
7bf811a59   Josef Bacik   Btrfs: limit dela...
1667
  			max_bytes = PAGE_CACHE_SIZE;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1668
1669
1670
1671
1672
1673
1674
  			loops = 1;
  			goto again;
  		} else {
  			found = 0;
  			goto out_failed;
  		}
  	}
79787eaab   Jeff Mahoney   btrfs: replace ma...
1675
  	BUG_ON(ret); /* Only valid values are 0 and -EAGAIN */
c8b978188   Chris Mason   Btrfs: Add zlib c...
1676
1677
  
  	/* step three, lock the state bits for the whole range */
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
1678
  	lock_extent_bits(tree, delalloc_start, delalloc_end, 0, &cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1679
1680
1681
  
  	/* 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...
1682
  			     EXTENT_DELALLOC, 1, cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1683
  	if (!ret) {
9655d2982   Chris Mason   Btrfs: use a cach...
1684
1685
  		unlock_extent_cached(tree, delalloc_start, delalloc_end,
  				     &cached_state, GFP_NOFS);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1686
1687
1688
1689
1690
  		__unlock_for_delalloc(inode, locked_page,
  			      delalloc_start, delalloc_end);
  		cond_resched();
  		goto again;
  	}
9655d2982   Chris Mason   Btrfs: use a cach...
1691
  	free_extent_state(cached_state);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1692
1693
1694
1695
1696
  	*start = delalloc_start;
  	*end = delalloc_end;
  out_failed:
  	return found;
  }
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1697
1698
1699
1700
  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...
1701
  {
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1702
  	struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
c8b978188   Chris Mason   Btrfs: Add zlib c...
1703
1704
1705
1706
1707
1708
  	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...
1709

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

704de49d2   Filipe Manana   Btrfs: set page a...
1714
1715
  	if ((page_ops & PAGE_SET_ERROR) && nr_pages > 0)
  		mapping_set_error(inode->i_mapping, -EIO);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1716
  	while (nr_pages > 0) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
1717
  		ret = find_get_pages_contig(inode->i_mapping, index,
5b050f04c   Chris Mason   Btrfs: Fix compil...
1718
1719
  				     min_t(unsigned long,
  				     nr_pages, ARRAY_SIZE(pages)), pages);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1720
  		for (i = 0; i < ret; i++) {
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
1721

c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1722
  			if (page_ops & PAGE_SET_PRIVATE2)
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
1723
  				SetPagePrivate2(pages[i]);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1724
1725
1726
1727
  			if (pages[i] == locked_page) {
  				page_cache_release(pages[i]);
  				continue;
  			}
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1728
  			if (page_ops & PAGE_CLEAR_DIRTY)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1729
  				clear_page_dirty_for_io(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1730
  			if (page_ops & PAGE_SET_WRITEBACK)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1731
  				set_page_writeback(pages[i]);
704de49d2   Filipe Manana   Btrfs: set page a...
1732
1733
  			if (page_ops & PAGE_SET_ERROR)
  				SetPageError(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1734
  			if (page_ops & PAGE_END_WRITEBACK)
c8b978188   Chris Mason   Btrfs: Add zlib c...
1735
  				end_page_writeback(pages[i]);
c2790a2e2   Josef Bacik   Btrfs: cleanup ar...
1736
  			if (page_ops & PAGE_UNLOCK)
771ed689d   Chris Mason   Btrfs: Optimize c...
1737
  				unlock_page(pages[i]);
c8b978188   Chris Mason   Btrfs: Add zlib c...
1738
1739
1740
1741
1742
1743
1744
1745
  			page_cache_release(pages[i]);
  		}
  		nr_pages -= ret;
  		index += ret;
  		cond_resched();
  	}
  	return 0;
  }
c8b978188   Chris Mason   Btrfs: Add zlib c...
1746

d352ac681   Chris Mason   Btrfs: add and im...
1747
1748
1749
1750
1751
  /*
   * 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 ...
1752
1753
  u64 count_range_bits(struct extent_io_tree *tree,
  		     u64 *start, u64 search_end, u64 max_bytes,
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1754
  		     unsigned long bits, int contig)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1755
1756
1757
1758
1759
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	u64 cur_start = *start;
  	u64 total_bytes = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1760
  	u64 last = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1761
  	int found = 0;
fae7f21ce   Dulshani Gunawardhana   btrfs: Use WARN_O...
1762
  	if (WARN_ON(search_end <= cur_start))
d1310b2e0   Chris Mason   Btrfs: Split the ...
1763
  		return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1764

cad321ad5   Chris Mason   Btrfs: shift all ...
1765
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1766
1767
1768
1769
1770
1771
1772
1773
  	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...
1774
  	node = tree_search(tree, cur_start);
d397712bc   Chris Mason   Btrfs: Fix checkp...
1775
  	if (!node)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1776
  		goto out;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1777

d397712bc   Chris Mason   Btrfs: Fix checkp...
1778
  	while (1) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1779
1780
1781
  		state = rb_entry(node, struct extent_state, rb_node);
  		if (state->start > search_end)
  			break;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1782
1783
1784
  		if (contig && found && state->start > last + 1)
  			break;
  		if (state->end >= cur_start && (state->state & bits) == bits) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1785
1786
1787
1788
1789
  			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_...
1790
  				*start = max(cur_start, state->start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1791
1792
  				found = 1;
  			}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
1793
1794
1795
  			last = state->end;
  		} else if (contig && found) {
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1796
1797
1798
1799
1800
1801
  		}
  		node = rb_next(node);
  		if (!node)
  			break;
  	}
  out:
cad321ad5   Chris Mason   Btrfs: shift all ...
1802
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1803
1804
  	return total_bytes;
  }
b2950863c   Christoph Hellwig   Btrfs: make thing...
1805

d352ac681   Chris Mason   Btrfs: add and im...
1806
1807
1808
1809
  /*
   * 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 ...
1810
  static int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1811
1812
1813
1814
  {
  	struct rb_node *node;
  	struct extent_state *state;
  	int ret = 0;
cad321ad5   Chris Mason   Btrfs: shift all ...
1815
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1816
1817
1818
1819
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1820
  	node = tree_search(tree, start);
2b114d1d3   Peter   Btrfs: Correct us...
1821
  	if (!node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
  		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 ...
1832
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1833
1834
1835
1836
1837
1838
1839
1840
  	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 ...
1841
  	spin_lock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1842
1843
1844
1845
  	/*
  	 * this search will find all the extents that end after
  	 * our range starts.
  	 */
80ea96b1f   Chris Mason   Btrfs: Add a look...
1846
  	node = tree_search(tree, start);
2b114d1d3   Peter   Btrfs: Correct us...
1847
  	if (!node) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
  		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 ...
1858
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1859
1860
1861
1862
1863
  	return ret;
  }
  
  /*
   * searches a range in the state tree for a given mask.
70dec8079   Chris Mason   Btrfs: extent_io ...
1864
   * If 'filled' == 1, this returns 1 only if every extent in the tree
d1310b2e0   Chris Mason   Btrfs: Split the ...
1865
1866
1867
1868
   * 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...
1869
  		   unsigned long bits, int filled, struct extent_state *cached)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1870
1871
1872
1873
  {
  	struct extent_state *state = NULL;
  	struct rb_node *node;
  	int bitset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1874

cad321ad5   Chris Mason   Btrfs: shift all ...
1875
  	spin_lock(&tree->lock);
27a3507de   Filipe Manana   Btrfs: reduce siz...
1876
  	if (cached && extent_state_in_tree(cached) && cached->start <= start &&
df98b6e2c   Josef Bacik   Btrfs: fix how we...
1877
  	    cached->end > start)
9655d2982   Chris Mason   Btrfs: use a cach...
1878
1879
1880
  		node = &cached->rb_node;
  	else
  		node = tree_search(tree, start);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
  	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...
1900
1901
1902
  
  		if (state->end == (u64)-1)
  			break;
d1310b2e0   Chris Mason   Btrfs: Split the ...
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
  		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 ...
1913
  	spin_unlock(&tree->lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1914
1915
  	return bitset;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
1916
1917
1918
1919
1920
  
  /*
   * 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...
1921
  static void check_page_uptodate(struct extent_io_tree *tree, struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
1922
  {
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
1923
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1924
  	u64 end = start + PAGE_CACHE_SIZE - 1;
9655d2982   Chris Mason   Btrfs: use a cach...
1925
  	if (test_range_bit(tree, start, end, EXTENT_UPTODATE, 1, NULL))
d1310b2e0   Chris Mason   Btrfs: Split the ...
1926
  		SetPageUptodate(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
1927
  }
8b110e393   Miao Xie   Btrfs: implement ...
1928
  int free_io_failure(struct inode *inode, struct io_failure_record *rec)
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
  {
  	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 ...
1940
1941
1942
1943
1944
  	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...
1945
1946
1947
1948
  
  	kfree(rec);
  	return err;
  }
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1949
1950
1951
1952
1953
  /*
   * 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...
1954
   * to avoid any synchronization issues, wait for the data after writing, which
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1955
1956
1957
1958
   * 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.
   */
1203b6813   Miao Xie   Btrfs: modify cle...
1959
1960
  int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical,
  		      struct page *page, unsigned int pg_offset, int mirror_num)
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1961
  {
1203b6813   Miao Xie   Btrfs: modify cle...
1962
  	struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1963
1964
  	struct bio *bio;
  	struct btrfs_device *dev;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1965
1966
1967
  	u64 map_length = 0;
  	u64 sector;
  	struct btrfs_bio *bbio = NULL;
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
1968
  	struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1969
  	int ret;
908960c6c   Ilya Dryomov   Btrfs: disable on...
1970
  	ASSERT(!(fs_info->sb->s_flags & MS_RDONLY));
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1971
  	BUG_ON(!mirror_num);
53b381b3a   David Woodhouse   Btrfs: RAID5 and ...
1972
1973
1974
  	/* 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...
1975
  	bio = btrfs_io_bio_alloc(GFP_NOFS, 1);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1976
1977
  	if (!bio)
  		return -EIO;
4f024f379   Kent Overstreet   block: Abstract o...
1978
  	bio->bi_iter.bi_size = 0;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1979
  	map_length = length;
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
1980
  	ret = btrfs_map_block(fs_info, WRITE, logical,
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1981
1982
1983
1984
1985
1986
1987
  			      &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;
4f024f379   Kent Overstreet   block: Abstract o...
1988
  	bio->bi_iter.bi_sector = sector;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1989
1990
1991
1992
1993
1994
1995
  	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;
ffdd2018d   Miao Xie   Btrfs: modify rep...
1996
  	bio_add_page(bio, page, length, pg_offset);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1997

33879d451   Kent Overstreet   block: submit_bio...
1998
  	if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) {
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
1999
2000
  		/* try to remap that extent elsewhere? */
  		bio_put(bio);
442a4f630   Stefan Behrens   Btrfs: add device...
2001
  		btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2002
2003
  		return -EIO;
  	}
efe120a06   Frank Holton   Btrfs: convert pr...
2004
  	printk_ratelimited_in_rcu(KERN_INFO
1203b6813   Miao Xie   Btrfs: modify cle...
2005
2006
2007
2008
  				  "BTRFS: read error corrected: ino %llu off %llu (dev %s sector %llu)
  ",
  				  btrfs_ino(inode), start,
  				  rcu_str_deref(dev->name), sector);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2009
2010
2011
  	bio_put(bio);
  	return 0;
  }
ea4667940   Josef Bacik   Btrfs: deal with ...
2012
2013
2014
  int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
  			 int mirror_num)
  {
ea4667940   Josef Bacik   Btrfs: deal with ...
2015
2016
  	u64 start = eb->start;
  	unsigned long i, num_pages = num_extent_pages(eb->start, eb->len);
d95603b26   Chris Mason   Btrfs: fix uninit...
2017
  	int ret = 0;
ea4667940   Josef Bacik   Btrfs: deal with ...
2018

908960c6c   Ilya Dryomov   Btrfs: disable on...
2019
2020
  	if (root->fs_info->sb->s_flags & MS_RDONLY)
  		return -EROFS;
ea4667940   Josef Bacik   Btrfs: deal with ...
2021
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
2022
  		struct page *p = eb->pages[i];
1203b6813   Miao Xie   Btrfs: modify cle...
2023
2024
2025
2026
  
  		ret = repair_io_failure(root->fs_info->btree_inode, start,
  					PAGE_CACHE_SIZE, start, p,
  					start - page_offset(p), mirror_num);
ea4667940   Josef Bacik   Btrfs: deal with ...
2027
2028
2029
2030
2031
2032
2033
  		if (ret)
  			break;
  		start += PAGE_CACHE_SIZE;
  	}
  
  	return ret;
  }
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2034
2035
2036
2037
  /*
   * 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
   */
8b110e393   Miao Xie   Btrfs: implement ...
2038
2039
  int clean_io_failure(struct inode *inode, u64 start, struct page *page,
  		     unsigned int pg_offset)
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2040
2041
2042
2043
  {
  	u64 private;
  	u64 private_failure;
  	struct io_failure_record *failrec;
908960c6c   Ilya Dryomov   Btrfs: disable on...
2044
  	struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2045
2046
  	struct extent_state *state;
  	int num_copies;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2047
  	int ret;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
  
  	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);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2068
2069
  		goto out;
  	}
908960c6c   Ilya Dryomov   Btrfs: disable on...
2070
2071
  	if (fs_info->sb->s_flags & MS_RDONLY)
  		goto out;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2072
2073
2074
2075
2076
2077
  
  	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 ...
2078
2079
  	if (state && state->start <= failrec->start &&
  	    state->end >= failrec->start + failrec->len - 1) {
3ec706c83   Stefan Behrens   Btrfs: pass fs_in...
2080
2081
  		num_copies = btrfs_num_copies(fs_info, failrec->logical,
  					      failrec->len);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2082
  		if (num_copies > 1)  {
1203b6813   Miao Xie   Btrfs: modify cle...
2083
  			repair_io_failure(inode, start, failrec->len,
454ff3de4   Miao Xie   Btrfs: Cleanup un...
2084
  					  failrec->logical, page,
1203b6813   Miao Xie   Btrfs: modify cle...
2085
  					  pg_offset, failrec->failed_mirror);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2086
2087
2088
2089
  		}
  	}
  
  out:
454ff3de4   Miao Xie   Btrfs: Cleanup un...
2090
  	free_io_failure(inode, failrec);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2091

454ff3de4   Miao Xie   Btrfs: Cleanup un...
2092
  	return 0;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2093
  }
f612496bc   Miao Xie   Btrfs: cleanup th...
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
  /*
   * Can be called when
   * - hold extent lock
   * - under ordered extent
   * - the inode is freeing
   */
  void btrfs_free_io_failure_record(struct inode *inode, u64 start, u64 end)
  {
  	struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree;
  	struct io_failure_record *failrec;
  	struct extent_state *state, *next;
  
  	if (RB_EMPTY_ROOT(&failure_tree->state))
  		return;
  
  	spin_lock(&failure_tree->lock);
  	state = find_first_extent_bit_state(failure_tree, start, EXTENT_DIRTY);
  	while (state) {
  		if (state->start > end)
  			break;
  
  		ASSERT(state->end <= end);
  
  		next = next_state(state);
  
  		failrec = (struct io_failure_record *)state->private;
  		free_extent_state(state);
  		kfree(failrec);
  
  		state = next;
  	}
  	spin_unlock(&failure_tree->lock);
  }
2fe6303e7   Miao Xie   Btrfs: split bio_...
2127
2128
  int btrfs_get_io_failure_record(struct inode *inode, u64 start, u64 end,
  				struct io_failure_record **failrec_ret)
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2129
  {
2fe6303e7   Miao Xie   Btrfs: split bio_...
2130
  	struct io_failure_record *failrec;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2131
2132
  	u64 private;
  	struct extent_map *em;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2133
2134
2135
  	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;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2136
  	int ret;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2137
  	u64 logical;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2138
2139
2140
2141
2142
  	ret = get_state_private(failure_tree, start, &private);
  	if (ret) {
  		failrec = kzalloc(sizeof(*failrec), GFP_NOFS);
  		if (!failrec)
  			return -ENOMEM;
2fe6303e7   Miao Xie   Btrfs: split bio_...
2143

4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
  		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;
  		}
68ba990f7   Filipe David Borba Manana   Btrfs: fix extent...
2157
  		if (em->start > start || em->start + em->len <= start) {
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2158
2159
2160
2161
  			free_extent_map(em);
  			em = NULL;
  		}
  		read_unlock(&em_tree->lock);
7a2d6a646   Tsutomu Itoh   Btrfs: remove unn...
2162
  		if (!em) {
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2163
2164
2165
  			kfree(failrec);
  			return -EIO;
  		}
2fe6303e7   Miao Xie   Btrfs: split bio_...
2166

4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2167
2168
2169
2170
2171
2172
2173
2174
  		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);
  		}
2fe6303e7   Miao Xie   Btrfs: split bio_...
2175
2176
2177
2178
  
  		pr_debug("Get IO Failure Record: (new) logical=%llu, start=%llu, len=%llu
  ",
  			 logical, start, failrec->len);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
  		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;
2fe6303e7   Miao Xie   Btrfs: split bio_...
2198
2199
  		pr_debug("Get IO Failure Record: (found) logical=%llu, start=%llu, len=%llu, validation=%d
  ",
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2200
2201
2202
2203
2204
2205
2206
2207
  			 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.
  		 */
  	}
2fe6303e7   Miao Xie   Btrfs: split bio_...
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
  
  	*failrec_ret = failrec;
  
  	return 0;
  }
  
  int btrfs_check_repairable(struct inode *inode, struct bio *failed_bio,
  			   struct io_failure_record *failrec, int failed_mirror)
  {
  	int num_copies;
5d9640517   Stefan Behrens   Btrfs: Pass fs_in...
2218
2219
  	num_copies = btrfs_num_copies(BTRFS_I(inode)->root->fs_info,
  				      failrec->logical, failrec->len);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2220
2221
2222
2223
2224
2225
  	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.
  		 */
2fe6303e7   Miao Xie   Btrfs: split bio_...
2226
2227
  		pr_debug("Check Repairable: cannot repair, num_copies=%d, next_mirror %d, failed_mirror %d
  ",
09a7f7a28   Miao Xie   Btrfs: remove unn...
2228
  			 num_copies, failrec->this_mirror, failed_mirror);
2fe6303e7   Miao Xie   Btrfs: split bio_...
2229
  		return 0;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2230
  	}
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
  	/*
  	 * 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;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
  	} 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++;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2263
  	}
facc8a224   Miao Xie   Btrfs: don't cach...
2264
  	if (failrec->this_mirror > num_copies) {
2fe6303e7   Miao Xie   Btrfs: split bio_...
2265
2266
  		pr_debug("Check Repairable: (fail) num_copies=%d, next_mirror %d, failed_mirror %d
  ",
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2267
  			 num_copies, failrec->this_mirror, failed_mirror);
2fe6303e7   Miao Xie   Btrfs: split bio_...
2268
  		return 0;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2269
  	}
2fe6303e7   Miao Xie   Btrfs: split bio_...
2270
2271
2272
2273
2274
2275
2276
  	return 1;
  }
  
  
  struct bio *btrfs_create_repair_bio(struct inode *inode, struct bio *failed_bio,
  				    struct io_failure_record *failrec,
  				    struct page *page, int pg_offset, int icsum,
8b110e393   Miao Xie   Btrfs: implement ...
2277
  				    bio_end_io_t *endio_func, void *data)
2fe6303e7   Miao Xie   Btrfs: split bio_...
2278
2279
2280
2281
  {
  	struct bio *bio;
  	struct btrfs_io_bio *btrfs_failed_bio;
  	struct btrfs_io_bio *btrfs_bio;
9be3395bc   Chris Mason   Btrfs: use a btrf...
2282
  	bio = btrfs_io_bio_alloc(GFP_NOFS, 1);
2fe6303e7   Miao Xie   Btrfs: split bio_...
2283
2284
2285
2286
  	if (!bio)
  		return NULL;
  
  	bio->bi_end_io = endio_func;
4f024f379   Kent Overstreet   block: Abstract o...
2287
  	bio->bi_iter.bi_sector = failrec->logical >> 9;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2288
  	bio->bi_bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
4f024f379   Kent Overstreet   block: Abstract o...
2289
  	bio->bi_iter.bi_size = 0;
8b110e393   Miao Xie   Btrfs: implement ...
2290
  	bio->bi_private = data;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2291

facc8a224   Miao Xie   Btrfs: don't cach...
2292
2293
2294
2295
2296
2297
2298
  	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;
2fe6303e7   Miao Xie   Btrfs: split bio_...
2299
2300
  		icsum *= csum_size;
  		memcpy(btrfs_bio->csum, btrfs_failed_bio->csum + icsum,
facc8a224   Miao Xie   Btrfs: don't cach...
2301
2302
  		       csum_size);
  	}
2fe6303e7   Miao Xie   Btrfs: split bio_...
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
  	bio_add_page(bio, page, failrec->len, pg_offset);
  
  	return bio;
  }
  
  /*
   * 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
   */
  
  static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
  			      struct page *page, u64 start, u64 end,
  			      int failed_mirror)
  {
  	struct io_failure_record *failrec;
  	struct inode *inode = page->mapping->host;
  	struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
  	struct bio *bio;
  	int read_mode;
  	int ret;
  
  	BUG_ON(failed_bio->bi_rw & REQ_WRITE);
  
  	ret = btrfs_get_io_failure_record(inode, start, end, &failrec);
  	if (ret)
  		return ret;
  
  	ret = btrfs_check_repairable(inode, failed_bio, failrec, failed_mirror);
  	if (!ret) {
  		free_io_failure(inode, failrec);
  		return -EIO;
  	}
  
  	if (failed_bio->bi_vcnt > 1)
  		read_mode = READ_SYNC | REQ_FAILFAST_DEV;
  	else
  		read_mode = READ_SYNC;
  
  	phy_offset >>= inode->i_sb->s_blocksize_bits;
  	bio = btrfs_create_repair_bio(inode, failed_bio, failrec, page,
  				      start - page_offset(page),
8b110e393   Miao Xie   Btrfs: implement ...
2347
2348
  				      (int)phy_offset, failed_bio->bi_end_io,
  				      NULL);
2fe6303e7   Miao Xie   Btrfs: split bio_...
2349
2350
2351
2352
  	if (!bio) {
  		free_io_failure(inode, failrec);
  		return -EIO;
  	}
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2353

2fe6303e7   Miao Xie   Btrfs: split bio_...
2354
2355
2356
  	pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d
  ",
  		 read_mode, failrec->this_mirror, failrec->in_validation);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2357

013bd4c33   Tsutomu Itoh   Btrfs: fix return...
2358
2359
2360
  	ret = tree->ops->submit_bio_hook(inode, read_mode, bio,
  					 failrec->this_mirror,
  					 failrec->bio_flags, 0);
6c387ab20   Miao Xie   Btrfs: fix missin...
2361
  	if (ret) {
454ff3de4   Miao Xie   Btrfs: Cleanup un...
2362
  		free_io_failure(inode, failrec);
6c387ab20   Miao Xie   Btrfs: fix missin...
2363
2364
  		bio_put(bio);
  	}
013bd4c33   Tsutomu Itoh   Btrfs: fix return...
2365
  	return ret;
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2366
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2367
  /* lots and lots of room for performance fixes in the end_bio funcs */
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2368
2369
2370
2371
  int end_extent_writepage(struct page *page, int err, u64 start, u64 end)
  {
  	int uptodate = (err == 0);
  	struct extent_io_tree *tree;
3e2426bd0   Eric Sandeen   btrfs: fix use of...
2372
  	int ret = 0;
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2373
2374
2375
2376
2377
2378
2379
2380
2381
  
  	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...
2382
  	if (!uptodate) {
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2383
2384
  		ClearPageUptodate(page);
  		SetPageError(page);
5dca6eea9   Liu Bo   Btrfs: mark mappi...
2385
2386
  		ret = ret < 0 ? ret : -EIO;
  		mapping_set_error(page->mapping, ret);
87826df0e   Jeff Mahoney   btrfs: delalloc f...
2387
2388
2389
  	}
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2390
2391
2392
2393
2394
2395
2396
2397
2398
  /*
   * 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 ...
2399
  static void end_bio_extent_writepage(struct bio *bio, int err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2400
  {
2c30c71bd   Kent Overstreet   block: Convert va...
2401
  	struct bio_vec *bvec;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2402
2403
  	u64 start;
  	u64 end;
2c30c71bd   Kent Overstreet   block: Convert va...
2404
  	int i;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2405

2c30c71bd   Kent Overstreet   block: Convert va...
2406
  	bio_for_each_segment_all(bvec, bio, i) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2407
  		struct page *page = bvec->bv_page;
902b22f34   David Woodhouse   Btrfs: Remove bro...
2408

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2409
2410
2411
2412
2413
  		/* 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.  */
efe120a06   Frank Holton   Btrfs: convert pr...
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
  		if (bvec->bv_offset || bvec->bv_len != PAGE_CACHE_SIZE) {
  			if (bvec->bv_offset + bvec->bv_len != PAGE_CACHE_SIZE)
  				btrfs_err(BTRFS_I(page->mapping->host)->root->fs_info,
  				   "partial page write in btrfs with offset %u and length %u",
  					bvec->bv_offset, bvec->bv_len);
  			else
  				btrfs_info(BTRFS_I(page->mapping->host)->root->fs_info,
  				   "incomplete page write in btrfs with offset %u and "
  				   "length %u",
  					bvec->bv_offset, bvec->bv_len);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2425

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2426
2427
  		start = page_offset(page);
  		end = start + bvec->bv_offset + bvec->bv_len - 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2428

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

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2432
  		end_page_writeback(page);
2c30c71bd   Kent Overstreet   block: Convert va...
2433
  	}
2b1f55b0f   Chris Mason   Remove Btrfs comp...
2434

d1310b2e0   Chris Mason   Btrfs: Split the ...
2435
  	bio_put(bio);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2436
  }
883d0de48   Miao Xie   Btrfs: batch the ...
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
  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 ...
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
  /*
   * 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 ...
2459
  static void end_bio_extent_readpage(struct bio *bio, int err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2460
  {
2c30c71bd   Kent Overstreet   block: Convert va...
2461
  	struct bio_vec *bvec;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2462
  	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
facc8a224   Miao Xie   Btrfs: don't cach...
2463
  	struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
902b22f34   David Woodhouse   Btrfs: Remove bro...
2464
  	struct extent_io_tree *tree;
facc8a224   Miao Xie   Btrfs: don't cach...
2465
  	u64 offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2466
2467
  	u64 start;
  	u64 end;
facc8a224   Miao Xie   Btrfs: don't cach...
2468
  	u64 len;
883d0de48   Miao Xie   Btrfs: batch the ...
2469
2470
  	u64 extent_start = 0;
  	u64 extent_len = 0;
5cf1ab561   Josef Bacik   Btrfs: always sto...
2471
  	int mirror;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2472
  	int ret;
2c30c71bd   Kent Overstreet   block: Convert va...
2473
  	int i;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2474

d20f7043f   Chris Mason   Btrfs: move data ...
2475
2476
  	if (err)
  		uptodate = 0;
2c30c71bd   Kent Overstreet   block: Convert va...
2477
  	bio_for_each_segment_all(bvec, bio, i) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2478
  		struct page *page = bvec->bv_page;
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2479
  		struct inode *inode = page->mapping->host;
507903b81   Arne Jansen   btrfs: using cach...
2480

be3940c0a   Kent Overstreet   btrfs: Kill some ...
2481
  		pr_debug("end_bio_extent_readpage: bi_sector=%llu, err=%d, "
c1dc08967   Miao Xie   Btrfs: do file da...
2482
2483
  			 "mirror=%u
  ", (u64)bio->bi_iter.bi_sector, err,
9be3395bc   Chris Mason   Btrfs: use a btrf...
2484
  			 io_bio->mirror_num);
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2485
  		tree = &BTRFS_I(inode)->io_tree;
902b22f34   David Woodhouse   Btrfs: Remove bro...
2486

17a5adccf   Alexandre Oliva   btrfs: do away wi...
2487
2488
2489
2490
2491
  		/* 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.  */
efe120a06   Frank Holton   Btrfs: convert pr...
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
  		if (bvec->bv_offset || bvec->bv_len != PAGE_CACHE_SIZE) {
  			if (bvec->bv_offset + bvec->bv_len != PAGE_CACHE_SIZE)
  				btrfs_err(BTRFS_I(page->mapping->host)->root->fs_info,
  				   "partial page read in btrfs with offset %u and length %u",
  					bvec->bv_offset, bvec->bv_len);
  			else
  				btrfs_info(BTRFS_I(page->mapping->host)->root->fs_info,
  				   "incomplete page read in btrfs with offset %u and "
  				   "length %u",
  					bvec->bv_offset, bvec->bv_len);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2503

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

9be3395bc   Chris Mason   Btrfs: use a btrf...
2508
  		mirror = io_bio->mirror_num;
f2a09da9d   Miao Xie   Btrfs: add branch...
2509
2510
  		if (likely(uptodate && tree->ops &&
  			   tree->ops->readpage_end_io_hook)) {
facc8a224   Miao Xie   Btrfs: don't cach...
2511
2512
2513
  			ret = tree->ops->readpage_end_io_hook(io_bio, offset,
  							      page, start, end,
  							      mirror);
5ee0844d6   Stefan Behrens   Btrfs: revert che...
2514
  			if (ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2515
  				uptodate = 0;
5ee0844d6   Stefan Behrens   Btrfs: revert che...
2516
  			else
1203b6813   Miao Xie   Btrfs: modify cle...
2517
  				clean_io_failure(inode, start, page, 0);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2518
  		}
ea4667940   Josef Bacik   Btrfs: deal with ...
2519

f2a09da9d   Miao Xie   Btrfs: add branch...
2520
2521
2522
2523
  		if (likely(uptodate))
  			goto readpage_ok;
  
  		if (tree->ops && tree->ops->readpage_io_failed_hook) {
5cf1ab561   Josef Bacik   Btrfs: always sto...
2524
  			ret = tree->ops->readpage_io_failed_hook(page, mirror);
ea4667940   Josef Bacik   Btrfs: deal with ...
2525
2526
2527
  			if (!ret && !err &&
  			    test_bit(BIO_UPTODATE, &bio->bi_flags))
  				uptodate = 1;
f2a09da9d   Miao Xie   Btrfs: add branch...
2528
  		} else {
f4a8e6563   Jan Schmidt   Btrfs: fix meta d...
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
  			/*
  			 * 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...
2539
2540
  			ret = bio_readpage_error(bio, offset, page, start, end,
  						 mirror);
7e38326f5   Chris Mason   Btrfs: Handle che...
2541
  			if (ret == 0) {
3b951516e   Chris Mason   Btrfs: Use the ex...
2542
2543
  				uptodate =
  					test_bit(BIO_UPTODATE, &bio->bi_flags);
d20f7043f   Chris Mason   Btrfs: move data ...
2544
2545
  				if (err)
  					uptodate = 0;
38c1c2e44   Liu Bo   Btrfs: fix crash ...
2546
  				offset += len;
7e38326f5   Chris Mason   Btrfs: Handle che...
2547
2548
2549
  				continue;
  			}
  		}
f2a09da9d   Miao Xie   Btrfs: add branch...
2550
  readpage_ok:
883d0de48   Miao Xie   Btrfs: batch the ...
2551
  		if (likely(uptodate)) {
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2552
2553
  			loff_t i_size = i_size_read(inode);
  			pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
a583c0266   Liu Bo   Btrfs: cleanup th...
2554
  			unsigned off;
a71754fc6   Josef Bacik   Btrfs: move btrfs...
2555
2556
  
  			/* Zero out the end if this page straddles i_size */
a583c0266   Liu Bo   Btrfs: cleanup th...
2557
2558
2559
  			off = i_size & (PAGE_CACHE_SIZE-1);
  			if (page->index == end_index && off)
  				zero_user_segment(page, off, PAGE_CACHE_SIZE);
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2560
  			SetPageUptodate(page);
70dec8079   Chris Mason   Btrfs: extent_io ...
2561
  		} else {
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2562
2563
  			ClearPageUptodate(page);
  			SetPageError(page);
70dec8079   Chris Mason   Btrfs: extent_io ...
2564
  		}
17a5adccf   Alexandre Oliva   btrfs: do away wi...
2565
  		unlock_page(page);
facc8a224   Miao Xie   Btrfs: don't cach...
2566
  		offset += len;
883d0de48   Miao Xie   Btrfs: batch the ...
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
  
  		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;
  		}
2c30c71bd   Kent Overstreet   block: Convert va...
2589
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2590

883d0de48   Miao Xie   Btrfs: batch the ...
2591
2592
2593
  	if (extent_len)
  		endio_readpage_release_extent(tree, extent_start, extent_len,
  					      uptodate);
facc8a224   Miao Xie   Btrfs: don't cach...
2594
2595
  	if (io_bio->end_io)
  		io_bio->end_io(io_bio, err);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2596
  	bio_put(bio);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2597
  }
9be3395bc   Chris Mason   Btrfs: use a btrf...
2598
2599
2600
2601
  /*
   * 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...
2602
2603
2604
  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 ...
2605
  {
facc8a224   Miao Xie   Btrfs: don't cach...
2606
  	struct btrfs_io_bio *btrfs_bio;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2607
  	struct bio *bio;
9be3395bc   Chris Mason   Btrfs: use a btrf...
2608
  	bio = bio_alloc_bioset(gfp_flags, nr_vecs, btrfs_bioset);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2609
2610
  
  	if (bio == NULL && (current->flags & PF_MEMALLOC)) {
9be3395bc   Chris Mason   Btrfs: use a btrf...
2611
2612
2613
2614
  		while (!bio && (nr_vecs /= 2)) {
  			bio = bio_alloc_bioset(gfp_flags,
  					       nr_vecs, btrfs_bioset);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2615
2616
2617
2618
  	}
  
  	if (bio) {
  		bio->bi_bdev = bdev;
4f024f379   Kent Overstreet   block: Abstract o...
2619
  		bio->bi_iter.bi_sector = first_sector;
facc8a224   Miao Xie   Btrfs: don't cach...
2620
2621
2622
2623
  		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 ...
2624
2625
2626
  	}
  	return bio;
  }
9be3395bc   Chris Mason   Btrfs: use a btrf...
2627
2628
  struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask)
  {
23ea8e5a0   Miao Xie   Btrfs: load check...
2629
2630
  	struct btrfs_io_bio *btrfs_bio;
  	struct bio *new;
9be3395bc   Chris Mason   Btrfs: use a btrf...
2631

23ea8e5a0   Miao Xie   Btrfs: load check...
2632
2633
2634
2635
2636
2637
2638
2639
2640
  	new = bio_clone_bioset(bio, gfp_mask, btrfs_bioset);
  	if (new) {
  		btrfs_bio = btrfs_io_bio(new);
  		btrfs_bio->csum = NULL;
  		btrfs_bio->csum_allocated = NULL;
  		btrfs_bio->end_io = NULL;
  	}
  	return new;
  }
9be3395bc   Chris Mason   Btrfs: use a btrf...
2641
2642
2643
2644
  
  /* 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...
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
  	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...
2656
  }
355808c29   Jeff Mahoney   btrfs: ->submit_b...
2657
2658
  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 ...
2659
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2660
  	int ret = 0;
70dec8079   Chris Mason   Btrfs: extent_io ...
2661
2662
2663
  	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 ...
2664
  	u64 start;
70dec8079   Chris Mason   Btrfs: extent_io ...
2665

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

902b22f34   David Woodhouse   Btrfs: Remove bro...
2668
  	bio->bi_private = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2669
2670
  
  	bio_get(bio);
065631f6d   Chris Mason   Btrfs: checksum f...
2671
  	if (tree->ops && tree->ops->submit_bio_hook)
6b82ce8d8   liubo   btrfs: fix unchec...
2672
  		ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio,
eaf25d933   Chris Mason   Btrfs: use async ...
2673
  					   mirror_num, bio_flags, start);
0b86a832a   Chris Mason   Btrfs: Add suppor...
2674
  	else
21adbd5cb   Stefan Behrens   Btrfs: integrate ...
2675
  		btrfsic_submit_bio(rw, bio);
4a54c8c16   Jan Schmidt   btrfs: Moved repa...
2676

d1310b2e0   Chris Mason   Btrfs: Split the ...
2677
2678
2679
2680
2681
  	if (bio_flagged(bio, BIO_EOPNOTSUPP))
  		ret = -EOPNOTSUPP;
  	bio_put(bio);
  	return ret;
  }
64a167011   David Woodhouse   Btrfs: add rw arg...
2682
  static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page,
3444a9725   Jeff Mahoney   btrfs: Factor out...
2683
2684
2685
2686
2687
  		     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...
2688
  		ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio,
3444a9725   Jeff Mahoney   btrfs: Factor out...
2689
2690
2691
2692
2693
  						bio_flags);
  	BUG_ON(ret < 0);
  	return ret;
  
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
2694
2695
2696
2697
2698
2699
  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...
2700
  			      bio_end_io_t end_io_func,
c8b978188   Chris Mason   Btrfs: Add zlib c...
2701
2702
2703
  			      int mirror_num,
  			      unsigned long prev_bio_flags,
  			      unsigned long bio_flags)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2704
2705
2706
2707
  {
  	int ret = 0;
  	struct bio *bio;
  	int nr;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2708
2709
2710
  	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...
2711
  	size_t page_size = min_t(size_t, size, PAGE_CACHE_SIZE);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2712
2713
2714
  
  	if (bio_ret && *bio_ret) {
  		bio = *bio_ret;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2715
  		if (old_compressed)
4f024f379   Kent Overstreet   block: Abstract o...
2716
  			contig = bio->bi_iter.bi_sector == sector;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2717
  		else
f73a1c7d1   Kent Overstreet   block: Add bio_en...
2718
  			contig = bio_end_sector(bio) == sector;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2719
2720
  
  		if (prev_bio_flags != bio_flags || !contig ||
64a167011   David Woodhouse   Btrfs: add rw arg...
2721
  		    merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) ||
c8b978188   Chris Mason   Btrfs: Add zlib c...
2722
2723
2724
  		    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...
2725
2726
  			if (ret < 0)
  				return ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2727
2728
2729
2730
2731
  			bio = NULL;
  		} else {
  			return 0;
  		}
  	}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2732
2733
2734
2735
  	if (this_compressed)
  		nr = BIO_MAX_PAGES;
  	else
  		nr = bio_get_nr_vecs(bdev);
88f794ede   Miao Xie   btrfs: cleanup du...
2736
  	bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH);
5df670834   Tsutomu Itoh   btrfs: checking N...
2737
2738
  	if (!bio)
  		return -ENOMEM;
70dec8079   Chris Mason   Btrfs: extent_io ...
2739

c8b978188   Chris Mason   Btrfs: Add zlib c...
2740
  	bio_add_page(bio, page, page_size, offset);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2741
2742
  	bio->bi_end_io = end_io_func;
  	bio->bi_private = tree;
70dec8079   Chris Mason   Btrfs: extent_io ...
2743

d397712bc   Chris Mason   Btrfs: Fix checkp...
2744
  	if (bio_ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2745
  		*bio_ret = bio;
d397712bc   Chris Mason   Btrfs: Fix checkp...
2746
  	else
c8b978188   Chris Mason   Btrfs: Add zlib c...
2747
  		ret = submit_one_bio(rw, bio, mirror_num, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2748
2749
2750
  
  	return ret;
  }
48a3b6366   Eric Sandeen   btrfs: make stati...
2751
2752
  static void attach_extent_buffer_page(struct extent_buffer *eb,
  				      struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2753
2754
2755
  {
  	if (!PagePrivate(page)) {
  		SetPagePrivate(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2756
  		page_cache_get(page);
4f2de97ac   Josef Bacik   Btrfs: set page->...
2757
2758
2759
  		set_page_private(page, (unsigned long)eb);
  	} else {
  		WARN_ON(page->private != (unsigned long)eb);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2760
2761
  	}
  }
4f2de97ac   Josef Bacik   Btrfs: set page->...
2762
  void set_page_extent_mapped(struct page *page)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2763
  {
4f2de97ac   Josef Bacik   Btrfs: set page->...
2764
2765
2766
2767
2768
  	if (!PagePrivate(page)) {
  		SetPagePrivate(page);
  		page_cache_get(page);
  		set_page_private(page, EXTENT_PAGE_PRIVATE);
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2769
  }
125bac016   Miao Xie   Btrfs: cache the ...
2770
2771
2772
2773
2774
2775
2776
2777
2778
  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;
cbc0e9287   Filipe Manana   Btrfs: remove unn...
2779
  		if (extent_map_in_tree(em) && start >= em->start &&
125bac016   Miao Xie   Btrfs: cache the ...
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
  		    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 ...
2797
2798
2799
2800
  /*
   * 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...
2801
   * XXX JDM: This needs looking at to ensure proper page locking
d1310b2e0   Chris Mason   Btrfs: Split the ...
2802
   */
9974090bd   Miao Xie   Btrfs: batch the ...
2803
2804
2805
  static int __do_readpage(struct extent_io_tree *tree,
  			 struct page *page,
  			 get_extent_t *get_extent,
125bac016   Miao Xie   Btrfs: cache the ...
2806
  			 struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
2807
2808
  			 struct bio **bio, int mirror_num,
  			 unsigned long *bio_flags, int rw)
d1310b2e0   Chris Mason   Btrfs: Split the ...
2809
2810
  {
  	struct inode *inode = page->mapping->host;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
2811
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
  	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 ...
2824
  	int parent_locked = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
306e16ce1   David Sterba   btrfs: rename var...
2825
  	size_t pg_offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2826
  	size_t iosize;
c8b978188   Chris Mason   Btrfs: Add zlib c...
2827
  	size_t disk_io_size;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2828
  	size_t blocksize = inode->i_sb->s_blocksize;
4b384318a   Mark Fasheh   btrfs: Introduce ...
2829
  	unsigned long this_bio_flag = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2830
2831
  
  	set_page_extent_mapped(page);
9974090bd   Miao Xie   Btrfs: batch the ...
2832
  	end = page_end;
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2833
2834
2835
  	if (!PageUptodate(page)) {
  		if (cleancache_get_page(page) == 0) {
  			BUG_ON(blocksize != PAGE_SIZE);
9974090bd   Miao Xie   Btrfs: batch the ...
2836
  			unlock_extent(tree, start, end);
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2837
2838
2839
  			goto out;
  		}
  	}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2840
2841
2842
2843
2844
2845
  	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...
2846
  			userpage = kmap_atomic(page);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2847
2848
  			memset(userpage + zero_offset, 0, iosize);
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2849
  			kunmap_atomic(userpage);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2850
2851
  		}
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2852
  	while (cur <= end) {
c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2853
  		unsigned long pnr = (last_byte >> PAGE_CACHE_SHIFT) + 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2854
2855
  		if (cur >= last_byte) {
  			char *userpage;
507903b81   Arne Jansen   btrfs: using cach...
2856
  			struct extent_state *cached = NULL;
306e16ce1   David Sterba   btrfs: rename var...
2857
  			iosize = PAGE_CACHE_SIZE - pg_offset;
7ac687d9e   Cong Wang   btrfs: remove the...
2858
  			userpage = kmap_atomic(page);
306e16ce1   David Sterba   btrfs: rename var...
2859
  			memset(userpage + pg_offset, 0, iosize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2860
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2861
  			kunmap_atomic(userpage);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2862
  			set_extent_uptodate(tree, cur, cur + iosize - 1,
507903b81   Arne Jansen   btrfs: using cach...
2863
  					    &cached, GFP_NOFS);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2864
2865
2866
2867
  			if (!parent_locked)
  				unlock_extent_cached(tree, cur,
  						     cur + iosize - 1,
  						     &cached, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2868
2869
  			break;
  		}
125bac016   Miao Xie   Btrfs: cache the ...
2870
2871
  		em = __get_extent_map(inode, page, pg_offset, cur,
  				      end - cur + 1, get_extent, em_cached);
c704005d8   David Sterba   btrfs: unify chec...
2872
  		if (IS_ERR_OR_NULL(em)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2873
  			SetPageError(page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2874
2875
  			if (!parent_locked)
  				unlock_extent(tree, cur, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2876
2877
  			break;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2878
2879
2880
  		extent_offset = cur - em->start;
  		BUG_ON(extent_map_end(em) <= cur);
  		BUG_ON(end < cur);
261507a02   Li Zefan   btrfs: Allow to a...
2881
  		if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) {
4b384318a   Mark Fasheh   btrfs: Introduce ...
2882
  			this_bio_flag |= EXTENT_BIO_COMPRESSED;
261507a02   Li Zefan   btrfs: Allow to a...
2883
2884
2885
  			extent_set_compress_type(&this_bio_flag,
  						 em->compress_type);
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
2886

d1310b2e0   Chris Mason   Btrfs: Split the ...
2887
2888
  		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...
2889
  		iosize = ALIGN(iosize, blocksize);
c8b978188   Chris Mason   Btrfs: Add zlib c...
2890
2891
2892
2893
2894
2895
2896
  		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 ...
2897
2898
  		bdev = em->bdev;
  		block_start = em->block_start;
d899e0521   Yan Zheng   Btrfs: Add falloc...
2899
2900
  		if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
  			block_start = EXTENT_MAP_HOLE;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2901
2902
2903
2904
2905
2906
  		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...
2907
  			struct extent_state *cached = NULL;
7ac687d9e   Cong Wang   btrfs: remove the...
2908
  			userpage = kmap_atomic(page);
306e16ce1   David Sterba   btrfs: rename var...
2909
  			memset(userpage + pg_offset, 0, iosize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2910
  			flush_dcache_page(page);
7ac687d9e   Cong Wang   btrfs: remove the...
2911
  			kunmap_atomic(userpage);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2912
2913
  
  			set_extent_uptodate(tree, cur, cur + iosize - 1,
507903b81   Arne Jansen   btrfs: using cach...
2914
2915
2916
  					    &cached, GFP_NOFS);
  			unlock_extent_cached(tree, cur, cur + iosize - 1,
  			                     &cached, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2917
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2918
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2919
2920
2921
  			continue;
  		}
  		/* the get_extent function already copied into the page */
9655d2982   Chris Mason   Btrfs: use a cach...
2922
2923
  		if (test_range_bit(tree, cur, cur_end,
  				   EXTENT_UPTODATE, 1, NULL)) {
a1b32a593   Chris Mason   Btrfs: Add debugg...
2924
  			check_page_uptodate(tree, page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2925
2926
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
2927
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2928
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2929
2930
  			continue;
  		}
70dec8079   Chris Mason   Btrfs: extent_io ...
2931
2932
2933
2934
2935
  		/* 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 ...
2936
2937
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
70dec8079   Chris Mason   Btrfs: extent_io ...
2938
  			cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2939
  			pg_offset += iosize;
70dec8079   Chris Mason   Btrfs: extent_io ...
2940
2941
  			continue;
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2942

c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2943
  		pnr -= page->index;
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
2944
  		ret = submit_extent_page(rw, tree, page,
306e16ce1   David Sterba   btrfs: rename var...
2945
  					 sector, disk_io_size, pg_offset,
89642229a   Chris Mason   Btrfs: Search dat...
2946
  					 bdev, bio, pnr,
c8b978188   Chris Mason   Btrfs: Add zlib c...
2947
2948
2949
  					 end_bio_extent_readpage, mirror_num,
  					 *bio_flags,
  					 this_bio_flag);
c8f2f24bd   Josef Bacik   Btrfs: remove unu...
2950
2951
2952
2953
  		if (!ret) {
  			nr++;
  			*bio_flags = this_bio_flag;
  		} else {
d1310b2e0   Chris Mason   Btrfs: Split the ...
2954
  			SetPageError(page);
4b384318a   Mark Fasheh   btrfs: Introduce ...
2955
2956
  			if (!parent_locked)
  				unlock_extent(tree, cur, cur + iosize - 1);
edd33c99c   Josef Bacik   Btrfs: don't bug ...
2957
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
2958
  		cur = cur + iosize;
306e16ce1   David Sterba   btrfs: rename var...
2959
  		pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
2960
  	}
90a887c9a   Dan Magenheimer   btrfs: add cleanc...
2961
  out:
d1310b2e0   Chris Mason   Btrfs: Split the ...
2962
2963
2964
2965
2966
2967
2968
  	if (!nr) {
  		if (!PageError(page))
  			SetPageUptodate(page);
  		unlock_page(page);
  	}
  	return 0;
  }
9974090bd   Miao Xie   Btrfs: batch the ...
2969
2970
2971
2972
  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 ...
2973
  					     struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
  					     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 ...
2994
2995
  		__do_readpage(tree, pages[index], get_extent, em_cached, bio,
  			      mirror_num, bio_flags, rw);
9974090bd   Miao Xie   Btrfs: batch the ...
2996
2997
2998
2999
3000
3001
3002
  		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 ...
3003
  			       struct extent_map **em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
3004
3005
3006
  			       struct bio **bio, int mirror_num,
  			       unsigned long *bio_flags, int rw)
  {
35a3621be   Stefan Behrens   Btrfs: get rid of...
3007
  	u64 start = 0;
9974090bd   Miao Xie   Btrfs: batch the ...
3008
3009
3010
  	u64 end = 0;
  	u64 page_start;
  	int index;
35a3621be   Stefan Behrens   Btrfs: get rid of...
3011
  	int first_index = 0;
9974090bd   Miao Xie   Btrfs: batch the ...
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
  
  	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 ...
3024
3025
3026
  						  end, get_extent, em_cached,
  						  bio, mirror_num, bio_flags,
  						  rw);
9974090bd   Miao Xie   Btrfs: batch the ...
3027
3028
3029
3030
3031
3032
3033
3034
3035
  			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 ...
3036
  					  end, get_extent, em_cached, bio,
9974090bd   Miao Xie   Btrfs: batch the ...
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
  					  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 ...
3061
3062
  	ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num,
  			    bio_flags, rw);
9974090bd   Miao Xie   Btrfs: batch the ...
3063
3064
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3065
  int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
3066
  			    get_extent_t *get_extent, int mirror_num)
d1310b2e0   Chris Mason   Btrfs: Split the ...
3067
3068
  {
  	struct bio *bio = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3069
  	unsigned long bio_flags = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3070
  	int ret;
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
3071
  	ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num,
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
3072
  				      &bio_flags, READ);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3073
  	if (bio)
8ddc7d9cd   Jan Schmidt   btrfs: add mirror...
3074
  		ret = submit_one_bio(READ, bio, mirror_num, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3075
3076
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3077

4b384318a   Mark Fasheh   btrfs: Introduce ...
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
  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...
3091
3092
3093
3094
3095
3096
3097
3098
3099
  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 ...
3100
  /*
40f765805   Chris Mason   Btrfs: split up _...
3101
3102
3103
3104
3105
3106
3107
3108
   * helper for __extent_writepage, doing all of the delayed allocation setup.
   *
   * This returns 1 if our fill_delalloc function did all the work required
   * to write the page (copy into inline extent).  In this case the IO has
   * been started and the page is already unlocked.
   *
   * This returns 0 if all went well (page still locked)
   * This returns < 0 if there were errors (page still locked)
d1310b2e0   Chris Mason   Btrfs: Split the ...
3109
   */
40f765805   Chris Mason   Btrfs: split up _...
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
  static noinline_for_stack int writepage_delalloc(struct inode *inode,
  			      struct page *page, struct writeback_control *wbc,
  			      struct extent_page_data *epd,
  			      u64 delalloc_start,
  			      unsigned long *nr_written)
  {
  	struct extent_io_tree *tree = epd->tree;
  	u64 page_end = delalloc_start + PAGE_CACHE_SIZE - 1;
  	u64 nr_delalloc;
  	u64 delalloc_to_write = 0;
  	u64 delalloc_end = 0;
  	int ret;
  	int page_started = 0;
  
  	if (epd->extent_locked || !tree->ops || !tree->ops->fill_delalloc)
  		return 0;
  
  	while (delalloc_end < page_end) {
  		nr_delalloc = find_lock_delalloc_range(inode, tree,
  					       page,
  					       &delalloc_start,
  					       &delalloc_end,
  					       128 * 1024 * 1024);
  		if (nr_delalloc == 0) {
  			delalloc_start = delalloc_end + 1;
  			continue;
  		}
  		ret = tree->ops->fill_delalloc(inode, page,
  					       delalloc_start,
  					       delalloc_end,
  					       &page_started,
  					       nr_written);
  		/* File system has been set read-only */
  		if (ret) {
  			SetPageError(page);
  			/* fill_delalloc should be return < 0 for error
  			 * but just in case, we use > 0 here meaning the
  			 * IO is started, so we don't want to return > 0
  			 * unless things are going well.
  			 */
  			ret = ret < 0 ? ret : -EIO;
  			goto done;
  		}
  		/*
  		 * 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;
  		delalloc_start = delalloc_end + 1;
  	}
  	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);
  	}
  
  	/* did the fill delalloc function already unlock and start
  	 * the IO?
  	 */
  	if (page_started) {
  		/*
  		 * 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;
  		return 1;
  	}
  
  	ret = 0;
  
  done:
  	return ret;
  }
  
  /*
   * helper for __extent_writepage.  This calls the writepage start hooks,
   * and does the loop to map the page into extents and bios.
   *
   * We return 1 if the IO is started and the page is unlocked,
   * 0 if all went well (page still locked)
   * < 0 if there were errors (page still locked)
   */
  static noinline_for_stack int __extent_writepage_io(struct inode *inode,
  				 struct page *page,
  				 struct writeback_control *wbc,
  				 struct extent_page_data *epd,
  				 loff_t i_size,
  				 unsigned long nr_written,
  				 int write_flags, int *nr_ret)
d1310b2e0   Chris Mason   Btrfs: Split the ...
3206
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3207
  	struct extent_io_tree *tree = epd->tree;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
3208
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3209
3210
3211
3212
  	u64 page_end = start + PAGE_CACHE_SIZE - 1;
  	u64 end;
  	u64 cur = start;
  	u64 extent_offset;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3213
3214
3215
  	u64 block_start;
  	u64 iosize;
  	sector_t sector;
2c64c53d8   Chris Mason   Btrfs: cache valu...
3216
  	struct extent_state *cached_state = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3217
3218
  	struct extent_map *em;
  	struct block_device *bdev;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3219
  	size_t pg_offset = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3220
  	size_t blocksize;
40f765805   Chris Mason   Btrfs: split up _...
3221
3222
3223
  	int ret = 0;
  	int nr = 0;
  	bool compressed;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3224

247e743cb   Chris Mason   Btrfs: Use async ...
3225
  	if (tree->ops && tree->ops->writepage_start_hook) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
3226
3227
  		ret = tree->ops->writepage_start_hook(page, start,
  						      page_end);
87826df0e   Jeff Mahoney   btrfs: delalloc f...
3228
3229
3230
3231
3232
3233
  		if (ret) {
  			/* Fixup worker will requeue */
  			if (ret == -EBUSY)
  				wbc->pages_skipped++;
  			else
  				redirty_page_for_writepage(wbc, page);
40f765805   Chris Mason   Btrfs: split up _...
3234

11c8349b4   Chris Mason   Btrfs: fix oops o...
3235
  			update_nr_written(page, wbc, nr_written);
247e743cb   Chris Mason   Btrfs: Use async ...
3236
  			unlock_page(page);
40f765805   Chris Mason   Btrfs: split up _...
3237
  			ret = 1;
11c8349b4   Chris Mason   Btrfs: fix oops o...
3238
  			goto done_unlocked;
247e743cb   Chris Mason   Btrfs: Use async ...
3239
3240
  		}
  	}
11c8349b4   Chris Mason   Btrfs: fix oops o...
3241
3242
3243
3244
3245
  	/*
  	 * 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...
3246

d1310b2e0   Chris Mason   Btrfs: Split the ...
3247
  	end = page_end;
40f765805   Chris Mason   Btrfs: split up _...
3248
  	if (i_size <= start) {
e6dcd2dc9   Chris Mason   Btrfs: New data=o...
3249
3250
3251
  		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 ...
3252
3253
  		goto done;
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3254
3255
3256
  	blocksize = inode->i_sb->s_blocksize;
  
  	while (cur <= end) {
40f765805   Chris Mason   Btrfs: split up _...
3257
3258
  		u64 em_end;
  		if (cur >= i_size) {
e6dcd2dc9   Chris Mason   Btrfs: New data=o...
3259
3260
3261
  			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 ...
3262
3263
  			break;
  		}
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3264
  		em = epd->get_extent(inode, page, pg_offset, cur,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3265
  				     end - cur + 1, 1);
c704005d8   David Sterba   btrfs: unify chec...
3266
  		if (IS_ERR_OR_NULL(em)) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3267
  			SetPageError(page);
61391d562   Filipe Manana   Btrfs: fix hang o...
3268
  			ret = PTR_ERR_OR_ZERO(em);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3269
3270
3271
3272
  			break;
  		}
  
  		extent_offset = cur - em->start;
40f765805   Chris Mason   Btrfs: split up _...
3273
3274
  		em_end = extent_map_end(em);
  		BUG_ON(em_end <= cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3275
  		BUG_ON(end < cur);
40f765805   Chris Mason   Btrfs: split up _...
3276
  		iosize = min(em_end - cur, end - cur + 1);
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
3277
  		iosize = ALIGN(iosize, blocksize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3278
3279
3280
  		sector = (em->block_start + extent_offset) >> 9;
  		bdev = em->bdev;
  		block_start = em->block_start;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3281
  		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3282
3283
  		free_extent_map(em);
  		em = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
3284
3285
3286
3287
3288
  		/*
  		 * 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 ...
3289
  		    block_start == EXTENT_MAP_INLINE) {
c8b978188   Chris Mason   Btrfs: Add zlib c...
3290
3291
3292
3293
3294
3295
  			/*
  			 * 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...
3296
3297
3298
  				tree->ops->writepage_end_io_hook(page, cur,
  							 cur + iosize - 1,
  							 NULL, 1);
c8b978188   Chris Mason   Btrfs: Add zlib c...
3299
3300
3301
3302
3303
3304
3305
3306
3307
  			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...
3308
  			pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3309
3310
  			continue;
  		}
c8b978188   Chris Mason   Btrfs: Add zlib c...
3311

d1310b2e0   Chris Mason   Btrfs: Split the ...
3312
3313
3314
3315
3316
3317
  		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...
3318
  		if (ret) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3319
  			SetPageError(page);
1259ab75c   Chris Mason   Btrfs: Handle wri...
3320
  		} else {
40f765805   Chris Mason   Btrfs: split up _...
3321
  			unsigned long max_nr = (i_size >> PAGE_CACHE_SHIFT) + 1;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3322

d1310b2e0   Chris Mason   Btrfs: Split the ...
3323
3324
  			set_range_writeback(tree, cur, cur + iosize - 1);
  			if (!PageWriteback(page)) {
efe120a06   Frank Holton   Btrfs: convert pr...
3325
3326
  				btrfs_err(BTRFS_I(inode)->root->fs_info,
  					   "page %lu not writeback, cur %llu end %llu",
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
3327
  				       page->index, cur, end);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3328
  			}
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3329
3330
3331
  			ret = submit_extent_page(write_flags, tree, page,
  						 sector, iosize, pg_offset,
  						 bdev, &epd->bio, max_nr,
c8b978188   Chris Mason   Btrfs: Add zlib c...
3332
3333
  						 end_bio_extent_writepage,
  						 0, 0, 0);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3334
3335
3336
3337
  			if (ret)
  				SetPageError(page);
  		}
  		cur = cur + iosize;
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
3338
  		pg_offset += iosize;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3339
3340
3341
  		nr++;
  	}
  done:
40f765805   Chris Mason   Btrfs: split up _...
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
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
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
  	*nr_ret = nr;
  
  done_unlocked:
  
  	/* drop our reference on any cached states */
  	free_extent_state(cached_state);
  	return ret;
  }
  
  /*
   * 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;
  	u64 start = page_offset(page);
  	u64 page_end = start + PAGE_CACHE_SIZE - 1;
  	int ret;
  	int nr = 0;
  	size_t pg_offset = 0;
  	loff_t i_size = i_size_read(inode);
  	unsigned long end_index = i_size >> PAGE_CACHE_SHIFT;
  	int write_flags;
  	unsigned long nr_written = 0;
  
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		write_flags = WRITE_SYNC;
  	else
  		write_flags = WRITE;
  
  	trace___extent_writepage(page, inode, wbc);
  
  	WARN_ON(!PageLocked(page));
  
  	ClearPageError(page);
  
  	pg_offset = i_size & (PAGE_CACHE_SIZE - 1);
  	if (page->index > end_index ||
  	   (page->index == end_index && !pg_offset)) {
  		page->mapping->a_ops->invalidatepage(page, 0, PAGE_CACHE_SIZE);
  		unlock_page(page);
  		return 0;
  	}
  
  	if (page->index == end_index) {
  		char *userpage;
  
  		userpage = kmap_atomic(page);
  		memset(userpage + pg_offset, 0,
  		       PAGE_CACHE_SIZE - pg_offset);
  		kunmap_atomic(userpage);
  		flush_dcache_page(page);
  	}
  
  	pg_offset = 0;
  
  	set_page_extent_mapped(page);
  
  	ret = writepage_delalloc(inode, page, wbc, epd, start, &nr_written);
  	if (ret == 1)
  		goto done_unlocked;
  	if (ret)
  		goto done;
  
  	ret = __extent_writepage_io(inode, page, wbc, epd,
  				    i_size, nr_written, write_flags, &nr);
  	if (ret == 1)
  		goto done_unlocked;
  
  done:
d1310b2e0   Chris Mason   Btrfs: Split the ...
3417
3418
3419
3420
3421
  	if (nr == 0) {
  		/* make sure the mapping tag for page dirty gets cleared */
  		set_page_writeback(page);
  		end_page_writeback(page);
  	}
61391d562   Filipe Manana   Btrfs: fix hang o...
3422
3423
3424
3425
  	if (PageError(page)) {
  		ret = ret < 0 ? ret : -EIO;
  		end_extent_writepage(page, ret, start, page_end);
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3426
  	unlock_page(page);
40f765805   Chris Mason   Btrfs: split up _...
3427
  	return ret;
771ed689d   Chris Mason   Btrfs: Optimize c...
3428

11c8349b4   Chris Mason   Btrfs: fix oops o...
3429
  done_unlocked:
d1310b2e0   Chris Mason   Btrfs: Split the ...
3430
3431
  	return 0;
  }
fd8b2b611   Josef Bacik   Btrfs: cleanup de...
3432
  void wait_on_extent_buffer_writeback(struct extent_buffer *eb)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3433
  {
743162013   NeilBrown   sched: Remove pro...
3434
3435
  	wait_on_bit_io(&eb->bflags, EXTENT_BUFFER_WRITEBACK,
  		       TASK_UNINTERRUPTIBLE);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3436
  }
0e378df15   Chris Mason   Btrfs: cut down s...
3437
3438
3439
3440
  static noinline_for_stack int
  lock_extent_buffer_for_io(struct extent_buffer *eb,
  			  struct btrfs_fs_info *fs_info,
  			  struct extent_page_data *epd)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
  {
  	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...
3460
3461
3462
3463
3464
  		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 ...
3465
  			btrfs_tree_unlock(eb);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3466
3467
  		}
  	}
51561ffec   Josef Bacik   Btrfs: lock the t...
3468
3469
3470
3471
3472
3473
  	/*
  	 * 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 ...
3474
3475
  	if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) {
  		set_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
51561ffec   Josef Bacik   Btrfs: lock the t...
3476
  		spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3477
  		btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
e2d845211   Miao Xie   Btrfs: use percpu...
3478
3479
3480
  		__percpu_counter_add(&fs_info->dirty_metadata_bytes,
  				     -eb->len,
  				     fs_info->dirty_metadata_batch);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3481
  		ret = 1;
51561ffec   Josef Bacik   Btrfs: lock the t...
3482
3483
  	} else {
  		spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3484
3485
3486
3487
3488
3489
3490
3491
3492
  	}
  
  	btrfs_tree_unlock(eb);
  
  	if (!ret)
  		return ret;
  
  	num_pages = num_extent_pages(eb->start, eb->len);
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
3493
  		struct page *p = eb->pages[i];
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
  
  		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);
4e857c58e   Peter Zijlstra   arch: Mass conver...
3510
  	smp_mb__after_atomic();
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3511
3512
  	wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
  }
656f30dba   Filipe Manana   Btrfs: be aware o...
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
  static void set_btree_ioerr(struct page *page)
  {
  	struct extent_buffer *eb = (struct extent_buffer *)page->private;
  	struct btrfs_inode *btree_ino = BTRFS_I(eb->fs_info->btree_inode);
  
  	SetPageError(page);
  	if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags))
  		return;
  
  	/*
  	 * If writeback for a btree extent that doesn't belong to a log tree
  	 * failed, increment the counter transaction->eb_write_errors.
  	 * We do this because while the transaction is running and before it's
  	 * committing (when we call filemap_fdata[write|wait]_range against
  	 * the btree inode), we might have
  	 * btree_inode->i_mapping->a_ops->writepages() called by the VM - if it
  	 * returns an error or an error happens during writeback, when we're
  	 * committing the transaction we wouldn't know about it, since the pages
  	 * can be no longer dirty nor marked anymore for writeback (if a
  	 * subsequent modification to the extent buffer didn't happen before the
  	 * transaction commit), which makes filemap_fdata[write|wait]_range not
  	 * able to find the pages tagged with SetPageError at transaction
  	 * commit time. So if this happens we must abort the transaction,
  	 * otherwise we commit a super block with btree roots that point to
  	 * btree nodes/leafs whose content on disk is invalid - either garbage
  	 * or the content of some node/leaf from a past generation that got
  	 * cowed or deleted and is no longer valid.
  	 *
  	 * Note: setting AS_EIO/AS_ENOSPC in the btree inode's i_mapping would
  	 * not be enough - we need to distinguish between log tree extents vs
  	 * non-log tree extents, and the next filemap_fdatawait_range() call
  	 * will catch and clear such errors in the mapping - and that call might
  	 * be from a log sync and not from a transaction commit. Also, checking
  	 * for the eb flag EXTENT_BUFFER_WRITE_ERR at transaction commit time is
  	 * not done and would not be reliable - the eb might have been released
  	 * from memory and reading it back again means that flag would not be
  	 * set (since it's a runtime flag, not persisted on disk).
  	 *
  	 * Using the flags below in the btree inode also makes us achieve the
  	 * goal of AS_EIO/AS_ENOSPC when writepages() returns success, started
  	 * writeback for all dirty pages and before filemap_fdatawait_range()
  	 * is called, the writeback for all dirty pages had already finished
  	 * with errors - because we were not using AS_EIO/AS_ENOSPC,
  	 * filemap_fdatawait_range() would return success, as it could not know
  	 * that writeback errors happened (the pages were no longer tagged for
  	 * writeback).
  	 */
  	switch (eb->log_index) {
  	case -1:
  		set_bit(BTRFS_INODE_BTREE_ERR, &btree_ino->runtime_flags);
  		break;
  	case 0:
  		set_bit(BTRFS_INODE_BTREE_LOG1_ERR, &btree_ino->runtime_flags);
  		break;
  	case 1:
  		set_bit(BTRFS_INODE_BTREE_LOG2_ERR, &btree_ino->runtime_flags);
  		break;
  	default:
  		BUG(); /* unexpected, logic error */
  	}
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3574
3575
  static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
  {
2c30c71bd   Kent Overstreet   block: Convert va...
3576
  	struct bio_vec *bvec;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3577
  	struct extent_buffer *eb;
2c30c71bd   Kent Overstreet   block: Convert va...
3578
  	int i, done;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3579

2c30c71bd   Kent Overstreet   block: Convert va...
3580
  	bio_for_each_segment_all(bvec, bio, i) {
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3581
  		struct page *page = bvec->bv_page;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3582
3583
3584
  		eb = (struct extent_buffer *)page->private;
  		BUG_ON(!eb);
  		done = atomic_dec_and_test(&eb->io_pages);
656f30dba   Filipe Manana   Btrfs: be aware o...
3585
  		if (err || test_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags)) {
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3586
  			ClearPageUptodate(page);
656f30dba   Filipe Manana   Btrfs: be aware o...
3587
  			set_btree_ioerr(page);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3588
3589
3590
3591
3592
3593
3594
3595
  		}
  
  		end_page_writeback(page);
  
  		if (!done)
  			continue;
  
  		end_extent_buffer_writeback(eb);
2c30c71bd   Kent Overstreet   block: Convert va...
3596
  	}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3597
3598
  
  	bio_put(bio);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3599
  }
0e378df15   Chris Mason   Btrfs: cut down s...
3600
  static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3601
3602
3603
3604
3605
  			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;
f28491e0a   Josef Bacik   Btrfs: move the e...
3606
  	struct extent_io_tree *tree = &BTRFS_I(fs_info->btree_inode)->io_tree;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3607
3608
  	u64 offset = eb->start;
  	unsigned long i, num_pages;
de0022b9d   Josef Bacik   Btrfs: do not asy...
3609
  	unsigned long bio_flags = 0;
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
3610
  	int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META;
d7dbe9e7f   Josef Bacik   Btrfs: fix compil...
3611
  	int ret = 0;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3612

656f30dba   Filipe Manana   Btrfs: be aware o...
3613
  	clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3614
3615
  	num_pages = num_extent_pages(eb->start, eb->len);
  	atomic_set(&eb->io_pages, num_pages);
de0022b9d   Josef Bacik   Btrfs: do not asy...
3616
3617
  	if (btrfs_header_owner(eb) == BTRFS_TREE_LOG_OBJECTID)
  		bio_flags = EXTENT_BIO_TREE_LOG;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3618
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
3619
  		struct page *p = eb->pages[i];
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3620
3621
3622
  
  		clear_page_dirty_for_io(p);
  		set_page_writeback(p);
f28491e0a   Josef Bacik   Btrfs: move the e...
3623
  		ret = submit_extent_page(rw, tree, p, offset >> 9,
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3624
3625
  					 PAGE_CACHE_SIZE, 0, bdev, &epd->bio,
  					 -1, end_bio_extent_buffer_writepage,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3626
3627
  					 0, epd->bio_flags, bio_flags);
  		epd->bio_flags = bio_flags;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3628
  		if (ret) {
656f30dba   Filipe Manana   Btrfs: be aware o...
3629
  			set_btree_ioerr(p);
55e3bd2e0   Filipe Manana   Btrfs: add missin...
3630
  			end_page_writeback(p);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
  			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++) {
bbf65cf0b   Chris Mason   Merge branch 'cle...
3643
  			struct page *p = eb->pages[i];
814650282   Liu Bo   Btrfs: fix crash ...
3644
  			clear_page_dirty_for_io(p);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
  			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...
3663
  		.bio_flags = 0,
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
  	};
  	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...
3707
3708
3709
3710
3711
  			spin_lock(&mapping->private_lock);
  			if (!PagePrivate(page)) {
  				spin_unlock(&mapping->private_lock);
  				continue;
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3712
  			eb = (struct extent_buffer *)page->private;
b5bae2612   Josef Bacik   Btrfs: fix race w...
3713
3714
3715
3716
3717
3718
  
  			/*
  			 * 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.
  			 */
fae7f21ce   Dulshani Gunawardhana   btrfs: Use WARN_O...
3719
  			if (WARN_ON(!eb)) {
b5bae2612   Josef Bacik   Btrfs: fix race w...
3720
  				spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3721
3722
  				continue;
  			}
b5bae2612   Josef Bacik   Btrfs: fix race w...
3723
3724
  			if (eb == prev_eb) {
  				spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3725
  				continue;
b5bae2612   Josef Bacik   Btrfs: fix race w...
3726
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3727

b5bae2612   Josef Bacik   Btrfs: fix race w...
3728
3729
3730
  			ret = atomic_inc_not_zero(&eb->refs);
  			spin_unlock(&mapping->private_lock);
  			if (!ret)
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3731
  				continue;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
  
  			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 ...
3770
  /**
4bef08485   Chris Mason   Btrfs: Tree loggi...
3771
   * 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 ...
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
   * @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...
3785
  static int extent_write_cache_pages(struct extent_io_tree *tree,
4bef08485   Chris Mason   Btrfs: Tree loggi...
3786
3787
  			     struct address_space *mapping,
  			     struct writeback_control *wbc,
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3788
3789
  			     writepage_t writepage, void *data,
  			     void (*flush_fn)(void *))
d1310b2e0   Chris Mason   Btrfs: Split the ...
3790
  {
7fd1a3f73   Josef Bacik   Btrfs: hold a ref...
3791
  	struct inode *inode = mapping->host;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3792
3793
  	int ret = 0;
  	int done = 0;
61391d562   Filipe Manana   Btrfs: fix hang o...
3794
  	int err = 0;
f85d7d6c8   Chris Mason   Btrfs: properly h...
3795
  	int nr_to_write_done = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3796
3797
3798
3799
3800
  	struct pagevec pvec;
  	int nr_pages;
  	pgoff_t index;
  	pgoff_t end;		/* Inclusive */
  	int scanned = 0;
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3801
  	int tag;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3802

7fd1a3f73   Josef Bacik   Btrfs: hold a ref...
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
  	/*
  	 * 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 ...
3814
3815
3816
3817
3818
3819
3820
  	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 ...
3821
3822
  		scanned = 1;
  	}
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3823
3824
3825
3826
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag = PAGECACHE_TAG_TOWRITE;
  	else
  		tag = PAGECACHE_TAG_DIRTY;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3827
  retry:
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3828
3829
  	if (wbc->sync_mode == WB_SYNC_ALL)
  		tag_pages_for_writeback(mapping, index, end);
f85d7d6c8   Chris Mason   Btrfs: properly h...
3830
  	while (!done && !nr_to_write_done && (index <= end) &&
f7aaa06bf   Josef Bacik   Btrfs: tag pages ...
3831
3832
  	       (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, tag,
  			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
  		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...
3846
3847
3848
  			if (!trylock_page(page)) {
  				flush_fn(data);
  				lock_page(page);
01d658f2c   Chris Mason   Btrfs: make sure ...
3849
  			}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
  
  			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...
3861
  			if (wbc->sync_mode != WB_SYNC_NONE) {
0e6bd956e   Chris Mason   Btrfs: only flush...
3862
3863
  				if (PageWriteback(page))
  					flush_fn(data);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3864
  				wait_on_page_writeback(page);
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3865
  			}
d1310b2e0   Chris Mason   Btrfs: Split the ...
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
  
  			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;
  			}
61391d562   Filipe Manana   Btrfs: fix hang o...
3879
3880
  			if (!err && ret < 0)
  				err = ret;
f85d7d6c8   Chris Mason   Btrfs: properly h...
3881
3882
3883
3884
3885
3886
3887
  
  			/*
  			 * 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 ...
3888
3889
3890
3891
  		}
  		pagevec_release(&pvec);
  		cond_resched();
  	}
61391d562   Filipe Manana   Btrfs: fix hang o...
3892
  	if (!scanned && !done && !err) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
3893
3894
3895
3896
3897
3898
3899
3900
  		/*
  		 * 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...
3901
  	btrfs_add_delayed_iput(inode);
61391d562   Filipe Manana   Btrfs: fix hang o...
3902
  	return err;
d1310b2e0   Chris Mason   Btrfs: Split the ...
3903
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3904

ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3905
  static void flush_epd_write_bio(struct extent_page_data *epd)
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3906
  {
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3907
  	if (epd->bio) {
355808c29   Jeff Mahoney   btrfs: ->submit_b...
3908
3909
  		int rw = WRITE;
  		int ret;
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3910
  		if (epd->sync_io)
355808c29   Jeff Mahoney   btrfs: ->submit_b...
3911
  			rw = WRITE_SYNC;
de0022b9d   Josef Bacik   Btrfs: do not asy...
3912
  		ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags);
79787eaab   Jeff Mahoney   btrfs: replace ma...
3913
  		BUG_ON(ret < 0); /* -ENOMEM */
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3914
3915
3916
  		epd->bio = NULL;
  	}
  }
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3917
3918
3919
3920
3921
  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 ...
3922
3923
3924
3925
3926
  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 ...
3927
3928
3929
3930
  	struct extent_page_data epd = {
  		.bio = NULL,
  		.tree = tree,
  		.get_extent = get_extent,
771ed689d   Chris Mason   Btrfs: Optimize c...
3931
  		.extent_locked = 0,
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3932
  		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3933
  		.bio_flags = 0,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3934
  	};
d1310b2e0   Chris Mason   Btrfs: Split the ...
3935

d1310b2e0   Chris Mason   Btrfs: Split the ...
3936
  	ret = __extent_writepage(page, wbc, &epd);
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3937
  	flush_epd_write_bio(&epd);
d1310b2e0   Chris Mason   Btrfs: Split the ...
3938
3939
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3940

771ed689d   Chris Mason   Btrfs: Optimize c...
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
  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_...
3956
  		.sync_io = mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3957
  		.bio_flags = 0,
771ed689d   Chris Mason   Btrfs: Optimize c...
3958
3959
  	};
  	struct writeback_control wbc_writepages = {
771ed689d   Chris Mason   Btrfs: Optimize c...
3960
  		.sync_mode	= mode,
771ed689d   Chris Mason   Btrfs: Optimize c...
3961
3962
3963
3964
  		.nr_to_write	= nr_pages * 2,
  		.range_start	= start,
  		.range_end	= end + 1,
  	};
d397712bc   Chris Mason   Btrfs: Fix checkp...
3965
  	while (start <= end) {
771ed689d   Chris Mason   Btrfs: Optimize c...
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
  		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_...
3979
  	flush_epd_write_bio(&epd);
771ed689d   Chris Mason   Btrfs: Optimize c...
3980
3981
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
  
  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...
3993
  		.extent_locked = 0,
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
3994
  		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
de0022b9d   Josef Bacik   Btrfs: do not asy...
3995
  		.bio_flags = 0,
d1310b2e0   Chris Mason   Btrfs: Split the ...
3996
  	};
4bef08485   Chris Mason   Btrfs: Tree loggi...
3997
  	ret = extent_write_cache_pages(tree, mapping, wbc,
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
3998
3999
  				       __extent_writepage, &epd,
  				       flush_write_bio);
ffbd517d5   Chris Mason   Btrfs: use WRITE_...
4000
  	flush_epd_write_bio(&epd);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4001
4002
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4003
4004
4005
4006
4007
4008
4009
4010
  
  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...
4011
  	unsigned long bio_flags = 0;
67c9684f4   Liu Bo   Btrfs: improve mu...
4012
4013
  	struct page *pagepool[16];
  	struct page *page;
125bac016   Miao Xie   Btrfs: cache the ...
4014
  	struct extent_map *em_cached = NULL;
67c9684f4   Liu Bo   Btrfs: improve mu...
4015
  	int nr = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4016

d1310b2e0   Chris Mason   Btrfs: Split the ...
4017
  	for (page_idx = 0; page_idx < nr_pages; page_idx++) {
67c9684f4   Liu Bo   Btrfs: improve mu...
4018
  		page = list_entry(pages->prev, struct page, lru);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4019
4020
4021
  
  		prefetchw(&page->flags);
  		list_del(&page->lru);
67c9684f4   Liu Bo   Btrfs: improve mu...
4022
  		if (add_to_page_cache_lru(page, mapping,
43e817a1f   Itaru Kitayama   btrfs: fix wrong ...
4023
  					page->index, GFP_NOFS)) {
67c9684f4   Liu Bo   Btrfs: improve mu...
4024
4025
  			page_cache_release(page);
  			continue;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4026
  		}
67c9684f4   Liu Bo   Btrfs: improve mu...
4027
4028
4029
4030
  
  		pagepool[nr++] = page;
  		if (nr < ARRAY_SIZE(pagepool))
  			continue;
125bac016   Miao Xie   Btrfs: cache the ...
4031
  		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
4032
  				   &bio, 0, &bio_flags, READ);
67c9684f4   Liu Bo   Btrfs: improve mu...
4033
  		nr = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4034
  	}
9974090bd   Miao Xie   Btrfs: batch the ...
4035
  	if (nr)
125bac016   Miao Xie   Btrfs: cache the ...
4036
  		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
9974090bd   Miao Xie   Btrfs: batch the ...
4037
  				   &bio, 0, &bio_flags, READ);
67c9684f4   Liu Bo   Btrfs: improve mu...
4038

125bac016   Miao Xie   Btrfs: cache the ...
4039
4040
  	if (em_cached)
  		free_extent_map(em_cached);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4041
4042
  	BUG_ON(!list_empty(pages));
  	if (bio)
79787eaab   Jeff Mahoney   btrfs: replace ma...
4043
  		return submit_one_bio(READ, bio, 0, bio_flags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4044
4045
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4046
4047
4048
4049
4050
4051
4052
4053
4054
  
  /*
   * 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 ...
4055
  	struct extent_state *cached_state = NULL;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
4056
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4057
4058
  	u64 end = start + PAGE_CACHE_SIZE - 1;
  	size_t blocksize = page->mapping->host->i_sb->s_blocksize;
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
4059
  	start += ALIGN(offset, blocksize);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4060
4061
  	if (start > end)
  		return 0;
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
4062
  	lock_extent_bits(tree, start, end, 0, &cached_state);
1edbb734b   Chris Mason   Btrfs: reduce CPU...
4063
  	wait_on_page_writeback(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4064
  	clear_extent_bit(tree, start, end,
32c00aff7   Josef Bacik   Btrfs: release de...
4065
4066
  			 EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC |
  			 EXTENT_DO_ACCOUNTING,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
4067
  			 1, 1, &cached_state, GFP_NOFS);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4068
4069
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4070
4071
  
  /*
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4072
4073
4074
4075
   * 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...
4076
4077
4078
  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...
4079
  {
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
4080
  	u64 start = page_offset(page);
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4081
4082
  	u64 end = start + PAGE_CACHE_SIZE - 1;
  	int ret = 1;
211f90e68   Chris Mason   Btrfs: Don't allo...
4083
  	if (test_range_bit(tree, start, end,
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
4084
  			   EXTENT_IOBITS, 0, NULL))
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4085
4086
4087
4088
  		ret = 0;
  	else {
  		if ((mask & GFP_NOFS) == GFP_NOFS)
  			mask = GFP_NOFS;
11ef160fd   Chris Mason   Btrfs: fix releas...
4089
4090
4091
4092
  		/*
  		 * at this point we can safely clear everything except the
  		 * locked bit and the nodatasum bit
  		 */
e3f24cc52   Chris Mason   Btrfs: don't rele...
4093
  		ret = clear_extent_bit(tree, start, end,
11ef160fd   Chris Mason   Btrfs: fix releas...
4094
4095
  				 ~(EXTENT_LOCKED | EXTENT_NODATASUM),
  				 0, 0, NULL, mask);
e3f24cc52   Chris Mason   Btrfs: don't rele...
4096
4097
4098
4099
4100
4101
4102
4103
  
  		/* 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...
4104
4105
4106
  	}
  	return ret;
  }
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4107
4108
  
  /*
d1310b2e0   Chris Mason   Btrfs: Split the ...
4109
4110
4111
4112
4113
   * 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 ...
4114
4115
  			       struct extent_io_tree *tree, struct page *page,
  			       gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4116
4117
  {
  	struct extent_map *em;
4eee4fa4f   Miao Xie   Btrfs: use wrappe...
4118
  	u64 start = page_offset(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4119
  	u64 end = start + PAGE_CACHE_SIZE - 1;
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4120

70dec8079   Chris Mason   Btrfs: extent_io ...
4121
4122
  	if ((mask & __GFP_WAIT) &&
  	    page->mapping->host->i_size > 16 * 1024 * 1024) {
39b5637f6   Yan   Btrfs: Fix "no cs...
4123
  		u64 len;
70dec8079   Chris Mason   Btrfs: extent_io ...
4124
  		while (start <= end) {
39b5637f6   Yan   Btrfs: Fix "no cs...
4125
  			len = end - start + 1;
890871be8   Chris Mason   Btrfs: switch ext...
4126
  			write_lock(&map->lock);
39b5637f6   Yan   Btrfs: Fix "no cs...
4127
  			em = lookup_extent_mapping(map, start, len);
285190d99   Tsutomu Itoh   Btrfs: check retu...
4128
  			if (!em) {
890871be8   Chris Mason   Btrfs: switch ext...
4129
  				write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
4130
4131
  				break;
  			}
7f3c74fb8   Chris Mason   Btrfs: Keep exten...
4132
4133
  			if (test_bit(EXTENT_FLAG_PINNED, &em->flags) ||
  			    em->start != start) {
890871be8   Chris Mason   Btrfs: switch ext...
4134
  				write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
4135
4136
4137
4138
4139
  				free_extent_map(em);
  				break;
  			}
  			if (!test_range_bit(tree, em->start,
  					    extent_map_end(em) - 1,
8b62b72b2   Chris Mason   Btrfs: Use PagePr...
4140
  					    EXTENT_LOCKED | EXTENT_WRITEBACK,
9655d2982   Chris Mason   Btrfs: use a cach...
4141
  					    0, NULL)) {
70dec8079   Chris Mason   Btrfs: extent_io ...
4142
4143
4144
4145
4146
  				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...
4147
  			write_unlock(&map->lock);
70dec8079   Chris Mason   Btrfs: extent_io ...
4148
4149
  
  			/* once for us */
d1310b2e0   Chris Mason   Btrfs: Split the ...
4150
4151
  			free_extent_map(em);
  		}
d1310b2e0   Chris Mason   Btrfs: Split the ...
4152
  	}
7b13b7b11   Chris Mason   Btrfs: Don't drop...
4153
  	return try_release_extent_state(map, tree, page, mask);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4154
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4155

ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
  /*
   * 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;
678712545   Dulshani Gunawardhana   btrfs: Fix checkp...
4171
  	while (1) {
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4172
4173
4174
  		len = last - offset;
  		if (len == 0)
  			break;
fda2832fe   Qu Wenruo   btrfs: cleanup fo...
4175
  		len = ALIGN(len, sectorsize);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4176
  		em = get_extent(inode, NULL, 0, offset, len, 0);
c704005d8   David Sterba   btrfs: unify chec...
4177
  		if (IS_ERR_OR_NULL(em))
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
  			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...
4194
4195
4196
  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
4197
  	int ret = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4198
4199
4200
  	u64 off = start;
  	u64 max = start + len;
  	u32 flags = 0;
975f84fee   Josef Bacik   Btrfs: fix fiemap
4201
4202
  	u32 found_type;
  	u64 last;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4203
  	u64 last_for_get_extent = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4204
  	u64 disko = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4205
  	u64 isize = i_size_read(inode);
975f84fee   Josef Bacik   Btrfs: fix fiemap
4206
  	struct btrfs_key found_key;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4207
  	struct extent_map *em = NULL;
2ac55d41b   Josef Bacik   Btrfs: cache the ...
4208
  	struct extent_state *cached_state = NULL;
975f84fee   Josef Bacik   Btrfs: fix fiemap
4209
  	struct btrfs_path *path;
dc046b10c   Josef Bacik   Btrfs: make fiema...
4210
  	struct btrfs_root *root = BTRFS_I(inode)->root;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4211
  	int end = 0;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4212
4213
4214
  	u64 em_start = 0;
  	u64 em_len = 0;
  	u64 em_end = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4215
4216
4217
  
  	if (len == 0)
  		return -EINVAL;
975f84fee   Josef Bacik   Btrfs: fix fiemap
4218
4219
4220
4221
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
  	path->leave_spinning = 1;
2c91943b5   Qu Wenruo   btrfs: Return rig...
4222
4223
  	start = round_down(start, BTRFS_I(inode)->root->sectorsize);
  	len = round_up(max, BTRFS_I(inode)->root->sectorsize) - start;
4d479cf01   Josef Bacik   Btrfs: sectorsize...
4224

ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4225
4226
4227
4228
  	/*
  	 * lookup the last file extent.  We're not using i_size here
  	 * because there might be preallocation past i_size
  	 */
dc046b10c   Josef Bacik   Btrfs: make fiema...
4229
4230
  	ret = btrfs_lookup_file_extent(NULL, root, path, btrfs_ino(inode), -1,
  				       0);
975f84fee   Josef Bacik   Btrfs: fix fiemap
4231
4232
4233
4234
4235
4236
  	if (ret < 0) {
  		btrfs_free_path(path);
  		return ret;
  	}
  	WARN_ON(!ret);
  	path->slots[0]--;
975f84fee   Josef Bacik   Btrfs: fix fiemap
4237
  	btrfs_item_key_to_cpu(path->nodes[0], &found_key, path->slots[0]);
962a298f3   David Sterba   btrfs: kill the k...
4238
  	found_type = found_key.type;
975f84fee   Josef Bacik   Btrfs: fix fiemap
4239

ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4240
  	/* No extents, but there might be delalloc bits */
33345d015   Li Zefan   Btrfs: Always use...
4241
  	if (found_key.objectid != btrfs_ino(inode) ||
975f84fee   Josef Bacik   Btrfs: fix fiemap
4242
  	    found_type != BTRFS_EXTENT_DATA_KEY) {
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
  		/* 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
4254
  	}
fe09e16cc   Liu Bo   Btrfs: export btr...
4255
  	btrfs_release_path(path);
975f84fee   Josef Bacik   Btrfs: fix fiemap
4256

ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4257
4258
4259
4260
4261
4262
4263
4264
4265
  	/*
  	 * 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...
4266
  	lock_extent_bits(&BTRFS_I(inode)->io_tree, start, start + len - 1, 0,
d0082371c   Jeff Mahoney   btrfs: drop gfp_t...
4267
  			 &cached_state);
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4268

4d479cf01   Josef Bacik   Btrfs: sectorsize...
4269
  	em = get_extent_skip_holes(inode, start, last_for_get_extent,
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4270
  				   get_extent);
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4271
4272
4273
4274
4275
4276
  	if (!em)
  		goto out;
  	if (IS_ERR(em)) {
  		ret = PTR_ERR(em);
  		goto out;
  	}
975f84fee   Josef Bacik   Btrfs: fix fiemap
4277

1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4278
  	while (!end) {
b76bb7013   Josef Bacik   Btrfs: do not off...
4279
  		u64 offset_in_extent = 0;
ea8efc74b   Chris Mason   Btrfs: make sure ...
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
  
  		/* 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...
4292

ea8efc74b   Chris Mason   Btrfs: make sure ...
4293
4294
  		/*
  		 * record the offset from the start of the extent
b76bb7013   Josef Bacik   Btrfs: do not off...
4295
4296
4297
  		 * 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 ...
4298
  		 */
b76bb7013   Josef Bacik   Btrfs: do not off...
4299
4300
  		if (!test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
  			offset_in_extent = em_start - em->start;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4301
  		em_end = extent_map_end(em);
ea8efc74b   Chris Mason   Btrfs: make sure ...
4302
  		em_len = em_end - em_start;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4303
4304
  		disko = 0;
  		flags = 0;
ea8efc74b   Chris Mason   Btrfs: make sure ...
4305
4306
4307
4308
4309
4310
  		/*
  		 * 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...
4311
  		if (em->block_start == EXTENT_MAP_LAST_BYTE) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4312
4313
  			end = 1;
  			flags |= FIEMAP_EXTENT_LAST;
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4314
  		} else if (em->block_start == EXTENT_MAP_INLINE) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4315
4316
  			flags |= (FIEMAP_EXTENT_DATA_INLINE |
  				  FIEMAP_EXTENT_NOT_ALIGNED);
93dbfad7a   Heiko Carstens   Btrfs: fix __ucmp...
4317
  		} else if (em->block_start == EXTENT_MAP_DELALLOC) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4318
4319
  			flags |= (FIEMAP_EXTENT_DELALLOC |
  				  FIEMAP_EXTENT_UNKNOWN);
dc046b10c   Josef Bacik   Btrfs: make fiema...
4320
4321
4322
  		} else if (fieinfo->fi_extents_max) {
  			u64 bytenr = em->block_start -
  				(em->start - em->orig_start);
fe09e16cc   Liu Bo   Btrfs: export btr...
4323

ea8efc74b   Chris Mason   Btrfs: make sure ...
4324
  			disko = em->block_start + offset_in_extent;
fe09e16cc   Liu Bo   Btrfs: export btr...
4325
4326
4327
4328
  
  			/*
  			 * As btrfs supports shared space, this information
  			 * can be exported to userspace tools via
dc046b10c   Josef Bacik   Btrfs: make fiema...
4329
4330
4331
  			 * flag FIEMAP_EXTENT_SHARED.  If fi_extents_max == 0
  			 * then we're just getting a count and we can skip the
  			 * lookup stuff.
fe09e16cc   Liu Bo   Btrfs: export btr...
4332
  			 */
dc046b10c   Josef Bacik   Btrfs: make fiema...
4333
4334
4335
4336
  			ret = btrfs_check_shared(NULL, root->fs_info,
  						 root->objectid,
  						 btrfs_ino(inode), bytenr);
  			if (ret < 0)
fe09e16cc   Liu Bo   Btrfs: export btr...
4337
  				goto out_free;
dc046b10c   Josef Bacik   Btrfs: make fiema...
4338
  			if (ret)
fe09e16cc   Liu Bo   Btrfs: export btr...
4339
  				flags |= FIEMAP_EXTENT_SHARED;
dc046b10c   Josef Bacik   Btrfs: make fiema...
4340
  			ret = 0;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4341
4342
4343
  		}
  		if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
  			flags |= FIEMAP_EXTENT_ENCODED;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4344
4345
  		free_extent_map(em);
  		em = NULL;
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4346
4347
  		if ((em_start >= last) || em_len == (u64)-1 ||
  		   (last == (u64)-1 && isize <= em_end)) {
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4348
4349
4350
  			flags |= FIEMAP_EXTENT_LAST;
  			end = 1;
  		}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4351
4352
4353
4354
4355
4356
4357
4358
  		/* 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
4359
4360
4361
  			flags |= FIEMAP_EXTENT_LAST;
  			end = 1;
  		}
ec29ed5b4   Chris Mason   Btrfs: fix fiemap...
4362
4363
4364
4365
  		ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
  					      em_len, flags);
  		if (ret)
  			goto out_free;
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4366
4367
4368
4369
  	}
  out_free:
  	free_extent_map(em);
  out:
fe09e16cc   Liu Bo   Btrfs: export btr...
4370
  	btrfs_free_path(path);
a52f4cd2b   Liu Bo   Btrfs: fix off-by...
4371
  	unlock_extent_cached(&BTRFS_I(inode)->io_tree, start, start + len - 1,
2ac55d41b   Josef Bacik   Btrfs: cache the ...
4372
  			     &cached_state, GFP_NOFS);
1506fcc81   Yehuda Sadeh   Btrfs: fiemap sup...
4373
4374
  	return ret;
  }
727011e07   Chris Mason   Btrfs: allow meta...
4375
4376
  static void __free_extent_buffer(struct extent_buffer *eb)
  {
6d49ba1b4   Eric Sandeen   btrfs: move leak ...
4377
  	btrfs_leak_debug_del(&eb->leak_list);
727011e07   Chris Mason   Btrfs: allow meta...
4378
4379
  	kmem_cache_free(extent_buffer_cache, eb);
  }
a26e8c9f7   Josef Bacik   Btrfs: don't clea...
4380
  int extent_buffer_under_io(struct extent_buffer *eb)
db7f3436c   Josef Bacik   Btrfs: deal with ...
4381
4382
4383
4384
4385
4386
4387
4388
4389
  {
  	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.
   */
a50924e3a   David Sterba   btrfs: drop const...
4390
  static void btrfs_release_extent_buffer_page(struct extent_buffer *eb)
db7f3436c   Josef Bacik   Btrfs: deal with ...
4391
4392
  {
  	unsigned long index;
db7f3436c   Josef Bacik   Btrfs: deal with ...
4393
4394
4395
4396
  	struct page *page;
  	int mapped = !test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags);
  
  	BUG_ON(extent_buffer_under_io(eb));
a50924e3a   David Sterba   btrfs: drop const...
4397
4398
  	index = num_extent_pages(eb->start, eb->len);
  	if (index == 0)
db7f3436c   Josef Bacik   Btrfs: deal with ...
4399
4400
4401
4402
  		return;
  
  	do {
  		index--;
fb85fc9a6   David Sterba   btrfs: kill exten...
4403
  		page = eb->pages[index];
db7f3436c   Josef Bacik   Btrfs: deal with ...
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
  		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);
  		}
a50924e3a   David Sterba   btrfs: drop const...
4434
  	} while (index != 0);
db7f3436c   Josef Bacik   Btrfs: deal with ...
4435
4436
4437
4438
4439
4440
4441
  }
  
  /*
   * Helper for releasing the extent buffer.
   */
  static inline void btrfs_release_extent_buffer(struct extent_buffer *eb)
  {
a50924e3a   David Sterba   btrfs: drop const...
4442
  	btrfs_release_extent_buffer_page(eb);
db7f3436c   Josef Bacik   Btrfs: deal with ...
4443
4444
  	__free_extent_buffer(eb);
  }
f28491e0a   Josef Bacik   Btrfs: move the e...
4445
4446
4447
  static struct extent_buffer *
  __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start,
  		      unsigned long len, gfp_t mask)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4448
4449
  {
  	struct extent_buffer *eb = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4450
  	eb = kmem_cache_zalloc(extent_buffer_cache, mask);
91ca338d7   Tsutomu Itoh   btrfs: check NULL...
4451
4452
  	if (eb == NULL)
  		return NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4453
4454
  	eb->start = start;
  	eb->len = len;
f28491e0a   Josef Bacik   Btrfs: move the e...
4455
  	eb->fs_info = fs_info;
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4456
  	eb->bflags = 0;
bd681513f   Chris Mason   Btrfs: switch the...
4457
4458
4459
4460
4461
4462
4463
  	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...
4464
  	eb->lock_nested = 0;
bd681513f   Chris Mason   Btrfs: switch the...
4465
4466
  	init_waitqueue_head(&eb->write_lock_wq);
  	init_waitqueue_head(&eb->read_lock_wq);
b4ce94de9   Chris Mason   Btrfs: Change btr...
4467

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

b8dae3138   David Sterba   btrfs: use only i...
4473
4474
4475
4476
4477
4478
  	/*
  	 * 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 ...
4479
4480
4481
  
  	return eb;
  }
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4482
4483
4484
4485
4486
4487
  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...
4488
  	new = __alloc_extent_buffer(NULL, src->start, src->len, GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4489
4490
4491
4492
  	if (new == NULL)
  		return NULL;
  
  	for (i = 0; i < num_pages; i++) {
9ec726775   Josef Bacik   Btrfs: stop using...
4493
  		p = alloc_page(GFP_NOFS);
db7f3436c   Josef Bacik   Btrfs: deal with ...
4494
4495
4496
4497
  		if (!p) {
  			btrfs_release_extent_buffer(new);
  			return NULL;
  		}
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
  		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...
4516
  	eb = __alloc_extent_buffer(NULL, start, len, GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4517
4518
4519
4520
  	if (!eb)
  		return NULL;
  
  	for (i = 0; i < num_pages; i++) {
9ec726775   Josef Bacik   Btrfs: stop using...
4521
  		eb->pages[i] = alloc_page(GFP_NOFS);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4522
4523
4524
4525
4526
4527
4528
4529
4530
  		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 ...
4531
4532
  	for (; i > 0; i--)
  		__free_page(eb->pages[i - 1]);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4533
4534
4535
  	__free_extent_buffer(eb);
  	return NULL;
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4536
4537
  static void check_buffer_tree_ref(struct extent_buffer *eb)
  {
242e18c7c   Chris Mason   Btrfs: reduce loc...
4538
  	int refs;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
  	/* 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...
4559
4560
4561
  	refs = atomic_read(&eb->refs);
  	if (refs >= 2 && test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
  		return;
594831c4b   Josef Bacik   Btrfs: fix potent...
4562
4563
  	spin_lock(&eb->refs_lock);
  	if (!test_and_set_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4564
  		atomic_inc(&eb->refs);
594831c4b   Josef Bacik   Btrfs: fix potent...
4565
  	spin_unlock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4566
  }
2457aec63   Mel Gorman   mm: non-atomicall...
4567
4568
  static void mark_extent_buffer_accessed(struct extent_buffer *eb,
  		struct page *accessed)
5df4235ea   Josef Bacik   Btrfs: introduce ...
4569
4570
  {
  	unsigned long num_pages, i;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4571
  	check_buffer_tree_ref(eb);
5df4235ea   Josef Bacik   Btrfs: introduce ...
4572
4573
  	num_pages = num_extent_pages(eb->start, eb->len);
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4574
  		struct page *p = eb->pages[i];
2457aec63   Mel Gorman   mm: non-atomicall...
4575
4576
  		if (p != accessed)
  			mark_page_accessed(p);
5df4235ea   Josef Bacik   Btrfs: introduce ...
4577
4578
  	}
  }
f28491e0a   Josef Bacik   Btrfs: move the e...
4579
4580
  struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info,
  					 u64 start)
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4581
4582
4583
4584
  {
  	struct extent_buffer *eb;
  
  	rcu_read_lock();
f28491e0a   Josef Bacik   Btrfs: move the e...
4585
4586
  	eb = radix_tree_lookup(&fs_info->buffer_radix,
  			       start >> PAGE_CACHE_SHIFT);
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4587
4588
  	if (eb && atomic_inc_not_zero(&eb->refs)) {
  		rcu_read_unlock();
2457aec63   Mel Gorman   mm: non-atomicall...
4589
  		mark_extent_buffer_accessed(eb, NULL);
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4590
4591
4592
4593
4594
4595
  		return eb;
  	}
  	rcu_read_unlock();
  
  	return NULL;
  }
faa2dbf00   Josef Bacik   Btrfs: add sanity...
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
  #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
  struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
  					       u64 start, unsigned long len)
  {
  	struct extent_buffer *eb, *exists = NULL;
  	int ret;
  
  	eb = find_extent_buffer(fs_info, start);
  	if (eb)
  		return eb;
  	eb = alloc_dummy_extent_buffer(start, len);
  	if (!eb)
  		return NULL;
  	eb->fs_info = fs_info;
  again:
  	ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
  	if (ret)
  		goto free_eb;
  	spin_lock(&fs_info->buffer_lock);
  	ret = radix_tree_insert(&fs_info->buffer_radix,
  				start >> PAGE_CACHE_SHIFT, eb);
  	spin_unlock(&fs_info->buffer_lock);
  	radix_tree_preload_end();
  	if (ret == -EEXIST) {
  		exists = find_extent_buffer(fs_info, start);
  		if (exists)
  			goto free_eb;
  		else
  			goto again;
  	}
  	check_buffer_tree_ref(eb);
  	set_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags);
  
  	/*
  	 * We will free dummy extent buffer's if they come into
  	 * free_extent_buffer with a ref count of 2, but if we are using this we
  	 * want the buffers to stay in memory until we're done with them, so
  	 * bump the ref count again.
  	 */
  	atomic_inc(&eb->refs);
  	return eb;
  free_eb:
  	btrfs_release_extent_buffer(eb);
  	return exists;
  }
  #endif
f28491e0a   Josef Bacik   Btrfs: move the e...
4642
  struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
727011e07   Chris Mason   Btrfs: allow meta...
4643
  					  u64 start, unsigned long len)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4644
4645
4646
4647
4648
  {
  	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...
4649
  	struct extent_buffer *exists = NULL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4650
  	struct page *p;
f28491e0a   Josef Bacik   Btrfs: move the e...
4651
  	struct address_space *mapping = fs_info->btree_inode->i_mapping;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4652
  	int uptodate = 1;
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4653
  	int ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4654

f28491e0a   Josef Bacik   Btrfs: move the e...
4655
  	eb = find_extent_buffer(fs_info, start);
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4656
  	if (eb)
6af118ce5   Chris Mason   Btrfs: Index exte...
4657
  		return eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
4658

f28491e0a   Josef Bacik   Btrfs: move the e...
4659
  	eb = __alloc_extent_buffer(fs_info, start, len, GFP_NOFS);
2b114d1d3   Peter   Btrfs: Correct us...
4660
  	if (!eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4661
  		return NULL;
727011e07   Chris Mason   Btrfs: allow meta...
4662
  	for (i = 0; i < num_pages; i++, index++) {
a65917156   Chris Mason   Btrfs: stop using...
4663
  		p = find_or_create_page(mapping, index, GFP_NOFS);
4804b3829   Josef Bacik   Btrfs: do not war...
4664
  		if (!p)
6af118ce5   Chris Mason   Btrfs: Index exte...
4665
  			goto free_eb;
4f2de97ac   Josef Bacik   Btrfs: set page->...
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
  
  		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...
4680
  				page_cache_release(p);
2457aec63   Mel Gorman   mm: non-atomicall...
4681
  				mark_extent_buffer_accessed(exists, p);
4f2de97ac   Josef Bacik   Btrfs: set page->...
4682
4683
  				goto free_eb;
  			}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4684
  			/*
4f2de97ac   Josef Bacik   Btrfs: set page->...
4685
4686
4687
4688
  			 * 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 ...
4689
  			WARN_ON(PageDirty(p));
4f2de97ac   Josef Bacik   Btrfs: set page->...
4690
  			page_cache_release(p);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4691
  		}
4f2de97ac   Josef Bacik   Btrfs: set page->...
4692
4693
  		attach_extent_buffer_page(eb, p);
  		spin_unlock(&mapping->private_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4694
  		WARN_ON(PageDirty(p));
727011e07   Chris Mason   Btrfs: allow meta...
4695
  		eb->pages[i] = p;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4696
4697
  		if (!PageUptodate(p))
  			uptodate = 0;
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4698
4699
4700
4701
4702
  
  		/*
  		 * see below about how we avoid a nasty race with release page
  		 * and why we unlock later
  		 */
d1310b2e0   Chris Mason   Btrfs: Split the ...
4703
4704
  	}
  	if (uptodate)
b4ce94de9   Chris Mason   Btrfs: Change btr...
4705
  		set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
115391d23   Josef Bacik   Btrfs: only use t...
4706
  again:
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4707
4708
4709
  	ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
  	if (ret)
  		goto free_eb;
f28491e0a   Josef Bacik   Btrfs: move the e...
4710
4711
4712
4713
  	spin_lock(&fs_info->buffer_lock);
  	ret = radix_tree_insert(&fs_info->buffer_radix,
  				start >> PAGE_CACHE_SHIFT, eb);
  	spin_unlock(&fs_info->buffer_lock);
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4714
  	radix_tree_preload_end();
19fe0a8b7   Miao Xie   Btrfs: Switch the...
4715
  	if (ret == -EEXIST) {
f28491e0a   Josef Bacik   Btrfs: move the e...
4716
  		exists = find_extent_buffer(fs_info, start);
452c75c3d   Chandra Seetharaman   Btrfs: Simplify t...
4717
4718
4719
  		if (exists)
  			goto free_eb;
  		else
115391d23   Josef Bacik   Btrfs: only use t...
4720
  			goto again;
6af118ce5   Chris Mason   Btrfs: Index exte...
4721
  	}
6af118ce5   Chris Mason   Btrfs: Index exte...
4722
  	/* add one reference for the tree */
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4723
  	check_buffer_tree_ref(eb);
34b41acec   Josef Bacik   Btrfs: use a bit ...
4724
  	set_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags);
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
  
  	/*
  	 * 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...
4735
4736
  	SetPageChecked(eb->pages[0]);
  	for (i = 1; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4737
  		p = eb->pages[i];
727011e07   Chris Mason   Btrfs: allow meta...
4738
4739
4740
4741
  		ClearPageChecked(p);
  		unlock_page(p);
  	}
  	unlock_page(eb->pages[0]);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4742
  	return eb;
6af118ce5   Chris Mason   Btrfs: Index exte...
4743
  free_eb:
727011e07   Chris Mason   Btrfs: allow meta...
4744
4745
4746
4747
  	for (i = 0; i < num_pages; i++) {
  		if (eb->pages[i])
  			unlock_page(eb->pages[i]);
  	}
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4748

17de39ac1   Josef Bacik   Btrfs: fix page l...
4749
  	WARN_ON(!atomic_dec_and_test(&eb->refs));
897ca6e9b   Miao Xie   Btrfs: restructur...
4750
  	btrfs_release_extent_buffer(eb);
6af118ce5   Chris Mason   Btrfs: Index exte...
4751
  	return exists;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4752
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4753

3083ee2e1   Josef Bacik   Btrfs: introduce ...
4754
4755
4756
4757
4758
4759
4760
  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 ...
4761
  /* Expects to have eb->eb_lock already held */
f7a52a40c   David Sterba   btrfs: remove unu...
4762
  static int release_extent_buffer(struct extent_buffer *eb)
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4763
4764
4765
  {
  	WARN_ON(atomic_read(&eb->refs) == 0);
  	if (atomic_dec_and_test(&eb->refs)) {
34b41acec   Josef Bacik   Btrfs: use a bit ...
4766
  		if (test_and_clear_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags)) {
f28491e0a   Josef Bacik   Btrfs: move the e...
4767
  			struct btrfs_fs_info *fs_info = eb->fs_info;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4768

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

f28491e0a   Josef Bacik   Btrfs: move the e...
4771
4772
  			spin_lock(&fs_info->buffer_lock);
  			radix_tree_delete(&fs_info->buffer_radix,
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4773
  					  eb->start >> PAGE_CACHE_SHIFT);
f28491e0a   Josef Bacik   Btrfs: move the e...
4774
  			spin_unlock(&fs_info->buffer_lock);
34b41acec   Josef Bacik   Btrfs: use a bit ...
4775
4776
  		} else {
  			spin_unlock(&eb->refs_lock);
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4777
  		}
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4778
4779
  
  		/* Should be safe to release our pages at this point */
a50924e3a   David Sterba   btrfs: drop const...
4780
  		btrfs_release_extent_buffer_page(eb);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4781
  		call_rcu(&eb->rcu_head, btrfs_release_extent_buffer_rcu);
e64860aa0   Josef Bacik   Btrfs: don't retu...
4782
  		return 1;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4783
4784
  	}
  	spin_unlock(&eb->refs_lock);
e64860aa0   Josef Bacik   Btrfs: don't retu...
4785
4786
  
  	return 0;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4787
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4788
4789
  void free_extent_buffer(struct extent_buffer *eb)
  {
242e18c7c   Chris Mason   Btrfs: reduce loc...
4790
4791
  	int refs;
  	int old;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4792
4793
  	if (!eb)
  		return;
242e18c7c   Chris Mason   Btrfs: reduce loc...
4794
4795
4796
4797
4798
4799
4800
4801
  	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 ...
4802
4803
  	spin_lock(&eb->refs_lock);
  	if (atomic_read(&eb->refs) == 2 &&
815a51c74   Jan Schmidt   Btrfs: dummy exte...
4804
4805
4806
4807
  	    test_bit(EXTENT_BUFFER_DUMMY, &eb->bflags))
  		atomic_dec(&eb->refs);
  
  	if (atomic_read(&eb->refs) == 2 &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4808
  	    test_bit(EXTENT_BUFFER_STALE, &eb->bflags) &&
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4809
  	    !extent_buffer_under_io(eb) &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4810
4811
4812
4813
4814
4815
4816
  	    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...
4817
  	release_extent_buffer(eb);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4818
4819
4820
4821
4822
  }
  
  void free_extent_buffer_stale(struct extent_buffer *eb)
  {
  	if (!eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4823
  		return;
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4824
4825
  	spin_lock(&eb->refs_lock);
  	set_bit(EXTENT_BUFFER_STALE, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4826
  	if (atomic_read(&eb->refs) == 2 && !extent_buffer_under_io(eb) &&
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4827
4828
  	    test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
  		atomic_dec(&eb->refs);
f7a52a40c   David Sterba   btrfs: remove unu...
4829
  	release_extent_buffer(eb);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4830
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4831

1d4284bd6   Chris Mason   Merge branch 'err...
4832
  void clear_extent_buffer_dirty(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4833
  {
d1310b2e0   Chris Mason   Btrfs: Split the ...
4834
4835
4836
  	unsigned long i;
  	unsigned long num_pages;
  	struct page *page;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4837
4838
4839
  	num_pages = num_extent_pages(eb->start, eb->len);
  
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4840
  		page = eb->pages[i];
b9473439d   Chris Mason   Btrfs: leave btre...
4841
  		if (!PageDirty(page))
d2c3f4f69   Chris Mason   Btrfs: Avoid writ...
4842
  			continue;
a61e6f29d   Chris Mason   Btrfs: Use a mute...
4843
  		lock_page(page);
eb14ab8ed   Chris Mason   Btrfs: fix page->...
4844
  		WARN_ON(!PagePrivate(page));
d1310b2e0   Chris Mason   Btrfs: Split the ...
4845
  		clear_page_dirty_for_io(page);
0ee0fda06   Sven Wegener   Btrfs: Add compat...
4846
  		spin_lock_irq(&page->mapping->tree_lock);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4847
4848
4849
4850
4851
  		if (!PageDirty(page)) {
  			radix_tree_tag_clear(&page->mapping->page_tree,
  						page_index(page),
  						PAGECACHE_TAG_DIRTY);
  		}
0ee0fda06   Sven Wegener   Btrfs: Add compat...
4852
  		spin_unlock_irq(&page->mapping->tree_lock);
bf0da8c18   Chris Mason   Btrfs: ClearPageE...
4853
  		ClearPageError(page);
a61e6f29d   Chris Mason   Btrfs: Use a mute...
4854
  		unlock_page(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4855
  	}
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4856
  	WARN_ON(atomic_read(&eb->refs) == 0);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4857
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4858

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4859
  int set_extent_buffer_dirty(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4860
4861
4862
  {
  	unsigned long i;
  	unsigned long num_pages;
b9473439d   Chris Mason   Btrfs: leave btre...
4863
  	int was_dirty = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4864

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

d1310b2e0   Chris Mason   Btrfs: Split the ...
4868
  	num_pages = num_extent_pages(eb->start, eb->len);
3083ee2e1   Josef Bacik   Btrfs: introduce ...
4869
  	WARN_ON(atomic_read(&eb->refs) == 0);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4870
  	WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
b9473439d   Chris Mason   Btrfs: leave btre...
4871
  	for (i = 0; i < num_pages; i++)
fb85fc9a6   David Sterba   btrfs: kill exten...
4872
  		set_page_dirty(eb->pages[i]);
b9473439d   Chris Mason   Btrfs: leave btre...
4873
  	return was_dirty;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4874
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4875

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4876
  int clear_extent_buffer_uptodate(struct extent_buffer *eb)
1259ab75c   Chris Mason   Btrfs: Handle wri...
4877
4878
4879
4880
  {
  	unsigned long i;
  	struct page *page;
  	unsigned long num_pages;
b4ce94de9   Chris Mason   Btrfs: Change btr...
4881
  	clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4882
  	num_pages = num_extent_pages(eb->start, eb->len);
1259ab75c   Chris Mason   Btrfs: Handle wri...
4883
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4884
  		page = eb->pages[i];
33958dc6d   Chris Mason   Btrfs: Fix verify...
4885
4886
  		if (page)
  			ClearPageUptodate(page);
1259ab75c   Chris Mason   Btrfs: Handle wri...
4887
4888
4889
  	}
  	return 0;
  }
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4890
  int set_extent_buffer_uptodate(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4891
4892
4893
4894
  {
  	unsigned long i;
  	struct page *page;
  	unsigned long num_pages;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4895
  	set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4896
  	num_pages = num_extent_pages(eb->start, eb->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4897
  	for (i = 0; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4898
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
4899
4900
4901
4902
  		SetPageUptodate(page);
  	}
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4903

0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4904
  int extent_buffer_uptodate(struct extent_buffer *eb)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4905
  {
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4906
  	return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
d1310b2e0   Chris Mason   Btrfs: Split the ...
4907
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
4908
4909
  
  int read_extent_buffer_pages(struct extent_io_tree *tree,
bb82ab88d   Arne Jansen   btrfs: add an ext...
4910
  			     struct extent_buffer *eb, u64 start, int wait,
f188591e9   Chris Mason   Btrfs: Retry meta...
4911
  			     get_extent_t *get_extent, int mirror_num)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4912
4913
4914
4915
4916
4917
  {
  	unsigned long i;
  	unsigned long start_i;
  	struct page *page;
  	int err;
  	int ret = 0;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4918
4919
  	int locked_pages = 0;
  	int all_uptodate = 1;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4920
  	unsigned long num_pages;
727011e07   Chris Mason   Btrfs: allow meta...
4921
  	unsigned long num_reads = 0;
a86c12c73   Chris Mason   Btrfs: Create lar...
4922
  	struct bio *bio = NULL;
c8b978188   Chris Mason   Btrfs: Add zlib c...
4923
  	unsigned long bio_flags = 0;
a86c12c73   Chris Mason   Btrfs: Create lar...
4924

b4ce94de9   Chris Mason   Btrfs: Change btr...
4925
  	if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
d1310b2e0   Chris Mason   Btrfs: Split the ...
4926
  		return 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
  	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++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4937
  		page = eb->pages[i];
bb82ab88d   Arne Jansen   btrfs: add an ext...
4938
  		if (wait == WAIT_NONE) {
2db04966a   David Woodhouse   Btrfs: Change Tes...
4939
  			if (!trylock_page(page))
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4940
  				goto unlock_exit;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4941
4942
4943
  		} else {
  			lock_page(page);
  		}
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4944
  		locked_pages++;
727011e07   Chris Mason   Btrfs: allow meta...
4945
4946
  		if (!PageUptodate(page)) {
  			num_reads++;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4947
  			all_uptodate = 0;
727011e07   Chris Mason   Btrfs: allow meta...
4948
  		}
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4949
4950
4951
  	}
  	if (all_uptodate) {
  		if (start_i == 0)
b4ce94de9   Chris Mason   Btrfs: Change btr...
4952
  			set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4953
4954
  		goto unlock_exit;
  	}
656f30dba   Filipe Manana   Btrfs: be aware o...
4955
  	clear_bit(EXTENT_BUFFER_READ_ERR, &eb->bflags);
5cf1ab561   Josef Bacik   Btrfs: always sto...
4956
  	eb->read_mirror = 0;
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
4957
  	atomic_set(&eb->io_pages, num_reads);
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4958
  	for (i = start_i; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4959
  		page = eb->pages[i];
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4960
  		if (!PageUptodate(page)) {
f188591e9   Chris Mason   Btrfs: Retry meta...
4961
  			ClearPageError(page);
a86c12c73   Chris Mason   Btrfs: Create lar...
4962
  			err = __extent_read_full_page(tree, page,
f188591e9   Chris Mason   Btrfs: Retry meta...
4963
  						      get_extent, &bio,
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
4964
4965
  						      mirror_num, &bio_flags,
  						      READ | REQ_META);
d397712bc   Chris Mason   Btrfs: Fix checkp...
4966
  			if (err)
d1310b2e0   Chris Mason   Btrfs: Split the ...
4967
  				ret = err;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4968
4969
4970
4971
  		} else {
  			unlock_page(page);
  		}
  	}
355808c29   Jeff Mahoney   btrfs: ->submit_b...
4972
  	if (bio) {
d4c7ca86b   Josef Bacik   Btrfs: use REQ_ME...
4973
4974
  		err = submit_one_bio(READ | REQ_META, bio, mirror_num,
  				     bio_flags);
79787eaab   Jeff Mahoney   btrfs: replace ma...
4975
4976
  		if (err)
  			return err;
355808c29   Jeff Mahoney   btrfs: ->submit_b...
4977
  	}
a86c12c73   Chris Mason   Btrfs: Create lar...
4978

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

d1310b2e0   Chris Mason   Btrfs: Split the ...
4982
  	for (i = start_i; i < num_pages; i++) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4983
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
4984
  		wait_on_page_locked(page);
d397712bc   Chris Mason   Btrfs: Fix checkp...
4985
  		if (!PageUptodate(page))
d1310b2e0   Chris Mason   Btrfs: Split the ...
4986
  			ret = -EIO;
d1310b2e0   Chris Mason   Btrfs: Split the ...
4987
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
4988

d1310b2e0   Chris Mason   Btrfs: Split the ...
4989
  	return ret;
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4990
4991
4992
  
  unlock_exit:
  	i = start_i;
d397712bc   Chris Mason   Btrfs: Fix checkp...
4993
  	while (locked_pages > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
4994
  		page = eb->pages[i];
ce9adaa5a   Chris Mason   Btrfs: Do metadat...
4995
4996
4997
4998
4999
  		i++;
  		unlock_page(page);
  		locked_pages--;
  	}
  	return ret;
d1310b2e0   Chris Mason   Btrfs: Split the ...
5000
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
  
  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 ...
5013
5014
5015
  
  	WARN_ON(start > eb->len);
  	WARN_ON(start + len > eb->start + eb->len);
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5016
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5017

d397712bc   Chris Mason   Btrfs: Fix checkp...
5018
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5019
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
5020
5021
  
  		cur = min(len, (PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
5022
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5023
  		memcpy(dst, kaddr + offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5024
5025
5026
5027
5028
5029
5030
  
  		dst += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5031

550ac1d85   Gerhard Heift   btrfs: new functi...
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
  int read_extent_buffer_to_user(struct extent_buffer *eb, void __user *dstv,
  			unsigned long start,
  			unsigned long len)
  {
  	size_t cur;
  	size_t offset;
  	struct page *page;
  	char *kaddr;
  	char __user *dst = (char __user *)dstv;
  	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);
  
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
  
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5051
  		page = eb->pages[i];
550ac1d85   Gerhard Heift   btrfs: new functi...
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
  
  		cur = min(len, (PAGE_CACHE_SIZE - offset));
  		kaddr = page_address(page);
  		if (copy_to_user(dst, kaddr + offset, cur)) {
  			ret = -EFAULT;
  			break;
  		}
  
  		dst += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5068
  int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
a65917156   Chris Mason   Btrfs: stop using...
5069
  			       unsigned long min_len, char **map,
d1310b2e0   Chris Mason   Btrfs: Split the ...
5070
  			       unsigned long *map_start,
a65917156   Chris Mason   Btrfs: stop using...
5071
  			       unsigned long *map_len)
d1310b2e0   Chris Mason   Btrfs: Split the ...
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
  {
  	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...
5091

d1310b2e0   Chris Mason   Btrfs: Split the ...
5092
  	if (start + min_len > eb->len) {
31b1a2bd7   Julia Lawall   fs/btrfs: use WARN
5093
  		WARN(1, KERN_ERR "btrfs bad mapping eb start %llu len %lu, "
c1c9ff7c9   Geert Uytterhoeven   Btrfs: Remove sup...
5094
5095
5096
  		       "wanted %lu %lu
  ",
  		       eb->start, eb->len, start, min_len);
850265335   Josef Bacik   Btrfs: return err...
5097
  		return -EINVAL;
d1310b2e0   Chris Mason   Btrfs: Split the ...
5098
  	}
fb85fc9a6   David Sterba   btrfs: kill exten...
5099
  	p = eb->pages[i];
a65917156   Chris Mason   Btrfs: stop using...
5100
  	kaddr = page_address(p);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5101
5102
5103
5104
  	*map = kaddr + offset;
  	*map_len = PAGE_CACHE_SIZE - offset;
  	return 0;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5105

d1310b2e0   Chris Mason   Btrfs: Split the ...
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
  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...
5121
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5122

d397712bc   Chris Mason   Btrfs: Fix checkp...
5123
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5124
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
5125
5126
  
  		cur = min(len, (PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
5127
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5128
  		ret = memcmp(ptr, kaddr + offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
  		if (ret)
  			break;
  
  		ptr += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  	return ret;
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
  
  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...
5153
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5154

d397712bc   Chris Mason   Btrfs: Fix checkp...
5155
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5156
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
5157
5158
5159
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, PAGE_CACHE_SIZE - offset);
a65917156   Chris Mason   Btrfs: stop using...
5160
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5161
  		memcpy(kaddr + offset, src, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5162
5163
5164
5165
5166
5167
5168
  
  		src += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
  
  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...
5182
  	offset = (start_offset + start) & (PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5183

d397712bc   Chris Mason   Btrfs: Fix checkp...
5184
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5185
  		page = eb->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
5186
5187
5188
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, PAGE_CACHE_SIZE - offset);
a65917156   Chris Mason   Btrfs: stop using...
5189
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5190
  		memset(kaddr + offset, c, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5191
5192
5193
5194
5195
5196
  
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
  
  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...
5213
  		(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5214

d397712bc   Chris Mason   Btrfs: Fix checkp...
5215
  	while (len > 0) {
fb85fc9a6   David Sterba   btrfs: kill exten...
5216
  		page = dst->pages[i];
d1310b2e0   Chris Mason   Btrfs: Split the ...
5217
5218
5219
  		WARN_ON(!PageUptodate(page));
  
  		cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset));
a65917156   Chris Mason   Btrfs: stop using...
5220
  		kaddr = page_address(page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5221
  		read_extent_buffer(src, kaddr + offset, src_offset, cur);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5222
5223
5224
5225
5226
5227
5228
  
  		src_offset += cur;
  		len -= cur;
  		offset = 0;
  		i++;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5229

3387206f2   Sergei Trofimovich   btrfs: properly h...
5230
5231
5232
5233
5234
  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 ...
5235
5236
5237
5238
  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...
5239
  	char *dst_kaddr = page_address(dst_page);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5240
  	char *src_kaddr;
727011e07   Chris Mason   Btrfs: allow meta...
5241
  	int must_memmove = 0;
d1310b2e0   Chris Mason   Btrfs: Split the ...
5242

3387206f2   Sergei Trofimovich   btrfs: properly h...
5243
  	if (dst_page != src_page) {
a65917156   Chris Mason   Btrfs: stop using...
5244
  		src_kaddr = page_address(src_page);
3387206f2   Sergei Trofimovich   btrfs: properly h...
5245
  	} else {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5246
  		src_kaddr = dst_kaddr;
727011e07   Chris Mason   Btrfs: allow meta...
5247
5248
  		if (areas_overlap(src_off, dst_off, len))
  			must_memmove = 1;
3387206f2   Sergei Trofimovich   btrfs: properly h...
5249
  	}
d1310b2e0   Chris Mason   Btrfs: Split the ...
5250

727011e07   Chris Mason   Btrfs: allow meta...
5251
5252
5253
5254
  	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 ...
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
  }
  
  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) {
efe120a06   Frank Holton   Btrfs: convert pr...
5268
  		printk(KERN_ERR "BTRFS: memmove bogus src_offset %lu move "
d397712bc   Chris Mason   Btrfs: Fix checkp...
5269
5270
  		       "len %lu dst len %lu
  ", src_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5271
5272
5273
  		BUG_ON(1);
  	}
  	if (dst_offset + len > dst->len) {
efe120a06   Frank Holton   Btrfs: convert pr...
5274
  		printk(KERN_ERR "BTRFS: memmove bogus dst_offset %lu move "
d397712bc   Chris Mason   Btrfs: Fix checkp...
5275
5276
  		       "len %lu dst len %lu
  ", dst_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5277
5278
  		BUG_ON(1);
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
5279
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5280
  		dst_off_in_page = (start_offset + dst_offset) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5281
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5282
  		src_off_in_page = (start_offset + src_offset) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5283
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5284
5285
5286
5287
5288
5289
5290
5291
  
  		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));
fb85fc9a6   David Sterba   btrfs: kill exten...
5292
  		copy_pages(dst->pages[dst_i], dst->pages[src_i],
d1310b2e0   Chris Mason   Btrfs: Split the ...
5293
5294
5295
5296
5297
5298
5299
  			   dst_off_in_page, src_off_in_page, cur);
  
  		src_offset += cur;
  		dst_offset += cur;
  		len -= cur;
  	}
  }
d1310b2e0   Chris Mason   Btrfs: Split the ...
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
  
  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) {
efe120a06   Frank Holton   Btrfs: convert pr...
5314
  		printk(KERN_ERR "BTRFS: memmove bogus src_offset %lu move "
d397712bc   Chris Mason   Btrfs: Fix checkp...
5315
5316
  		       "len %lu len %lu
  ", src_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5317
5318
5319
  		BUG_ON(1);
  	}
  	if (dst_offset + len > dst->len) {
efe120a06   Frank Holton   Btrfs: convert pr...
5320
  		printk(KERN_ERR "BTRFS: memmove bogus dst_offset %lu move "
d397712bc   Chris Mason   Btrfs: Fix checkp...
5321
5322
  		       "len %lu len %lu
  ", dst_offset, len, dst->len);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5323
5324
  		BUG_ON(1);
  	}
727011e07   Chris Mason   Btrfs: allow meta...
5325
  	if (dst_offset < src_offset) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5326
5327
5328
  		memcpy_extent_buffer(dst, dst_offset, src_offset, len);
  		return;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
5329
  	while (len > 0) {
d1310b2e0   Chris Mason   Btrfs: Split the ...
5330
5331
5332
5333
  		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...
5334
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5335
  		src_off_in_page = (start_offset + src_end) &
778746b53   Geert Uytterhoeven   Btrfs: PAGE_CACHE...
5336
  			(PAGE_CACHE_SIZE - 1);
d1310b2e0   Chris Mason   Btrfs: Split the ...
5337
5338
5339
  
  		cur = min_t(unsigned long, len, src_off_in_page + 1);
  		cur = min(cur, dst_off_in_page + 1);
fb85fc9a6   David Sterba   btrfs: kill exten...
5340
  		copy_pages(dst->pages[dst_i], dst->pages[src_i],
d1310b2e0   Chris Mason   Btrfs: Split the ...
5341
5342
5343
5344
5345
5346
5347
5348
  			   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...
5349

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

3083ee2e1   Josef Bacik   Btrfs: introduce ...
5354
5355
5356
5357
5358
5359
5360
  	/*
  	 * 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->...
5361
  		return 1;
45f49bce9   Chris Mason   Btrfs: avoid NULL...
5362
  	}
6af118ce5   Chris Mason   Btrfs: Index exte...
5363

3083ee2e1   Josef Bacik   Btrfs: introduce ...
5364
5365
  	eb = (struct extent_buffer *)page->private;
  	BUG_ON(!eb);
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5366
5367
  
  	/*
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5368
5369
5370
  	 * 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...
5371
  	 */
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5372
  	spin_lock(&eb->refs_lock);
0b32f4bbb   Josef Bacik   Btrfs: ensure an ...
5373
  	if (atomic_read(&eb->refs) != 1 || extent_buffer_under_io(eb)) {
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5374
5375
5376
  		spin_unlock(&eb->refs_lock);
  		spin_unlock(&page->mapping->private_lock);
  		return 0;
b9473439d   Chris Mason   Btrfs: leave btre...
5377
  	}
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5378
  	spin_unlock(&page->mapping->private_lock);
897ca6e9b   Miao Xie   Btrfs: restructur...
5379

19fe0a8b7   Miao Xie   Btrfs: Switch the...
5380
  	/*
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5381
5382
  	 * 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...
5383
  	 */
3083ee2e1   Josef Bacik   Btrfs: introduce ...
5384
5385
5386
  	if (!test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags)) {
  		spin_unlock(&eb->refs_lock);
  		return 0;
b9473439d   Chris Mason   Btrfs: leave btre...
5387
  	}
19fe0a8b7   Miao Xie   Btrfs: Switch the...
5388

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