Blame view

fs/btrfs/relocation.c 103 KB
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   * Copyright (C) 2009 Oracle.  All rights reserved.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public
   * License v2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public
   * License along with this program; if not, write to the
   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   * Boston, MA 021110-1307, USA.
   */
  
  #include <linux/sched.h>
  #include <linux/pagemap.h>
  #include <linux/writeback.h>
  #include <linux/blkdev.h>
  #include <linux/rbtree.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
24
  #include <linux/slab.h>
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
25
26
27
28
29
30
31
  #include "ctree.h"
  #include "disk-io.h"
  #include "transaction.h"
  #include "volumes.h"
  #include "locking.h"
  #include "btrfs_inode.h"
  #include "async-thread.h"
0af3d00ba   Josef Bacik   Btrfs: create spe...
32
  #include "free-space-cache.h"
581bb0509   Li Zefan   Btrfs: Cache free...
33
  #include "inode-map.h"
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  
  /*
   * backref_node, mapping_node and tree_block start with this
   */
  struct tree_entry {
  	struct rb_node rb_node;
  	u64 bytenr;
  };
  
  /*
   * present a tree block in the backref cache
   */
  struct backref_node {
  	struct rb_node rb_node;
  	u64 bytenr;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
49
50
51
  
  	u64 new_bytenr;
  	/* objectid of tree block owner, can be not uptodate */
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
52
  	u64 owner;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
53
54
  	/* link to pending, changed or detached list */
  	struct list_head list;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
55
56
57
58
59
60
61
62
63
64
  	/* list of upper level blocks reference this block */
  	struct list_head upper;
  	/* list of child blocks in the cache */
  	struct list_head lower;
  	/* NULL if this node is not tree root */
  	struct btrfs_root *root;
  	/* extent buffer got by COW the block */
  	struct extent_buffer *eb;
  	/* level of tree block */
  	unsigned int level:8;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
65
66
67
  	/* is the block in non-reference counted tree */
  	unsigned int cowonly:1;
  	/* 1 if no child node in the cache */
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
68
69
70
71
72
73
74
  	unsigned int lowest:1;
  	/* is the extent buffer locked */
  	unsigned int locked:1;
  	/* has the block been processed */
  	unsigned int processed:1;
  	/* have backrefs of this block been checked */
  	unsigned int checked:1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
75
76
77
78
79
80
81
82
83
84
  	/*
  	 * 1 if corresponding block has been cowed but some upper
  	 * level block pointers may not point to the new location
  	 */
  	unsigned int pending:1;
  	/*
  	 * 1 if the backref node isn't connected to any other
  	 * backref node.
  	 */
  	unsigned int detached:1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
85
86
87
88
89
90
91
92
  };
  
  /*
   * present a block pointer in the backref cache
   */
  struct backref_edge {
  	struct list_head list[2];
  	struct backref_node *node[2];
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
93
94
95
96
97
98
99
100
  };
  
  #define LOWER	0
  #define UPPER	1
  
  struct backref_cache {
  	/* red black tree of all backref nodes in the cache */
  	struct rb_root rb_root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
101
102
103
104
105
106
107
  	/* for passing backref nodes to btrfs_reloc_cow_block */
  	struct backref_node *path[BTRFS_MAX_LEVEL];
  	/*
  	 * list of blocks that have been cowed but some block
  	 * pointers in upper level blocks may not reflect the
  	 * new location
  	 */
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
108
  	struct list_head pending[BTRFS_MAX_LEVEL];
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
109
110
111
112
113
114
115
116
117
118
119
  	/* list of backref nodes with no child node */
  	struct list_head leaves;
  	/* list of blocks that have been cowed in current transaction */
  	struct list_head changed;
  	/* list of detached backref node. */
  	struct list_head detached;
  
  	u64 last_trans;
  
  	int nr_nodes;
  	int nr_edges;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  };
  
  /*
   * map address of tree root to tree
   */
  struct mapping_node {
  	struct rb_node rb_node;
  	u64 bytenr;
  	void *data;
  };
  
  struct mapping_tree {
  	struct rb_root rb_root;
  	spinlock_t lock;
  };
  
  /*
   * present a tree block to process
   */
  struct tree_block {
  	struct rb_node rb_node;
  	u64 bytenr;
  	struct btrfs_key key;
  	unsigned int level:8;
  	unsigned int key_ready:1;
  };
0257bb82d   Yan, Zheng   Btrfs: relocate f...
146
147
148
149
150
151
152
153
  #define MAX_EXTENTS 128
  
  struct file_extent_cluster {
  	u64 start;
  	u64 end;
  	u64 boundary[MAX_EXTENTS];
  	unsigned int nr;
  };
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
154
155
156
157
158
159
160
  struct reloc_control {
  	/* block group to relocate */
  	struct btrfs_block_group_cache *block_group;
  	/* extent tree */
  	struct btrfs_root *extent_root;
  	/* inode for moving data */
  	struct inode *data_inode;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
161
162
163
164
165
166
  
  	struct btrfs_block_rsv *block_rsv;
  
  	struct backref_cache backref_cache;
  
  	struct file_extent_cluster cluster;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
167
168
169
170
171
172
  	/* tree blocks have been processed */
  	struct extent_io_tree processed_blocks;
  	/* map start of tree root to corresponding reloc tree */
  	struct mapping_tree reloc_root_tree;
  	/* list of reloc trees */
  	struct list_head reloc_roots;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
173
174
175
176
  	/* size of metadata reservation for merging reloc trees */
  	u64 merging_rsv_size;
  	/* size of relocated tree nodes */
  	u64 nodes_relocated;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
177
178
  	u64 search_start;
  	u64 extents_found;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
179

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
180
181
182
  	unsigned int stage:8;
  	unsigned int create_reloc_tree:1;
  	unsigned int merge_reloc_tree:1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
183
  	unsigned int found_file_extent:1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
184
  	unsigned int commit_transaction:1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
185
186
187
188
189
  };
  
  /* stages of data relocation */
  #define MOVE_DATA_EXTENTS	0
  #define UPDATE_DATA_PTRS	1
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
190
191
192
193
  static void remove_backref_node(struct backref_cache *cache,
  				struct backref_node *node);
  static void __mark_block_processed(struct reloc_control *rc,
  				   struct backref_node *node);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
194
195
196
  
  static void mapping_tree_init(struct mapping_tree *tree)
  {
6bef4d317   Eric Paris   Btrfs: use RB_ROO...
197
  	tree->rb_root = RB_ROOT;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
198
199
200
201
202
203
  	spin_lock_init(&tree->lock);
  }
  
  static void backref_cache_init(struct backref_cache *cache)
  {
  	int i;
6bef4d317   Eric Paris   Btrfs: use RB_ROO...
204
  	cache->rb_root = RB_ROOT;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
205
206
  	for (i = 0; i < BTRFS_MAX_LEVEL; i++)
  		INIT_LIST_HEAD(&cache->pending[i]);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  	INIT_LIST_HEAD(&cache->changed);
  	INIT_LIST_HEAD(&cache->detached);
  	INIT_LIST_HEAD(&cache->leaves);
  }
  
  static void backref_cache_cleanup(struct backref_cache *cache)
  {
  	struct backref_node *node;
  	int i;
  
  	while (!list_empty(&cache->detached)) {
  		node = list_entry(cache->detached.next,
  				  struct backref_node, list);
  		remove_backref_node(cache, node);
  	}
  
  	while (!list_empty(&cache->leaves)) {
  		node = list_entry(cache->leaves.next,
  				  struct backref_node, lower);
  		remove_backref_node(cache, node);
  	}
  
  	cache->last_trans = 0;
  
  	for (i = 0; i < BTRFS_MAX_LEVEL; i++)
  		BUG_ON(!list_empty(&cache->pending[i]));
  	BUG_ON(!list_empty(&cache->changed));
  	BUG_ON(!list_empty(&cache->detached));
  	BUG_ON(!RB_EMPTY_ROOT(&cache->rb_root));
  	BUG_ON(cache->nr_nodes);
  	BUG_ON(cache->nr_edges);
  }
  
  static struct backref_node *alloc_backref_node(struct backref_cache *cache)
  {
  	struct backref_node *node;
  
  	node = kzalloc(sizeof(*node), GFP_NOFS);
  	if (node) {
  		INIT_LIST_HEAD(&node->list);
  		INIT_LIST_HEAD(&node->upper);
  		INIT_LIST_HEAD(&node->lower);
  		RB_CLEAR_NODE(&node->rb_node);
  		cache->nr_nodes++;
  	}
  	return node;
  }
  
  static void free_backref_node(struct backref_cache *cache,
  			      struct backref_node *node)
  {
  	if (node) {
  		cache->nr_nodes--;
  		kfree(node);
  	}
  }
  
  static struct backref_edge *alloc_backref_edge(struct backref_cache *cache)
  {
  	struct backref_edge *edge;
  
  	edge = kzalloc(sizeof(*edge), GFP_NOFS);
  	if (edge)
  		cache->nr_edges++;
  	return edge;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
272
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
273
274
  static void free_backref_edge(struct backref_cache *cache,
  			      struct backref_edge *edge)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
275
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
276
277
278
279
  	if (edge) {
  		cache->nr_edges--;
  		kfree(edge);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  }
  
  static struct rb_node *tree_insert(struct rb_root *root, u64 bytenr,
  				   struct rb_node *node)
  {
  	struct rb_node **p = &root->rb_node;
  	struct rb_node *parent = NULL;
  	struct tree_entry *entry;
  
  	while (*p) {
  		parent = *p;
  		entry = rb_entry(parent, struct tree_entry, rb_node);
  
  		if (bytenr < entry->bytenr)
  			p = &(*p)->rb_left;
  		else if (bytenr > entry->bytenr)
  			p = &(*p)->rb_right;
  		else
  			return parent;
  	}
  
  	rb_link_node(node, parent, p);
  	rb_insert_color(node, root);
  	return NULL;
  }
  
  static struct rb_node *tree_search(struct rb_root *root, u64 bytenr)
  {
  	struct rb_node *n = root->rb_node;
  	struct tree_entry *entry;
  
  	while (n) {
  		entry = rb_entry(n, struct tree_entry, rb_node);
  
  		if (bytenr < entry->bytenr)
  			n = n->rb_left;
  		else if (bytenr > entry->bytenr)
  			n = n->rb_right;
  		else
  			return n;
  	}
  	return NULL;
  }
  
  /*
   * walk up backref nodes until reach node presents tree root
   */
  static struct backref_node *walk_up_backref(struct backref_node *node,
  					    struct backref_edge *edges[],
  					    int *index)
  {
  	struct backref_edge *edge;
  	int idx = *index;
  
  	while (!list_empty(&node->upper)) {
  		edge = list_entry(node->upper.next,
  				  struct backref_edge, list[LOWER]);
  		edges[idx++] = edge;
  		node = edge->node[UPPER];
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
340
  	BUG_ON(node->detached);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  	*index = idx;
  	return node;
  }
  
  /*
   * walk down backref nodes to find start of next reference path
   */
  static struct backref_node *walk_down_backref(struct backref_edge *edges[],
  					      int *index)
  {
  	struct backref_edge *edge;
  	struct backref_node *lower;
  	int idx = *index;
  
  	while (idx > 0) {
  		edge = edges[idx - 1];
  		lower = edge->node[LOWER];
  		if (list_is_last(&edge->list[LOWER], &lower->upper)) {
  			idx--;
  			continue;
  		}
  		edge = list_entry(edge->list[LOWER].next,
  				  struct backref_edge, list[LOWER]);
  		edges[idx - 1] = edge;
  		*index = idx;
  		return edge->node[UPPER];
  	}
  	*index = 0;
  	return NULL;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
371
372
373
374
375
376
377
  static void unlock_node_buffer(struct backref_node *node)
  {
  	if (node->locked) {
  		btrfs_tree_unlock(node->eb);
  		node->locked = 0;
  	}
  }
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
378
379
380
  static void drop_node_buffer(struct backref_node *node)
  {
  	if (node->eb) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
381
  		unlock_node_buffer(node);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
382
383
384
385
386
387
388
389
  		free_extent_buffer(node->eb);
  		node->eb = NULL;
  	}
  }
  
  static void drop_backref_node(struct backref_cache *tree,
  			      struct backref_node *node)
  {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
390
391
392
  	BUG_ON(!list_empty(&node->upper));
  
  	drop_node_buffer(node);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
393
  	list_del(&node->list);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
394
  	list_del(&node->lower);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
395
396
397
  	if (!RB_EMPTY_NODE(&node->rb_node))
  		rb_erase(&node->rb_node, &tree->rb_root);
  	free_backref_node(tree, node);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
398
399
400
401
402
403
404
405
406
407
408
409
410
  }
  
  /*
   * remove a backref node from the backref cache
   */
  static void remove_backref_node(struct backref_cache *cache,
  				struct backref_node *node)
  {
  	struct backref_node *upper;
  	struct backref_edge *edge;
  
  	if (!node)
  		return;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
411
  	BUG_ON(!node->lowest && !node->detached);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
412
413
414
415
416
417
  	while (!list_empty(&node->upper)) {
  		edge = list_entry(node->upper.next, struct backref_edge,
  				  list[LOWER]);
  		upper = edge->node[UPPER];
  		list_del(&edge->list[LOWER]);
  		list_del(&edge->list[UPPER]);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
418
419
420
421
422
423
424
425
426
  		free_backref_edge(cache, edge);
  
  		if (RB_EMPTY_NODE(&upper->rb_node)) {
  			BUG_ON(!list_empty(&node->upper));
  			drop_backref_node(cache, node);
  			node = upper;
  			node->lowest = 1;
  			continue;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
427
  		/*
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
428
  		 * add the node to leaf node list if no other
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
429
430
431
  		 * child block cached.
  		 */
  		if (list_empty(&upper->lower)) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
432
  			list_add_tail(&upper->lower, &cache->leaves);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
433
434
435
  			upper->lowest = 1;
  		}
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
436

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
437
438
  	drop_backref_node(cache, node);
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
  static void update_backref_node(struct backref_cache *cache,
  				struct backref_node *node, u64 bytenr)
  {
  	struct rb_node *rb_node;
  	rb_erase(&node->rb_node, &cache->rb_root);
  	node->bytenr = bytenr;
  	rb_node = tree_insert(&cache->rb_root, node->bytenr, &node->rb_node);
  	BUG_ON(rb_node);
  }
  
  /*
   * update backref cache after a transaction commit
   */
  static int update_backref_cache(struct btrfs_trans_handle *trans,
  				struct backref_cache *cache)
  {
  	struct backref_node *node;
  	int level = 0;
  
  	if (cache->last_trans == 0) {
  		cache->last_trans = trans->transid;
  		return 0;
  	}
  
  	if (cache->last_trans == trans->transid)
  		return 0;
  
  	/*
  	 * detached nodes are used to avoid unnecessary backref
  	 * lookup. transaction commit changes the extent tree.
  	 * so the detached nodes are no longer useful.
  	 */
  	while (!list_empty(&cache->detached)) {
  		node = list_entry(cache->detached.next,
  				  struct backref_node, list);
  		remove_backref_node(cache, node);
  	}
  
  	while (!list_empty(&cache->changed)) {
  		node = list_entry(cache->changed.next,
  				  struct backref_node, list);
  		list_del_init(&node->list);
  		BUG_ON(node->pending);
  		update_backref_node(cache, node, node->new_bytenr);
  	}
  
  	/*
  	 * some nodes can be left in the pending list if there were
  	 * errors during processing the pending nodes.
  	 */
  	for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
  		list_for_each_entry(node, &cache->pending[level], list) {
  			BUG_ON(!node->pending);
  			if (node->bytenr == node->new_bytenr)
  				continue;
  			update_backref_node(cache, node, node->new_bytenr);
  		}
  	}
  
  	cache->last_trans = 0;
  	return 1;
  }
f2a97a9db   David Sterba   btrfs: remove all...
501

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  static int should_ignore_root(struct btrfs_root *root)
  {
  	struct btrfs_root *reloc_root;
  
  	if (!root->ref_cows)
  		return 0;
  
  	reloc_root = root->reloc_root;
  	if (!reloc_root)
  		return 0;
  
  	if (btrfs_root_last_snapshot(&reloc_root->root_item) ==
  	    root->fs_info->running_transaction->transid - 1)
  		return 0;
  	/*
  	 * if there is reloc tree and it was created in previous
  	 * transaction backref lookup can find the reloc tree,
  	 * so backref node for the fs tree root is useless for
  	 * relocation.
  	 */
  	return 1;
  }
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
  /*
   * find reloc tree by address of tree root
   */
  static struct btrfs_root *find_reloc_root(struct reloc_control *rc,
  					  u64 bytenr)
  {
  	struct rb_node *rb_node;
  	struct mapping_node *node;
  	struct btrfs_root *root = NULL;
  
  	spin_lock(&rc->reloc_root_tree.lock);
  	rb_node = tree_search(&rc->reloc_root_tree.rb_root, bytenr);
  	if (rb_node) {
  		node = rb_entry(rb_node, struct mapping_node, rb_node);
  		root = (struct btrfs_root *)node->data;
  	}
  	spin_unlock(&rc->reloc_root_tree.lock);
  	return root;
  }
  
  static int is_cowonly_root(u64 root_objectid)
  {
  	if (root_objectid == BTRFS_ROOT_TREE_OBJECTID ||
  	    root_objectid == BTRFS_EXTENT_TREE_OBJECTID ||
  	    root_objectid == BTRFS_CHUNK_TREE_OBJECTID ||
  	    root_objectid == BTRFS_DEV_TREE_OBJECTID ||
  	    root_objectid == BTRFS_TREE_LOG_OBJECTID ||
  	    root_objectid == BTRFS_CSUM_TREE_OBJECTID)
  		return 1;
  	return 0;
  }
  
  static struct btrfs_root *read_fs_root(struct btrfs_fs_info *fs_info,
  					u64 root_objectid)
  {
  	struct btrfs_key key;
  
  	key.objectid = root_objectid;
  	key.type = BTRFS_ROOT_ITEM_KEY;
  	if (is_cowonly_root(root_objectid))
  		key.offset = 0;
  	else
  		key.offset = (u64)-1;
  
  	return btrfs_read_fs_root_no_name(fs_info, &key);
  }
  
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  static noinline_for_stack
  struct btrfs_root *find_tree_root(struct reloc_control *rc,
  				  struct extent_buffer *leaf,
  				  struct btrfs_extent_ref_v0 *ref0)
  {
  	struct btrfs_root *root;
  	u64 root_objectid = btrfs_ref_root_v0(leaf, ref0);
  	u64 generation = btrfs_ref_generation_v0(leaf, ref0);
  
  	BUG_ON(root_objectid == BTRFS_TREE_RELOC_OBJECTID);
  
  	root = read_fs_root(rc->extent_root->fs_info, root_objectid);
  	BUG_ON(IS_ERR(root));
  
  	if (root->ref_cows &&
  	    generation != btrfs_root_generation(&root->root_item))
  		return NULL;
  
  	return root;
  }
  #endif
  
  static noinline_for_stack
  int find_inline_backref(struct extent_buffer *leaf, int slot,
  			unsigned long *ptr, unsigned long *end)
  {
  	struct btrfs_extent_item *ei;
  	struct btrfs_tree_block_info *bi;
  	u32 item_size;
  
  	item_size = btrfs_item_size_nr(leaf, slot);
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  	if (item_size < sizeof(*ei)) {
  		WARN_ON(item_size != sizeof(struct btrfs_extent_item_v0));
  		return 1;
  	}
  #endif
  	ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
  	WARN_ON(!(btrfs_extent_flags(leaf, ei) &
  		  BTRFS_EXTENT_FLAG_TREE_BLOCK));
  
  	if (item_size <= sizeof(*ei) + sizeof(*bi)) {
  		WARN_ON(item_size < sizeof(*ei) + sizeof(*bi));
  		return 1;
  	}
  
  	bi = (struct btrfs_tree_block_info *)(ei + 1);
  	*ptr = (unsigned long)(bi + 1);
  	*end = (unsigned long)ei + item_size;
  	return 0;
  }
  
  /*
   * build backref tree for a given tree block. root of the backref tree
   * corresponds the tree block, leaves of the backref tree correspond
   * roots of b-trees that reference the tree block.
   *
   * the basic idea of this function is check backrefs of a given block
   * to find upper level blocks that refernece the block, and then check
   * bakcrefs of these upper level blocks recursively. the recursion stop
   * when tree root is reached or backrefs for the block is cached.
   *
   * NOTE: if we find backrefs for a block are cached, we know backrefs
   * for all upper level blocks that directly/indirectly reference the
   * block are also cached.
   */
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
638
639
640
641
  static noinline_for_stack
  struct backref_node *build_backref_tree(struct reloc_control *rc,
  					struct btrfs_key *node_key,
  					int level, u64 bytenr)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
642
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
643
  	struct backref_cache *cache = &rc->backref_cache;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
  	struct btrfs_path *path1;
  	struct btrfs_path *path2;
  	struct extent_buffer *eb;
  	struct btrfs_root *root;
  	struct backref_node *cur;
  	struct backref_node *upper;
  	struct backref_node *lower;
  	struct backref_node *node = NULL;
  	struct backref_node *exist = NULL;
  	struct backref_edge *edge;
  	struct rb_node *rb_node;
  	struct btrfs_key key;
  	unsigned long end;
  	unsigned long ptr;
  	LIST_HEAD(list);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
659
660
  	LIST_HEAD(useless);
  	int cowonly;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
661
662
663
664
665
666
667
668
669
  	int ret;
  	int err = 0;
  
  	path1 = btrfs_alloc_path();
  	path2 = btrfs_alloc_path();
  	if (!path1 || !path2) {
  		err = -ENOMEM;
  		goto out;
  	}
026fd3178   Josef Bacik   Btrfs: don't alwa...
670
671
  	path1->reada = 1;
  	path2->reada = 2;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
672

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
673
  	node = alloc_backref_node(cache);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
674
675
676
677
  	if (!node) {
  		err = -ENOMEM;
  		goto out;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
678
  	node->bytenr = bytenr;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
  	node->level = level;
  	node->lowest = 1;
  	cur = node;
  again:
  	end = 0;
  	ptr = 0;
  	key.objectid = cur->bytenr;
  	key.type = BTRFS_EXTENT_ITEM_KEY;
  	key.offset = (u64)-1;
  
  	path1->search_commit_root = 1;
  	path1->skip_locking = 1;
  	ret = btrfs_search_slot(NULL, rc->extent_root, &key, path1,
  				0, 0);
  	if (ret < 0) {
  		err = ret;
  		goto out;
  	}
  	BUG_ON(!ret || !path1->slots[0]);
  
  	path1->slots[0]--;
  
  	WARN_ON(cur->checked);
  	if (!list_empty(&cur->upper)) {
  		/*
70f23fd66   Justin P. Mattock   treewide: fix a f...
704
  		 * the backref was added previously when processing
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
  		 * backref of type BTRFS_TREE_BLOCK_REF_KEY
  		 */
  		BUG_ON(!list_is_singular(&cur->upper));
  		edge = list_entry(cur->upper.next, struct backref_edge,
  				  list[LOWER]);
  		BUG_ON(!list_empty(&edge->list[UPPER]));
  		exist = edge->node[UPPER];
  		/*
  		 * add the upper level block to pending list if we need
  		 * check its backrefs
  		 */
  		if (!exist->checked)
  			list_add_tail(&edge->list[UPPER], &list);
  	} else {
  		exist = NULL;
  	}
  
  	while (1) {
  		cond_resched();
  		eb = path1->nodes[0];
  
  		if (ptr >= end) {
  			if (path1->slots[0] >= btrfs_header_nritems(eb)) {
  				ret = btrfs_next_leaf(rc->extent_root, path1);
  				if (ret < 0) {
  					err = ret;
  					goto out;
  				}
  				if (ret > 0)
  					break;
  				eb = path1->nodes[0];
  			}
  
  			btrfs_item_key_to_cpu(eb, &key, path1->slots[0]);
  			if (key.objectid != cur->bytenr) {
  				WARN_ON(exist);
  				break;
  			}
  
  			if (key.type == BTRFS_EXTENT_ITEM_KEY) {
  				ret = find_inline_backref(eb, path1->slots[0],
  							  &ptr, &end);
  				if (ret)
  					goto next;
  			}
  		}
  
  		if (ptr < end) {
  			/* update key for inline back ref */
  			struct btrfs_extent_inline_ref *iref;
  			iref = (struct btrfs_extent_inline_ref *)ptr;
  			key.type = btrfs_extent_inline_ref_type(eb, iref);
  			key.offset = btrfs_extent_inline_ref_offset(eb, iref);
  			WARN_ON(key.type != BTRFS_TREE_BLOCK_REF_KEY &&
  				key.type != BTRFS_SHARED_BLOCK_REF_KEY);
  		}
  
  		if (exist &&
  		    ((key.type == BTRFS_TREE_BLOCK_REF_KEY &&
  		      exist->owner == key.offset) ||
  		     (key.type == BTRFS_SHARED_BLOCK_REF_KEY &&
  		      exist->bytenr == key.offset))) {
  			exist = NULL;
  			goto next;
  		}
  
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  		if (key.type == BTRFS_SHARED_BLOCK_REF_KEY ||
  		    key.type == BTRFS_EXTENT_REF_V0_KEY) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
774
  			if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
775
776
777
  				struct btrfs_extent_ref_v0 *ref0;
  				ref0 = btrfs_item_ptr(eb, path1->slots[0],
  						struct btrfs_extent_ref_v0);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
778
  				if (key.objectid == key.offset) {
046f264f6   Yan, Zheng   Btrfs: Fix null d...
779
  					root = find_tree_root(rc, eb, ref0);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
780
781
782
783
784
785
  					if (root && !should_ignore_root(root))
  						cur->root = root;
  					else
  						list_add(&cur->list, &useless);
  					break;
  				}
046f264f6   Yan, Zheng   Btrfs: Fix null d...
786
787
788
  				if (is_cowonly_root(btrfs_ref_root_v0(eb,
  								      ref0)))
  					cur->cowonly = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
  			}
  #else
  		BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
  		if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
  #endif
  			if (key.objectid == key.offset) {
  				/*
  				 * only root blocks of reloc trees use
  				 * backref of this type.
  				 */
  				root = find_reloc_root(rc, cur->bytenr);
  				BUG_ON(!root);
  				cur->root = root;
  				break;
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
804
  			edge = alloc_backref_edge(cache);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
805
806
807
808
809
810
  			if (!edge) {
  				err = -ENOMEM;
  				goto out;
  			}
  			rb_node = tree_search(&cache->rb_root, key.offset);
  			if (!rb_node) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
811
  				upper = alloc_backref_node(cache);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
812
  				if (!upper) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
813
  					free_backref_edge(cache, edge);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
814
815
816
  					err = -ENOMEM;
  					goto out;
  				}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
817
  				upper->bytenr = key.offset;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
818
819
820
821
822
823
824
825
826
  				upper->level = cur->level + 1;
  				/*
  				 *  backrefs for the upper level block isn't
  				 *  cached, add the block to pending list
  				 */
  				list_add_tail(&edge->list[UPPER], &list);
  			} else {
  				upper = rb_entry(rb_node, struct backref_node,
  						 rb_node);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
827
  				BUG_ON(!upper->checked);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
828
829
  				INIT_LIST_HEAD(&edge->list[UPPER]);
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
830
  			list_add_tail(&edge->list[LOWER], &cur->upper);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
831
  			edge->node[LOWER] = cur;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
832
  			edge->node[UPPER] = upper;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
833
834
835
836
837
838
839
840
841
842
843
844
  
  			goto next;
  		} else if (key.type != BTRFS_TREE_BLOCK_REF_KEY) {
  			goto next;
  		}
  
  		/* key.type == BTRFS_TREE_BLOCK_REF_KEY */
  		root = read_fs_root(rc->extent_root->fs_info, key.offset);
  		if (IS_ERR(root)) {
  			err = PTR_ERR(root);
  			goto out;
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
845
846
  		if (!root->ref_cows)
  			cur->cowonly = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
847
848
849
850
  		if (btrfs_root_level(&root->root_item) == cur->level) {
  			/* tree root */
  			BUG_ON(btrfs_root_bytenr(&root->root_item) !=
  			       cur->bytenr);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
851
852
853
854
  			if (should_ignore_root(root))
  				list_add(&cur->list, &useless);
  			else
  				cur->root = root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
  			break;
  		}
  
  		level = cur->level + 1;
  
  		/*
  		 * searching the tree to find upper level blocks
  		 * reference the block.
  		 */
  		path2->search_commit_root = 1;
  		path2->skip_locking = 1;
  		path2->lowest_level = level;
  		ret = btrfs_search_slot(NULL, root, node_key, path2, 0, 0);
  		path2->lowest_level = 0;
  		if (ret < 0) {
  			err = ret;
  			goto out;
  		}
33c66f430   Yan Zheng   Btrfs: fix lockin...
873
874
  		if (ret > 0 && path2->slots[level] > 0)
  			path2->slots[level]--;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
875
876
877
878
879
880
881
882
883
884
  
  		eb = path2->nodes[level];
  		WARN_ON(btrfs_node_blockptr(eb, path2->slots[level]) !=
  			cur->bytenr);
  
  		lower = cur;
  		for (; level < BTRFS_MAX_LEVEL; level++) {
  			if (!path2->nodes[level]) {
  				BUG_ON(btrfs_root_bytenr(&root->root_item) !=
  				       lower->bytenr);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
885
886
887
888
  				if (should_ignore_root(root))
  					list_add(&lower->list, &useless);
  				else
  					lower->root = root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
889
890
  				break;
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
891
  			edge = alloc_backref_edge(cache);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
892
893
894
895
896
897
898
899
  			if (!edge) {
  				err = -ENOMEM;
  				goto out;
  			}
  
  			eb = path2->nodes[level];
  			rb_node = tree_search(&cache->rb_root, eb->start);
  			if (!rb_node) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
900
  				upper = alloc_backref_node(cache);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
901
  				if (!upper) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
902
  					free_backref_edge(cache, edge);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
903
904
905
  					err = -ENOMEM;
  					goto out;
  				}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
906
907
908
  				upper->bytenr = eb->start;
  				upper->owner = btrfs_header_owner(eb);
  				upper->level = lower->level + 1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
909
910
  				if (!root->ref_cows)
  					upper->cowonly = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
  
  				/*
  				 * if we know the block isn't shared
  				 * we can void checking its backrefs.
  				 */
  				if (btrfs_block_can_be_shared(root, eb))
  					upper->checked = 0;
  				else
  					upper->checked = 1;
  
  				/*
  				 * add the block to pending list if we
  				 * need check its backrefs. only block
  				 * at 'cur->level + 1' is added to the
  				 * tail of pending list. this guarantees
  				 * we check backrefs from lower level
  				 * blocks to upper level blocks.
  				 */
  				if (!upper->checked &&
  				    level == cur->level + 1) {
  					list_add_tail(&edge->list[UPPER],
  						      &list);
  				} else
  					INIT_LIST_HEAD(&edge->list[UPPER]);
  			} else {
  				upper = rb_entry(rb_node, struct backref_node,
  						 rb_node);
  				BUG_ON(!upper->checked);
  				INIT_LIST_HEAD(&edge->list[UPPER]);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
940
941
  				if (!upper->owner)
  					upper->owner = btrfs_header_owner(eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
942
943
  			}
  			list_add_tail(&edge->list[LOWER], &lower->upper);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
944
  			edge->node[LOWER] = lower;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
945
  			edge->node[UPPER] = upper;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
946
947
948
949
950
951
  
  			if (rb_node)
  				break;
  			lower = upper;
  			upper = NULL;
  		}
b3b4aa74b   David Sterba   btrfs: drop unuse...
952
  		btrfs_release_path(path2);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
953
954
955
956
957
958
959
960
961
962
963
964
  next:
  		if (ptr < end) {
  			ptr += btrfs_extent_inline_ref_size(key.type);
  			if (ptr >= end) {
  				WARN_ON(ptr > end);
  				ptr = 0;
  				end = 0;
  			}
  		}
  		if (ptr >= end)
  			path1->slots[0]++;
  	}
b3b4aa74b   David Sterba   btrfs: drop unuse...
965
  	btrfs_release_path(path1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
  
  	cur->checked = 1;
  	WARN_ON(exist);
  
  	/* the pending list isn't empty, take the first block to process */
  	if (!list_empty(&list)) {
  		edge = list_entry(list.next, struct backref_edge, list[UPPER]);
  		list_del_init(&edge->list[UPPER]);
  		cur = edge->node[UPPER];
  		goto again;
  	}
  
  	/*
  	 * everything goes well, connect backref nodes and insert backref nodes
  	 * into the cache.
  	 */
  	BUG_ON(!node->checked);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
983
984
985
986
987
988
989
  	cowonly = node->cowonly;
  	if (!cowonly) {
  		rb_node = tree_insert(&cache->rb_root, node->bytenr,
  				      &node->rb_node);
  		BUG_ON(rb_node);
  		list_add_tail(&node->lower, &cache->leaves);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
990
991
992
993
994
995
996
997
  
  	list_for_each_entry(edge, &node->upper, list[LOWER])
  		list_add_tail(&edge->list[UPPER], &list);
  
  	while (!list_empty(&list)) {
  		edge = list_entry(list.next, struct backref_edge, list[UPPER]);
  		list_del_init(&edge->list[UPPER]);
  		upper = edge->node[UPPER];
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
998
999
1000
1001
1002
1003
1004
1005
  		if (upper->detached) {
  			list_del(&edge->list[LOWER]);
  			lower = edge->node[LOWER];
  			free_backref_edge(cache, edge);
  			if (list_empty(&lower->upper))
  				list_add(&lower->list, &useless);
  			continue;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
  
  		if (!RB_EMPTY_NODE(&upper->rb_node)) {
  			if (upper->lowest) {
  				list_del_init(&upper->lower);
  				upper->lowest = 0;
  			}
  
  			list_add_tail(&edge->list[UPPER], &upper->lower);
  			continue;
  		}
  
  		BUG_ON(!upper->checked);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1018
1019
1020
1021
1022
1023
  		BUG_ON(cowonly != upper->cowonly);
  		if (!cowonly) {
  			rb_node = tree_insert(&cache->rb_root, upper->bytenr,
  					      &upper->rb_node);
  			BUG_ON(rb_node);
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1024
1025
1026
1027
1028
1029
  
  		list_add_tail(&edge->list[UPPER], &upper->lower);
  
  		list_for_each_entry(edge, &upper->upper, list[LOWER])
  			list_add_tail(&edge->list[UPPER], &list);
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
  	/*
  	 * process useless backref nodes. backref nodes for tree leaves
  	 * are deleted from the cache. backref nodes for upper level
  	 * tree blocks are left in the cache to avoid unnecessary backref
  	 * lookup.
  	 */
  	while (!list_empty(&useless)) {
  		upper = list_entry(useless.next, struct backref_node, list);
  		list_del_init(&upper->list);
  		BUG_ON(!list_empty(&upper->upper));
  		if (upper == node)
  			node = NULL;
  		if (upper->lowest) {
  			list_del_init(&upper->lower);
  			upper->lowest = 0;
  		}
  		while (!list_empty(&upper->lower)) {
  			edge = list_entry(upper->lower.next,
  					  struct backref_edge, list[UPPER]);
  			list_del(&edge->list[UPPER]);
  			list_del(&edge->list[LOWER]);
  			lower = edge->node[LOWER];
  			free_backref_edge(cache, edge);
  
  			if (list_empty(&lower->upper))
  				list_add(&lower->list, &useless);
  		}
  		__mark_block_processed(rc, upper);
  		if (upper->level > 0) {
  			list_add(&upper->list, &cache->detached);
  			upper->detached = 1;
  		} else {
  			rb_erase(&upper->rb_node, &cache->rb_root);
  			free_backref_node(cache, upper);
  		}
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1066
1067
1068
1069
  out:
  	btrfs_free_path(path1);
  	btrfs_free_path(path2);
  	if (err) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1070
1071
1072
1073
1074
  		while (!list_empty(&useless)) {
  			lower = list_entry(useless.next,
  					   struct backref_node, upper);
  			list_del_init(&lower->upper);
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1075
  		upper = node;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1076
  		INIT_LIST_HEAD(&list);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1077
1078
1079
  		while (upper) {
  			if (RB_EMPTY_NODE(&upper->rb_node)) {
  				list_splice_tail(&upper->upper, &list);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1080
  				free_backref_node(cache, upper);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1081
1082
1083
1084
1085
1086
1087
  			}
  
  			if (list_empty(&list))
  				break;
  
  			edge = list_entry(list.next, struct backref_edge,
  					  list[LOWER]);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1088
  			list_del(&edge->list[LOWER]);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1089
  			upper = edge->node[UPPER];
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1090
  			free_backref_edge(cache, edge);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1091
1092
1093
  		}
  		return ERR_PTR(err);
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1094
  	BUG_ON(node && node->detached);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1095
1096
1097
1098
  	return node;
  }
  
  /*
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
   * helper to add backref node for the newly created snapshot.
   * the backref node is created by cloning backref node that
   * corresponds to root of source tree
   */
  static int clone_backref_node(struct btrfs_trans_handle *trans,
  			      struct reloc_control *rc,
  			      struct btrfs_root *src,
  			      struct btrfs_root *dest)
  {
  	struct btrfs_root *reloc_root = src->reloc_root;
  	struct backref_cache *cache = &rc->backref_cache;
  	struct backref_node *node = NULL;
  	struct backref_node *new_node;
  	struct backref_edge *edge;
  	struct backref_edge *new_edge;
  	struct rb_node *rb_node;
  
  	if (cache->last_trans > 0)
  		update_backref_cache(trans, cache);
  
  	rb_node = tree_search(&cache->rb_root, src->commit_root->start);
  	if (rb_node) {
  		node = rb_entry(rb_node, struct backref_node, rb_node);
  		if (node->detached)
  			node = NULL;
  		else
  			BUG_ON(node->new_bytenr != reloc_root->node->start);
  	}
  
  	if (!node) {
  		rb_node = tree_search(&cache->rb_root,
  				      reloc_root->commit_root->start);
  		if (rb_node) {
  			node = rb_entry(rb_node, struct backref_node,
  					rb_node);
  			BUG_ON(node->detached);
  		}
  	}
  
  	if (!node)
  		return 0;
  
  	new_node = alloc_backref_node(cache);
  	if (!new_node)
  		return -ENOMEM;
  
  	new_node->bytenr = dest->node->start;
  	new_node->level = node->level;
  	new_node->lowest = node->lowest;
6848ad646   Yan, Zheng   Btrfs: Fix balanc...
1148
  	new_node->checked = 1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
  	new_node->root = dest;
  
  	if (!node->lowest) {
  		list_for_each_entry(edge, &node->lower, list[UPPER]) {
  			new_edge = alloc_backref_edge(cache);
  			if (!new_edge)
  				goto fail;
  
  			new_edge->node[UPPER] = new_node;
  			new_edge->node[LOWER] = edge->node[LOWER];
  			list_add_tail(&new_edge->list[UPPER],
  				      &new_node->lower);
  		}
76b9e23d2   Miao Xie   Btrfs: fix orphan...
1162
1163
  	} else {
  		list_add_tail(&new_node->lower, &cache->leaves);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
  	}
  
  	rb_node = tree_insert(&cache->rb_root, new_node->bytenr,
  			      &new_node->rb_node);
  	BUG_ON(rb_node);
  
  	if (!new_node->lowest) {
  		list_for_each_entry(new_edge, &new_node->lower, list[UPPER]) {
  			list_add_tail(&new_edge->list[LOWER],
  				      &new_edge->node[LOWER]->upper);
  		}
  	}
  	return 0;
  fail:
  	while (!list_empty(&new_node->lower)) {
  		new_edge = list_entry(new_node->lower.next,
  				      struct backref_edge, list[UPPER]);
  		list_del(&new_edge->list[UPPER]);
  		free_backref_edge(cache, new_edge);
  	}
  	free_backref_node(cache, new_node);
  	return -ENOMEM;
  }
  
  /*
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
   * helper to add 'address of tree root -> reloc tree' mapping
   */
  static int __add_reloc_root(struct btrfs_root *root)
  {
  	struct rb_node *rb_node;
  	struct mapping_node *node;
  	struct reloc_control *rc = root->fs_info->reloc_ctl;
  
  	node = kmalloc(sizeof(*node), GFP_NOFS);
  	BUG_ON(!node);
  
  	node->bytenr = root->node->start;
  	node->data = root;
  
  	spin_lock(&rc->reloc_root_tree.lock);
  	rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
  			      node->bytenr, &node->rb_node);
  	spin_unlock(&rc->reloc_root_tree.lock);
  	BUG_ON(rb_node);
  
  	list_add_tail(&root->root_list, &rc->reloc_roots);
  	return 0;
  }
  
  /*
   * helper to update/delete the 'address of tree root -> reloc tree'
   * mapping
   */
  static int __update_reloc_root(struct btrfs_root *root, int del)
  {
  	struct rb_node *rb_node;
  	struct mapping_node *node = NULL;
  	struct reloc_control *rc = root->fs_info->reloc_ctl;
  
  	spin_lock(&rc->reloc_root_tree.lock);
  	rb_node = tree_search(&rc->reloc_root_tree.rb_root,
  			      root->commit_root->start);
  	if (rb_node) {
  		node = rb_entry(rb_node, struct mapping_node, rb_node);
  		rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root);
  	}
  	spin_unlock(&rc->reloc_root_tree.lock);
  
  	BUG_ON((struct btrfs_root *)node->data != root);
  
  	if (!del) {
  		spin_lock(&rc->reloc_root_tree.lock);
  		node->bytenr = root->node->start;
  		rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
  				      node->bytenr, &node->rb_node);
  		spin_unlock(&rc->reloc_root_tree.lock);
  		BUG_ON(rb_node);
  	} else {
  		list_del_init(&root->root_list);
  		kfree(node);
  	}
  	return 0;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1247
1248
  static struct btrfs_root *create_reloc_root(struct btrfs_trans_handle *trans,
  					struct btrfs_root *root, u64 objectid)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1249
1250
1251
1252
1253
1254
  {
  	struct btrfs_root *reloc_root;
  	struct extent_buffer *eb;
  	struct btrfs_root_item *root_item;
  	struct btrfs_key root_key;
  	int ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1255
1256
1257
1258
1259
  	root_item = kmalloc(sizeof(*root_item), GFP_NOFS);
  	BUG_ON(!root_item);
  
  	root_key.objectid = BTRFS_TREE_RELOC_OBJECTID;
  	root_key.type = BTRFS_ROOT_ITEM_KEY;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1260
  	root_key.offset = objectid;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1261

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
  	if (root->root_key.objectid == objectid) {
  		/* called by btrfs_init_reloc_root */
  		ret = btrfs_copy_root(trans, root, root->commit_root, &eb,
  				      BTRFS_TREE_RELOC_OBJECTID);
  		BUG_ON(ret);
  
  		btrfs_set_root_last_snapshot(&root->root_item,
  					     trans->transid - 1);
  	} else {
  		/*
  		 * called by btrfs_reloc_post_snapshot_hook.
  		 * the source tree is a reloc tree, all tree blocks
  		 * modified after it was created have RELOC flag
  		 * set in their headers. so it's OK to not update
  		 * the 'last_snapshot'.
  		 */
  		ret = btrfs_copy_root(trans, root, root->node, &eb,
  				      BTRFS_TREE_RELOC_OBJECTID);
  		BUG_ON(ret);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1282

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1283
  	memcpy(root_item, &root->root_item, sizeof(*root_item));
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1284
1285
1286
  	btrfs_set_root_bytenr(root_item, eb->start);
  	btrfs_set_root_level(root_item, btrfs_header_level(eb));
  	btrfs_set_root_generation(root_item, trans->transid);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1287
1288
1289
1290
1291
1292
1293
  
  	if (root->root_key.objectid == objectid) {
  		btrfs_set_root_refs(root_item, 0);
  		memset(&root_item->drop_progress, 0,
  		       sizeof(struct btrfs_disk_key));
  		root_item->drop_level = 0;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
  
  	btrfs_tree_unlock(eb);
  	free_extent_buffer(eb);
  
  	ret = btrfs_insert_root(trans, root->fs_info->tree_root,
  				&root_key, root_item);
  	BUG_ON(ret);
  	kfree(root_item);
  
  	reloc_root = btrfs_read_fs_root_no_radix(root->fs_info->tree_root,
  						 &root_key);
  	BUG_ON(IS_ERR(reloc_root));
  	reloc_root->last_trans = trans->transid;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
  	return reloc_root;
  }
  
  /*
   * create reloc tree for a given fs tree. reloc tree is just a
   * snapshot of the fs tree with special root objectid.
   */
  int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,
  			  struct btrfs_root *root)
  {
  	struct btrfs_root *reloc_root;
  	struct reloc_control *rc = root->fs_info->reloc_ctl;
  	int clear_rsv = 0;
  
  	if (root->reloc_root) {
  		reloc_root = root->reloc_root;
  		reloc_root->last_trans = trans->transid;
  		return 0;
  	}
  
  	if (!rc || !rc->create_reloc_tree ||
  	    root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
  		return 0;
  
  	if (!trans->block_rsv) {
  		trans->block_rsv = rc->block_rsv;
  		clear_rsv = 1;
  	}
  	reloc_root = create_reloc_root(trans, root, root->root_key.objectid);
  	if (clear_rsv)
  		trans->block_rsv = NULL;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
  
  	__add_reloc_root(reloc_root);
  	root->reloc_root = reloc_root;
  	return 0;
  }
  
  /*
   * update root item of reloc tree
   */
  int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
  			    struct btrfs_root *root)
  {
  	struct btrfs_root *reloc_root;
  	struct btrfs_root_item *root_item;
  	int del = 0;
  	int ret;
  
  	if (!root->reloc_root)
7585717f3   Chris Mason   Btrfs: fix reloca...
1356
  		goto out;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1357
1358
1359
  
  	reloc_root = root->reloc_root;
  	root_item = &reloc_root->root_item;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1360
1361
  	if (root->fs_info->reloc_ctl->merge_reloc_tree &&
  	    btrfs_root_refs(root_item) == 0) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
  		root->reloc_root = NULL;
  		del = 1;
  	}
  
  	__update_reloc_root(reloc_root, del);
  
  	if (reloc_root->commit_root != reloc_root->node) {
  		btrfs_set_root_node(root_item, reloc_root->node);
  		free_extent_buffer(reloc_root->commit_root);
  		reloc_root->commit_root = btrfs_root_node(reloc_root);
  	}
  
  	ret = btrfs_update_root(trans, root->fs_info->tree_root,
  				&reloc_root->root_key, root_item);
  	BUG_ON(ret);
7585717f3   Chris Mason   Btrfs: fix reloca...
1377
1378
  
  out:
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
  	return 0;
  }
  
  /*
   * helper to find first cached inode with inode number >= objectid
   * in a subvolume
   */
  static struct inode *find_next_inode(struct btrfs_root *root, u64 objectid)
  {
  	struct rb_node *node;
  	struct rb_node *prev;
  	struct btrfs_inode *entry;
  	struct inode *inode;
  
  	spin_lock(&root->inode_lock);
  again:
  	node = root->inode_tree.rb_node;
  	prev = NULL;
  	while (node) {
  		prev = node;
  		entry = rb_entry(node, struct btrfs_inode, rb_node);
33345d015   Li Zefan   Btrfs: Always use...
1400
  		if (objectid < btrfs_ino(&entry->vfs_inode))
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1401
  			node = node->rb_left;
33345d015   Li Zefan   Btrfs: Always use...
1402
  		else if (objectid > btrfs_ino(&entry->vfs_inode))
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1403
1404
1405
1406
1407
1408
1409
  			node = node->rb_right;
  		else
  			break;
  	}
  	if (!node) {
  		while (prev) {
  			entry = rb_entry(prev, struct btrfs_inode, rb_node);
33345d015   Li Zefan   Btrfs: Always use...
1410
  			if (objectid <= btrfs_ino(&entry->vfs_inode)) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
  				node = prev;
  				break;
  			}
  			prev = rb_next(prev);
  		}
  	}
  	while (node) {
  		entry = rb_entry(node, struct btrfs_inode, rb_node);
  		inode = igrab(&entry->vfs_inode);
  		if (inode) {
  			spin_unlock(&root->inode_lock);
  			return inode;
  		}
33345d015   Li Zefan   Btrfs: Always use...
1424
  		objectid = btrfs_ino(&entry->vfs_inode) + 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
  		if (cond_resched_lock(&root->inode_lock))
  			goto again;
  
  		node = rb_next(node);
  	}
  	spin_unlock(&root->inode_lock);
  	return NULL;
  }
  
  static int in_block_group(u64 bytenr,
  			  struct btrfs_block_group_cache *block_group)
  {
  	if (bytenr >= block_group->key.objectid &&
  	    bytenr < block_group->key.objectid + block_group->key.offset)
  		return 1;
  	return 0;
  }
  
  /*
   * get new location of data
   */
  static int get_new_location(struct inode *reloc_inode, u64 *new_bytenr,
  			    u64 bytenr, u64 num_bytes)
  {
  	struct btrfs_root *root = BTRFS_I(reloc_inode)->root;
  	struct btrfs_path *path;
  	struct btrfs_file_extent_item *fi;
  	struct extent_buffer *leaf;
  	int ret;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
  
  	bytenr -= BTRFS_I(reloc_inode)->index_cnt;
33345d015   Li Zefan   Btrfs: Always use...
1460
  	ret = btrfs_lookup_file_extent(NULL, root, path, btrfs_ino(reloc_inode),
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
  				       bytenr, 0);
  	if (ret < 0)
  		goto out;
  	if (ret > 0) {
  		ret = -ENOENT;
  		goto out;
  	}
  
  	leaf = path->nodes[0];
  	fi = btrfs_item_ptr(leaf, path->slots[0],
  			    struct btrfs_file_extent_item);
  
  	BUG_ON(btrfs_file_extent_offset(leaf, fi) ||
  	       btrfs_file_extent_compression(leaf, fi) ||
  	       btrfs_file_extent_encryption(leaf, fi) ||
  	       btrfs_file_extent_other_encoding(leaf, fi));
  
  	if (num_bytes != btrfs_file_extent_disk_num_bytes(leaf, fi)) {
  		ret = 1;
  		goto out;
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1482
  	*new_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
  	ret = 0;
  out:
  	btrfs_free_path(path);
  	return ret;
  }
  
  /*
   * update file extent items in the tree leaf to point to
   * the new locations.
   */
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1493
1494
1495
1496
1497
  static noinline_for_stack
  int replace_file_extents(struct btrfs_trans_handle *trans,
  			 struct reloc_control *rc,
  			 struct btrfs_root *root,
  			 struct extent_buffer *leaf)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1498
1499
1500
1501
  {
  	struct btrfs_key key;
  	struct btrfs_file_extent_item *fi;
  	struct inode *inode = NULL;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1502
1503
  	u64 parent;
  	u64 bytenr;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1504
  	u64 new_bytenr = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
  	u64 num_bytes;
  	u64 end;
  	u32 nritems;
  	u32 i;
  	int ret;
  	int first = 1;
  	int dirty = 0;
  
  	if (rc->stage != UPDATE_DATA_PTRS)
  		return 0;
  
  	/* reloc trees always use full backref */
  	if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
  		parent = leaf->start;
  	else
  		parent = 0;
  
  	nritems = btrfs_header_nritems(leaf);
  	for (i = 0; i < nritems; i++) {
  		cond_resched();
  		btrfs_item_key_to_cpu(leaf, &key, i);
  		if (key.type != BTRFS_EXTENT_DATA_KEY)
  			continue;
  		fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item);
  		if (btrfs_file_extent_type(leaf, fi) ==
  		    BTRFS_FILE_EXTENT_INLINE)
  			continue;
  		bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
  		num_bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
  		if (bytenr == 0)
  			continue;
  		if (!in_block_group(bytenr, rc->block_group))
  			continue;
  
  		/*
  		 * if we are modifying block in fs tree, wait for readpage
  		 * to complete and drop the extent cache
  		 */
  		if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1544
1545
  			if (first) {
  				inode = find_next_inode(root, key.objectid);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1546
  				first = 0;
33345d015   Li Zefan   Btrfs: Always use...
1547
  			} else if (inode && btrfs_ino(inode) < key.objectid) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1548
  				btrfs_add_delayed_iput(inode);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1549
  				inode = find_next_inode(root, key.objectid);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1550
  			}
33345d015   Li Zefan   Btrfs: Always use...
1551
  			if (inode && btrfs_ino(inode) == key.objectid) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
  				end = key.offset +
  				      btrfs_file_extent_num_bytes(leaf, fi);
  				WARN_ON(!IS_ALIGNED(key.offset,
  						    root->sectorsize));
  				WARN_ON(!IS_ALIGNED(end, root->sectorsize));
  				end--;
  				ret = try_lock_extent(&BTRFS_I(inode)->io_tree,
  						      key.offset, end,
  						      GFP_NOFS);
  				if (!ret)
  					continue;
  
  				btrfs_drop_extent_cache(inode, key.offset, end,
  							1);
  				unlock_extent(&BTRFS_I(inode)->io_tree,
  					      key.offset, end, GFP_NOFS);
  			}
  		}
  
  		ret = get_new_location(rc->data_inode, &new_bytenr,
  				       bytenr, num_bytes);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1573
1574
  		if (ret > 0) {
  			WARN_ON(1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1575
  			continue;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1576
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
  		BUG_ON(ret < 0);
  
  		btrfs_set_file_extent_disk_bytenr(leaf, fi, new_bytenr);
  		dirty = 1;
  
  		key.offset -= btrfs_file_extent_offset(leaf, fi);
  		ret = btrfs_inc_extent_ref(trans, root, new_bytenr,
  					   num_bytes, parent,
  					   btrfs_header_owner(leaf),
  					   key.objectid, key.offset);
  		BUG_ON(ret);
  
  		ret = btrfs_free_extent(trans, root, bytenr, num_bytes,
  					parent, btrfs_header_owner(leaf),
  					key.objectid, key.offset);
  		BUG_ON(ret);
  	}
  	if (dirty)
  		btrfs_mark_buffer_dirty(leaf);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1596
1597
  	if (inode)
  		btrfs_add_delayed_iput(inode);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
  	return 0;
  }
  
  static noinline_for_stack
  int memcmp_node_keys(struct extent_buffer *eb, int slot,
  		     struct btrfs_path *path, int level)
  {
  	struct btrfs_disk_key key1;
  	struct btrfs_disk_key key2;
  	btrfs_node_key(eb, &key1, slot);
  	btrfs_node_key(path->nodes[level], &key2, path->slots[level]);
  	return memcmp(&key1, &key2, sizeof(key1));
  }
  
  /*
   * try to replace tree blocks in fs tree with the new blocks
   * in reloc tree. tree blocks haven't been modified since the
   * reloc tree was create can be replaced.
   *
   * if a block was replaced, level of the block + 1 is returned.
   * if no block got replaced, 0 is returned. if there are other
   * errors, a negative error number is returned.
   */
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1621
1622
1623
1624
1625
  static noinline_for_stack
  int replace_path(struct btrfs_trans_handle *trans,
  		 struct btrfs_root *dest, struct btrfs_root *src,
  		 struct btrfs_path *path, struct btrfs_key *next_key,
  		 int lowest_level, int max_level)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
  {
  	struct extent_buffer *eb;
  	struct extent_buffer *parent;
  	struct btrfs_key key;
  	u64 old_bytenr;
  	u64 new_bytenr;
  	u64 old_ptr_gen;
  	u64 new_ptr_gen;
  	u64 last_snapshot;
  	u32 blocksize;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1636
  	int cow = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1637
1638
1639
1640
1641
1642
  	int level;
  	int ret;
  	int slot;
  
  	BUG_ON(src->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID);
  	BUG_ON(dest->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1643
1644
  
  	last_snapshot = btrfs_root_last_snapshot(&src->root_item);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1645
  again:
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
  	slot = path->slots[lowest_level];
  	btrfs_node_key_to_cpu(path->nodes[lowest_level], &key, slot);
  
  	eb = btrfs_lock_root_node(dest);
  	btrfs_set_lock_blocking(eb);
  	level = btrfs_header_level(eb);
  
  	if (level < lowest_level) {
  		btrfs_tree_unlock(eb);
  		free_extent_buffer(eb);
  		return 0;
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1658
1659
1660
1661
  	if (cow) {
  		ret = btrfs_cow_block(trans, dest, eb, NULL, 0, &eb);
  		BUG_ON(ret);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
  	btrfs_set_lock_blocking(eb);
  
  	if (next_key) {
  		next_key->objectid = (u64)-1;
  		next_key->type = (u8)-1;
  		next_key->offset = (u64)-1;
  	}
  
  	parent = eb;
  	while (1) {
  		level = btrfs_header_level(parent);
  		BUG_ON(level < lowest_level);
  
  		ret = btrfs_bin_search(parent, &key, level, &slot);
  		if (ret && slot > 0)
  			slot--;
  
  		if (next_key && slot + 1 < btrfs_header_nritems(parent))
  			btrfs_node_key_to_cpu(parent, next_key, slot + 1);
  
  		old_bytenr = btrfs_node_blockptr(parent, slot);
  		blocksize = btrfs_level_size(dest, level - 1);
  		old_ptr_gen = btrfs_node_ptr_generation(parent, slot);
  
  		if (level <= max_level) {
  			eb = path->nodes[level];
  			new_bytenr = btrfs_node_blockptr(eb,
  							path->slots[level]);
  			new_ptr_gen = btrfs_node_ptr_generation(eb,
  							path->slots[level]);
  		} else {
  			new_bytenr = 0;
  			new_ptr_gen = 0;
  		}
  
  		if (new_bytenr > 0 && new_bytenr == old_bytenr) {
  			WARN_ON(1);
  			ret = level;
  			break;
  		}
  
  		if (new_bytenr == 0 || old_ptr_gen > last_snapshot ||
  		    memcmp_node_keys(parent, slot, path, level)) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1705
  			if (level <= lowest_level) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1706
1707
1708
1709
1710
1711
  				ret = 0;
  				break;
  			}
  
  			eb = read_tree_block(dest, old_bytenr, blocksize,
  					     old_ptr_gen);
97d9a8a42   Tsutomu Itoh   Btrfs: check retu...
1712
  			BUG_ON(!eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1713
  			btrfs_tree_lock(eb);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1714
1715
1716
1717
  			if (cow) {
  				ret = btrfs_cow_block(trans, dest, eb, parent,
  						      slot, &eb);
  				BUG_ON(ret);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1718
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1719
  			btrfs_set_lock_blocking(eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1720
1721
1722
1723
1724
1725
1726
  
  			btrfs_tree_unlock(parent);
  			free_extent_buffer(parent);
  
  			parent = eb;
  			continue;
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1727
1728
1729
1730
1731
1732
  		if (!cow) {
  			btrfs_tree_unlock(parent);
  			free_extent_buffer(parent);
  			cow = 1;
  			goto again;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1733
1734
  		btrfs_node_key_to_cpu(path->nodes[level], &key,
  				      path->slots[level]);
b3b4aa74b   David Sterba   btrfs: drop unuse...
1735
  		btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
  
  		path->lowest_level = level;
  		ret = btrfs_search_slot(trans, src, &key, path, 0, 1);
  		path->lowest_level = 0;
  		BUG_ON(ret);
  
  		/*
  		 * swap blocks in fs tree and reloc tree.
  		 */
  		btrfs_set_node_blockptr(parent, slot, new_bytenr);
  		btrfs_set_node_ptr_generation(parent, slot, new_ptr_gen);
  		btrfs_mark_buffer_dirty(parent);
  
  		btrfs_set_node_blockptr(path->nodes[level],
  					path->slots[level], old_bytenr);
  		btrfs_set_node_ptr_generation(path->nodes[level],
  					      path->slots[level], old_ptr_gen);
  		btrfs_mark_buffer_dirty(path->nodes[level]);
  
  		ret = btrfs_inc_extent_ref(trans, src, old_bytenr, blocksize,
  					path->nodes[level]->start,
  					src->root_key.objectid, level - 1, 0);
  		BUG_ON(ret);
  		ret = btrfs_inc_extent_ref(trans, dest, new_bytenr, blocksize,
  					0, dest->root_key.objectid, level - 1,
  					0);
  		BUG_ON(ret);
  
  		ret = btrfs_free_extent(trans, src, new_bytenr, blocksize,
  					path->nodes[level]->start,
  					src->root_key.objectid, level - 1, 0);
  		BUG_ON(ret);
  
  		ret = btrfs_free_extent(trans, dest, old_bytenr, blocksize,
  					0, dest->root_key.objectid, level - 1,
  					0);
  		BUG_ON(ret);
  
  		btrfs_unlock_up_safe(path, 0);
  
  		ret = level;
  		break;
  	}
  	btrfs_tree_unlock(parent);
  	free_extent_buffer(parent);
  	return ret;
  }
  
  /*
   * helper to find next relocated block in reloc tree
   */
  static noinline_for_stack
  int walk_up_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
  		       int *level)
  {
  	struct extent_buffer *eb;
  	int i;
  	u64 last_snapshot;
  	u32 nritems;
  
  	last_snapshot = btrfs_root_last_snapshot(&root->root_item);
  
  	for (i = 0; i < *level; i++) {
  		free_extent_buffer(path->nodes[i]);
  		path->nodes[i] = NULL;
  	}
  
  	for (i = *level; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) {
  		eb = path->nodes[i];
  		nritems = btrfs_header_nritems(eb);
  		while (path->slots[i] + 1 < nritems) {
  			path->slots[i]++;
  			if (btrfs_node_ptr_generation(eb, path->slots[i]) <=
  			    last_snapshot)
  				continue;
  
  			*level = i;
  			return 0;
  		}
  		free_extent_buffer(path->nodes[i]);
  		path->nodes[i] = NULL;
  	}
  	return 1;
  }
  
  /*
   * walk down reloc tree to find relocated block of lowest level
   */
  static noinline_for_stack
  int walk_down_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
  			 int *level)
  {
  	struct extent_buffer *eb = NULL;
  	int i;
  	u64 bytenr;
  	u64 ptr_gen = 0;
  	u64 last_snapshot;
  	u32 blocksize;
  	u32 nritems;
  
  	last_snapshot = btrfs_root_last_snapshot(&root->root_item);
  
  	for (i = *level; i > 0; i--) {
  		eb = path->nodes[i];
  		nritems = btrfs_header_nritems(eb);
  		while (path->slots[i] < nritems) {
  			ptr_gen = btrfs_node_ptr_generation(eb, path->slots[i]);
  			if (ptr_gen > last_snapshot)
  				break;
  			path->slots[i]++;
  		}
  		if (path->slots[i] >= nritems) {
  			if (i == *level)
  				break;
  			*level = i + 1;
  			return 0;
  		}
  		if (i == 1) {
  			*level = i;
  			return 0;
  		}
  
  		bytenr = btrfs_node_blockptr(eb, path->slots[i]);
  		blocksize = btrfs_level_size(root, i - 1);
  		eb = read_tree_block(root, bytenr, blocksize, ptr_gen);
  		BUG_ON(btrfs_header_level(eb) != i - 1);
  		path->nodes[i - 1] = eb;
  		path->slots[i - 1] = 0;
  	}
  	return 1;
  }
  
  /*
   * invalidate extent cache for file extents whose key in range of
   * [min_key, max_key)
   */
  static int invalidate_extent_cache(struct btrfs_root *root,
  				   struct btrfs_key *min_key,
  				   struct btrfs_key *max_key)
  {
  	struct inode *inode = NULL;
  	u64 objectid;
  	u64 start, end;
33345d015   Li Zefan   Btrfs: Always use...
1879
  	u64 ino;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
  
  	objectid = min_key->objectid;
  	while (1) {
  		cond_resched();
  		iput(inode);
  
  		if (objectid > max_key->objectid)
  			break;
  
  		inode = find_next_inode(root, objectid);
  		if (!inode)
  			break;
33345d015   Li Zefan   Btrfs: Always use...
1892
  		ino = btrfs_ino(inode);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1893

33345d015   Li Zefan   Btrfs: Always use...
1894
  		if (ino > max_key->objectid) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1895
1896
1897
  			iput(inode);
  			break;
  		}
33345d015   Li Zefan   Btrfs: Always use...
1898
  		objectid = ino + 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1899
1900
  		if (!S_ISREG(inode->i_mode))
  			continue;
33345d015   Li Zefan   Btrfs: Always use...
1901
  		if (unlikely(min_key->objectid == ino)) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
  			if (min_key->type > BTRFS_EXTENT_DATA_KEY)
  				continue;
  			if (min_key->type < BTRFS_EXTENT_DATA_KEY)
  				start = 0;
  			else {
  				start = min_key->offset;
  				WARN_ON(!IS_ALIGNED(start, root->sectorsize));
  			}
  		} else {
  			start = 0;
  		}
33345d015   Li Zefan   Btrfs: Always use...
1913
  		if (unlikely(max_key->objectid == ino)) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
  			if (max_key->type < BTRFS_EXTENT_DATA_KEY)
  				continue;
  			if (max_key->type > BTRFS_EXTENT_DATA_KEY) {
  				end = (u64)-1;
  			} else {
  				if (max_key->offset == 0)
  					continue;
  				end = max_key->offset;
  				WARN_ON(!IS_ALIGNED(end, root->sectorsize));
  				end--;
  			}
  		} else {
  			end = (u64)-1;
  		}
  
  		/* the lock_extent waits for readpage to complete */
  		lock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  		btrfs_drop_extent_cache(inode, start, end, 1);
  		unlock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  	}
  	return 0;
  }
  
  static int find_next_key(struct btrfs_path *path, int level,
  			 struct btrfs_key *key)
  
  {
  	while (level < BTRFS_MAX_LEVEL) {
  		if (!path->nodes[level])
  			break;
  		if (path->slots[level] + 1 <
  		    btrfs_header_nritems(path->nodes[level])) {
  			btrfs_node_key_to_cpu(path->nodes[level], key,
  					      path->slots[level] + 1);
  			return 0;
  		}
  		level++;
  	}
  	return 1;
  }
  
  /*
   * merge the relocated tree blocks in reloc tree with corresponding
   * fs tree.
   */
  static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
  					       struct btrfs_root *root)
  {
  	LIST_HEAD(inode_list);
  	struct btrfs_key key;
  	struct btrfs_key next_key;
  	struct btrfs_trans_handle *trans;
  	struct btrfs_root *reloc_root;
  	struct btrfs_root_item *root_item;
  	struct btrfs_path *path;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1969
  	struct extent_buffer *leaf;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1970
1971
1972
1973
1974
1975
  	unsigned long nr;
  	int level;
  	int max_level;
  	int replaced = 0;
  	int ret;
  	int err = 0;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
1976
  	u32 min_reserved;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1977
1978
1979
1980
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
026fd3178   Josef Bacik   Btrfs: don't alwa...
1981
  	path->reada = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
  
  	reloc_root = root->reloc_root;
  	root_item = &reloc_root->root_item;
  
  	if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
  		level = btrfs_root_level(root_item);
  		extent_buffer_get(reloc_root->node);
  		path->nodes[level] = reloc_root->node;
  		path->slots[level] = 0;
  	} else {
  		btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
  
  		level = root_item->drop_level;
  		BUG_ON(level == 0);
  		path->lowest_level = level;
  		ret = btrfs_search_slot(NULL, reloc_root, &key, path, 0, 0);
33c66f430   Yan Zheng   Btrfs: fix lockin...
1998
  		path->lowest_level = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
  		if (ret < 0) {
  			btrfs_free_path(path);
  			return ret;
  		}
  
  		btrfs_node_key_to_cpu(path->nodes[level], &next_key,
  				      path->slots[level]);
  		WARN_ON(memcmp(&key, &next_key, sizeof(key)));
  
  		btrfs_unlock_up_safe(path, 0);
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2010
2011
  	min_reserved = root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
  	memset(&next_key, 0, sizeof(next_key));
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2012

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2013
2014
  	while (1) {
  		trans = btrfs_start_transaction(root, 0);
98d5dc13e   Tsutomu Itoh   btrfs: fix return...
2015
  		BUG_ON(IS_ERR(trans));
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2016
  		trans->block_rsv = rc->block_rsv;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2017

36ba022ac   Josef Bacik   Btrfs: seperate o...
2018
  		ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2019
2020
2021
2022
2023
  		if (ret) {
  			BUG_ON(ret != -EAGAIN);
  			ret = btrfs_commit_transaction(trans, root);
  			BUG_ON(ret);
  			continue;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2024
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2025
  		replaced = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
  		max_level = level;
  
  		ret = walk_down_reloc_tree(reloc_root, path, &level);
  		if (ret < 0) {
  			err = ret;
  			goto out;
  		}
  		if (ret > 0)
  			break;
  
  		if (!find_next_key(path, level, &key) &&
  		    btrfs_comp_cpu_keys(&next_key, &key) >= 0) {
  			ret = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2039
  		} else {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2040
2041
  			ret = replace_path(trans, root, reloc_root, path,
  					   &next_key, level, max_level);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
  		}
  		if (ret < 0) {
  			err = ret;
  			goto out;
  		}
  
  		if (ret > 0) {
  			level = ret;
  			btrfs_node_key_to_cpu(path->nodes[level], &key,
  					      path->slots[level]);
  			replaced = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
  		}
  
  		ret = walk_up_reloc_tree(reloc_root, path, &level);
  		if (ret > 0)
  			break;
  
  		BUG_ON(level == 0);
  		/*
  		 * save the merging progress in the drop_progress.
  		 * this is OK since root refs == 1 in this case.
  		 */
  		btrfs_node_key(path->nodes[level], &root_item->drop_progress,
  			       path->slots[level]);
  		root_item->drop_level = level;
  
  		nr = trans->blocks_used;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2069
  		btrfs_end_transaction_throttle(trans, root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
  
  		btrfs_btree_balance_dirty(root, nr);
  
  		if (replaced && rc->stage == UPDATE_DATA_PTRS)
  			invalidate_extent_cache(root, &key, &next_key);
  	}
  
  	/*
  	 * handle the case only one block in the fs tree need to be
  	 * relocated and the block is tree root.
  	 */
  	leaf = btrfs_lock_root_node(root);
  	ret = btrfs_cow_block(trans, root, leaf, NULL, 0, &leaf);
  	btrfs_tree_unlock(leaf);
  	free_extent_buffer(leaf);
  	if (ret < 0)
  		err = ret;
  out:
  	btrfs_free_path(path);
  
  	if (err == 0) {
  		memset(&root_item->drop_progress, 0,
  		       sizeof(root_item->drop_progress));
  		root_item->drop_level = 0;
  		btrfs_set_root_refs(root_item, 0);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2095
  		btrfs_update_reloc_root(trans, root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2096
2097
2098
  	}
  
  	nr = trans->blocks_used;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2099
  	btrfs_end_transaction_throttle(trans, root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2100
2101
  
  	btrfs_btree_balance_dirty(root, nr);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2102
2103
2104
2105
2106
  	if (replaced && rc->stage == UPDATE_DATA_PTRS)
  		invalidate_extent_cache(root, &key, &next_key);
  
  	return err;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2107
2108
  static noinline_for_stack
  int prepare_to_merge(struct reloc_control *rc, int err)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2109
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2110
  	struct btrfs_root *root = rc->extent_root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2111
  	struct btrfs_root *reloc_root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2112
2113
2114
2115
  	struct btrfs_trans_handle *trans;
  	LIST_HEAD(reloc_roots);
  	u64 num_bytes = 0;
  	int ret;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2116

7585717f3   Chris Mason   Btrfs: fix reloca...
2117
  	mutex_lock(&root->fs_info->reloc_mutex);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2118
2119
  	rc->merging_rsv_size += root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
  	rc->merging_rsv_size += rc->nodes_relocated * 2;
7585717f3   Chris Mason   Btrfs: fix reloca...
2120
  	mutex_unlock(&root->fs_info->reloc_mutex);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2121
2122
2123
  again:
  	if (!err) {
  		num_bytes = rc->merging_rsv_size;
4a92b1b8d   Josef Bacik   Btrfs: stop passi...
2124
  		ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2125
2126
2127
  		if (ret)
  			err = ret;
  	}
7a7eaa40a   Josef Bacik   Btrfs: take away ...
2128
  	trans = btrfs_join_transaction(rc->extent_root);
3612b4959   Tsutomu Itoh   btrfs: fix return...
2129
2130
2131
2132
2133
2134
  	if (IS_ERR(trans)) {
  		if (!err)
  			btrfs_block_rsv_release(rc->extent_root,
  						rc->block_rsv, num_bytes);
  		return PTR_ERR(trans);
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2135
2136
2137
2138
2139
2140
  
  	if (!err) {
  		if (num_bytes != rc->merging_rsv_size) {
  			btrfs_end_transaction(trans, rc->extent_root);
  			btrfs_block_rsv_release(rc->extent_root,
  						rc->block_rsv, num_bytes);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2141
2142
2143
  			goto again;
  		}
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2144

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2145
2146
2147
2148
2149
2150
  	rc->merge_reloc_tree = 1;
  
  	while (!list_empty(&rc->reloc_roots)) {
  		reloc_root = list_entry(rc->reloc_roots.next,
  					struct btrfs_root, root_list);
  		list_del_init(&reloc_root->root_list);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2151

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2152
2153
2154
2155
  		root = read_fs_root(reloc_root->fs_info,
  				    reloc_root->root_key.offset);
  		BUG_ON(IS_ERR(root));
  		BUG_ON(root->reloc_root != reloc_root);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2156
2157
2158
2159
2160
2161
  		/*
  		 * set reference count to 1, so btrfs_recover_relocation
  		 * knows it should resumes merging
  		 */
  		if (!err)
  			btrfs_set_root_refs(&reloc_root->root_item, 1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2162
  		btrfs_update_reloc_root(trans, root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2163

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2164
2165
  		list_add(&reloc_root->root_list, &reloc_roots);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2166

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2167
  	list_splice(&reloc_roots, &rc->reloc_roots);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2168

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2169
2170
2171
2172
2173
  	if (!err)
  		btrfs_commit_transaction(trans, rc->extent_root);
  	else
  		btrfs_end_transaction(trans, rc->extent_root);
  	return err;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2174
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2175
2176
  static noinline_for_stack
  int merge_reloc_roots(struct reloc_control *rc)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2177
  {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2178
  	struct btrfs_root *root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2179
2180
2181
2182
2183
2184
  	struct btrfs_root *reloc_root;
  	LIST_HEAD(reloc_roots);
  	int found = 0;
  	int ret;
  again:
  	root = rc->extent_root;
7585717f3   Chris Mason   Btrfs: fix reloca...
2185
2186
2187
2188
2189
2190
2191
2192
  
  	/*
  	 * this serializes us with btrfs_record_root_in_transaction,
  	 * we have to make sure nobody is in the middle of
  	 * adding their roots to the list while we are
  	 * doing this splice
  	 */
  	mutex_lock(&root->fs_info->reloc_mutex);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2193
  	list_splice_init(&rc->reloc_roots, &reloc_roots);
7585717f3   Chris Mason   Btrfs: fix reloca...
2194
  	mutex_unlock(&root->fs_info->reloc_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2195

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2196
2197
2198
2199
  	while (!list_empty(&reloc_roots)) {
  		found = 1;
  		reloc_root = list_entry(reloc_roots.next,
  					struct btrfs_root, root_list);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2200

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2201
2202
2203
2204
2205
  		if (btrfs_root_refs(&reloc_root->root_item) > 0) {
  			root = read_fs_root(reloc_root->fs_info,
  					    reloc_root->root_key.offset);
  			BUG_ON(IS_ERR(root));
  			BUG_ON(root->reloc_root != reloc_root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2206

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2207
2208
2209
2210
2211
2212
  			ret = merge_reloc_root(rc, root);
  			BUG_ON(ret);
  		} else {
  			list_del_init(&reloc_root->root_list);
  		}
  		btrfs_drop_snapshot(reloc_root, rc->block_rsv, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2213
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2214
2215
2216
2217
  	if (found) {
  		found = 0;
  		goto again;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
  	BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root));
  	return 0;
  }
  
  static void free_block_list(struct rb_root *blocks)
  {
  	struct tree_block *block;
  	struct rb_node *rb_node;
  	while ((rb_node = rb_first(blocks))) {
  		block = rb_entry(rb_node, struct tree_block, rb_node);
  		rb_erase(rb_node, blocks);
  		kfree(block);
  	}
  }
  
  static int record_reloc_root_in_trans(struct btrfs_trans_handle *trans,
  				      struct btrfs_root *reloc_root)
  {
  	struct btrfs_root *root;
  
  	if (reloc_root->last_trans == trans->transid)
  		return 0;
  
  	root = read_fs_root(reloc_root->fs_info, reloc_root->root_key.offset);
  	BUG_ON(IS_ERR(root));
  	BUG_ON(root->reloc_root != reloc_root);
  
  	return btrfs_record_root_in_trans(trans, root);
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2247
2248
2249
2250
2251
  static noinline_for_stack
  struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
  				     struct reloc_control *rc,
  				     struct backref_node *node,
  				     struct backref_edge *edges[], int *nr)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2252
2253
2254
  {
  	struct backref_node *next;
  	struct btrfs_root *root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2255
  	int index = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2256
2257
2258
2259
2260
  	next = node;
  	while (1) {
  		cond_resched();
  		next = walk_up_backref(next, edges, &index);
  		root = next->root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2261
2262
  		BUG_ON(!root);
  		BUG_ON(!root->ref_cows);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2263
2264
2265
2266
2267
  
  		if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
  			record_reloc_root_in_trans(trans, root);
  			break;
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
  		btrfs_record_root_in_trans(trans, root);
  		root = root->reloc_root;
  
  		if (next->new_bytenr != root->node->start) {
  			BUG_ON(next->new_bytenr);
  			BUG_ON(!list_empty(&next->list));
  			next->new_bytenr = root->node->start;
  			next->root = root;
  			list_add_tail(&next->list,
  				      &rc->backref_cache.changed);
  			__mark_block_processed(rc, next);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2279
2280
  			break;
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2281
  		WARN_ON(1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2282
2283
2284
2285
2286
  		root = NULL;
  		next = walk_down_backref(edges, &index);
  		if (!next || next->level <= node->level)
  			break;
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2287
2288
  	if (!root)
  		return NULL;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2289

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2290
2291
2292
2293
2294
2295
2296
2297
  	*nr = index;
  	next = node;
  	/* setup backref node path for btrfs_reloc_cow_block */
  	while (1) {
  		rc->backref_cache.path[next->level] = next;
  		if (--index < 0)
  			break;
  		next = edges[index]->node[UPPER];
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2298
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2299
2300
  	return root;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2301
2302
2303
2304
2305
2306
  /*
   * select a tree root for relocation. return NULL if the block
   * is reference counted. we should use do_relocation() in this
   * case. return a tree root pointer if the block isn't reference
   * counted. return -ENOENT if the block is root of reloc tree.
   */
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2307
2308
2309
2310
  static noinline_for_stack
  struct btrfs_root *select_one_root(struct btrfs_trans_handle *trans,
  				   struct backref_node *node)
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2311
2312
2313
  	struct backref_node *next;
  	struct btrfs_root *root;
  	struct btrfs_root *fs_root = NULL;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2314
  	struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2315
2316
2317
2318
2319
2320
2321
2322
  	int index = 0;
  
  	next = node;
  	while (1) {
  		cond_resched();
  		next = walk_up_backref(next, edges, &index);
  		root = next->root;
  		BUG_ON(!root);
25985edce   Lucas De Marchi   Fix common misspe...
2323
  		/* no other choice for non-references counted tree */
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
  		if (!root->ref_cows)
  			return root;
  
  		if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID)
  			fs_root = root;
  
  		if (next != node)
  			return NULL;
  
  		next = walk_down_backref(edges, &index);
  		if (!next || next->level <= node->level)
  			break;
  	}
  
  	if (!fs_root)
  		return ERR_PTR(-ENOENT);
  	return fs_root;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2341
2342
2343
  }
  
  static noinline_for_stack
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2344
2345
  u64 calcu_metadata_size(struct reloc_control *rc,
  			struct backref_node *node, int reserve)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2346
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
  	struct backref_node *next = node;
  	struct backref_edge *edge;
  	struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
  	u64 num_bytes = 0;
  	int index = 0;
  
  	BUG_ON(reserve && node->processed);
  
  	while (next) {
  		cond_resched();
  		while (1) {
  			if (next->processed && (reserve || next != node))
  				break;
  
  			num_bytes += btrfs_level_size(rc->extent_root,
  						      next->level);
  
  			if (list_empty(&next->upper))
  				break;
  
  			edge = list_entry(next->upper.next,
  					  struct backref_edge, list[LOWER]);
  			edges[index++] = edge;
  			next = edge->node[UPPER];
  		}
  		next = walk_down_backref(edges, &index);
  	}
  	return num_bytes;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2375
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2376
2377
2378
  static int reserve_metadata_space(struct btrfs_trans_handle *trans,
  				  struct reloc_control *rc,
  				  struct backref_node *node)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2379
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2380
2381
2382
2383
2384
  	struct btrfs_root *root = rc->extent_root;
  	u64 num_bytes;
  	int ret;
  
  	num_bytes = calcu_metadata_size(rc, node, 1) * 2;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2385

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2386
  	trans->block_rsv = rc->block_rsv;
4a92b1b8d   Josef Bacik   Btrfs: stop passi...
2387
  	ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2388
2389
2390
2391
  	if (ret) {
  		if (ret == -EAGAIN)
  			rc->commit_transaction = 1;
  		return ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2392
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2393

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2394
2395
2396
2397
2398
2399
2400
2401
  	return 0;
  }
  
  static void release_metadata_space(struct reloc_control *rc,
  				   struct backref_node *node)
  {
  	u64 num_bytes = calcu_metadata_size(rc, node, 0) * 2;
  	btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, num_bytes);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
  }
  
  /*
   * relocate a block tree, and then update pointers in upper level
   * blocks that reference the block to point to the new location.
   *
   * if called by link_to_upper, the block has already been relocated.
   * in that case this function just updates pointers.
   */
  static int do_relocation(struct btrfs_trans_handle *trans,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2412
  			 struct reloc_control *rc,
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
  			 struct backref_node *node,
  			 struct btrfs_key *key,
  			 struct btrfs_path *path, int lowest)
  {
  	struct backref_node *upper;
  	struct backref_edge *edge;
  	struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
  	struct btrfs_root *root;
  	struct extent_buffer *eb;
  	u32 blocksize;
  	u64 bytenr;
  	u64 generation;
  	int nr;
  	int slot;
  	int ret;
  	int err = 0;
  
  	BUG_ON(lowest && node->eb);
  
  	path->lowest_level = node->level + 1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2433
  	rc->backref_cache.path[node->level] = node;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2434
2435
  	list_for_each_entry(edge, &node->upper, list[LOWER]) {
  		cond_resched();
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2436
2437
  
  		upper = edge->node[UPPER];
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
  		root = select_reloc_root(trans, rc, upper, edges, &nr);
  		BUG_ON(!root);
  
  		if (upper->eb && !upper->locked) {
  			if (!lowest) {
  				ret = btrfs_bin_search(upper->eb, key,
  						       upper->level, &slot);
  				BUG_ON(ret);
  				bytenr = btrfs_node_blockptr(upper->eb, slot);
  				if (node->eb->start == bytenr)
  					goto next;
  			}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2450
  			drop_node_buffer(upper);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2451
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2452
2453
2454
2455
2456
2457
2458
2459
  
  		if (!upper->eb) {
  			ret = btrfs_search_slot(trans, root, key, path, 0, 1);
  			if (ret < 0) {
  				err = ret;
  				break;
  			}
  			BUG_ON(ret > 0);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2460
2461
2462
2463
2464
2465
  			if (!upper->eb) {
  				upper->eb = path->nodes[upper->level];
  				path->nodes[upper->level] = NULL;
  			} else {
  				BUG_ON(upper->eb != path->nodes[upper->level]);
  			}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2466

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2467
2468
  			upper->locked = 1;
  			path->locks[upper->level] = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2469

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2470
  			slot = path->slots[upper->level];
b3b4aa74b   David Sterba   btrfs: drop unuse...
2471
  			btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2472
2473
2474
2475
2476
2477
2478
  		} else {
  			ret = btrfs_bin_search(upper->eb, key, upper->level,
  					       &slot);
  			BUG_ON(ret);
  		}
  
  		bytenr = btrfs_node_blockptr(upper->eb, slot);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2479
2480
  		if (lowest) {
  			BUG_ON(bytenr != node->bytenr);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2481
  		} else {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2482
2483
  			if (node->eb->start == bytenr)
  				goto next;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2484
2485
2486
2487
2488
  		}
  
  		blocksize = btrfs_level_size(root, node->level);
  		generation = btrfs_node_ptr_generation(upper->eb, slot);
  		eb = read_tree_block(root, bytenr, blocksize, generation);
97d9a8a42   Tsutomu Itoh   Btrfs: check retu...
2489
2490
2491
2492
  		if (!eb) {
  			err = -EIO;
  			goto next;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2493
2494
2495
2496
2497
2498
  		btrfs_tree_lock(eb);
  		btrfs_set_lock_blocking(eb);
  
  		if (!node->eb) {
  			ret = btrfs_cow_block(trans, root, eb, upper->eb,
  					      slot, &eb);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2499
2500
  			btrfs_tree_unlock(eb);
  			free_extent_buffer(eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2501
2502
  			if (ret < 0) {
  				err = ret;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2503
  				goto next;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2504
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2505
  			BUG_ON(node->eb != eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
  		} else {
  			btrfs_set_node_blockptr(upper->eb, slot,
  						node->eb->start);
  			btrfs_set_node_ptr_generation(upper->eb, slot,
  						      trans->transid);
  			btrfs_mark_buffer_dirty(upper->eb);
  
  			ret = btrfs_inc_extent_ref(trans, root,
  						node->eb->start, blocksize,
  						upper->eb->start,
  						btrfs_header_owner(upper->eb),
  						node->level, 0);
  			BUG_ON(ret);
  
  			ret = btrfs_drop_subtree(trans, root, eb, upper->eb);
  			BUG_ON(ret);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2522
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2523
2524
2525
2526
2527
2528
2529
  next:
  		if (!upper->pending)
  			drop_node_buffer(upper);
  		else
  			unlock_node_buffer(upper);
  		if (err)
  			break;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2530
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2531
2532
2533
2534
2535
2536
  
  	if (!err && node->pending) {
  		drop_node_buffer(node);
  		list_move_tail(&node->list, &rc->backref_cache.changed);
  		node->pending = 0;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2537
  	path->lowest_level = 0;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2538
  	BUG_ON(err == -ENOSPC);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2539
2540
2541
2542
  	return err;
  }
  
  static int link_to_upper(struct btrfs_trans_handle *trans,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2543
  			 struct reloc_control *rc,
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2544
2545
2546
2547
  			 struct backref_node *node,
  			 struct btrfs_path *path)
  {
  	struct btrfs_key key;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2548
2549
  
  	btrfs_node_key_to_cpu(node->eb, &key, 0);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2550
  	return do_relocation(trans, rc, node, &key, path, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2551
2552
2553
  }
  
  static int finish_pending_nodes(struct btrfs_trans_handle *trans,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2554
2555
  				struct reloc_control *rc,
  				struct btrfs_path *path, int err)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2556
  {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2557
2558
  	LIST_HEAD(list);
  	struct backref_cache *cache = &rc->backref_cache;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2559
2560
2561
  	struct backref_node *node;
  	int level;
  	int ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2562
2563
2564
2565
  
  	for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
  		while (!list_empty(&cache->pending[level])) {
  			node = list_entry(cache->pending[level].next,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2566
2567
2568
  					  struct backref_node, list);
  			list_move_tail(&node->list, &list);
  			BUG_ON(!node->pending);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2569

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2570
2571
2572
2573
2574
  			if (!err) {
  				ret = link_to_upper(trans, rc, node, path);
  				if (ret < 0)
  					err = ret;
  			}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2575
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2576
  		list_splice_init(&list, &cache->pending[level]);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2577
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2578
2579
2580
2581
  	return err;
  }
  
  static void mark_block_processed(struct reloc_control *rc,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2582
2583
2584
2585
2586
2587
2588
2589
  				 u64 bytenr, u32 blocksize)
  {
  	set_extent_bits(&rc->processed_blocks, bytenr, bytenr + blocksize - 1,
  			EXTENT_DIRTY, GFP_NOFS);
  }
  
  static void __mark_block_processed(struct reloc_control *rc,
  				   struct backref_node *node)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2590
2591
2592
2593
2594
  {
  	u32 blocksize;
  	if (node->level == 0 ||
  	    in_block_group(node->bytenr, rc->block_group)) {
  		blocksize = btrfs_level_size(rc->extent_root, node->level);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2595
  		mark_block_processed(rc, node->bytenr, blocksize);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
  	}
  	node->processed = 1;
  }
  
  /*
   * mark a block and all blocks directly/indirectly reference the block
   * as processed.
   */
  static void update_processed_blocks(struct reloc_control *rc,
  				    struct backref_node *node)
  {
  	struct backref_node *next = node;
  	struct backref_edge *edge;
  	struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
  	int index = 0;
  
  	while (next) {
  		cond_resched();
  		while (1) {
  			if (next->processed)
  				break;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2617
  			__mark_block_processed(rc, next);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
  
  			if (list_empty(&next->upper))
  				break;
  
  			edge = list_entry(next->upper.next,
  					  struct backref_edge, list[LOWER]);
  			edges[index++] = edge;
  			next = edge->node[UPPER];
  		}
  		next = walk_down_backref(edges, &index);
  	}
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2630
2631
2632
2633
2634
2635
2636
  static int tree_block_processed(u64 bytenr, u32 blocksize,
  				struct reloc_control *rc)
  {
  	if (test_range_bit(&rc->processed_blocks, bytenr,
  			   bytenr + blocksize - 1, EXTENT_DIRTY, 1, NULL))
  		return 1;
  	return 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
  }
  
  static int get_tree_block_key(struct reloc_control *rc,
  			      struct tree_block *block)
  {
  	struct extent_buffer *eb;
  
  	BUG_ON(block->key_ready);
  	eb = read_tree_block(rc->extent_root, block->bytenr,
  			     block->key.objectid, block->key.offset);
97d9a8a42   Tsutomu Itoh   Btrfs: check retu...
2647
  	BUG_ON(!eb);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
  	WARN_ON(btrfs_header_level(eb) != block->level);
  	if (block->level == 0)
  		btrfs_item_key_to_cpu(eb, &block->key, 0);
  	else
  		btrfs_node_key_to_cpu(eb, &block->key, 0);
  	free_extent_buffer(eb);
  	block->key_ready = 1;
  	return 0;
  }
  
  static int reada_tree_block(struct reloc_control *rc,
  			    struct tree_block *block)
  {
  	BUG_ON(block->key_ready);
  	readahead_tree_block(rc->extent_root, block->bytenr,
  			     block->key.objectid, block->key.offset);
  	return 0;
  }
  
  /*
   * helper function to relocate a tree block
   */
  static int relocate_tree_block(struct btrfs_trans_handle *trans,
  				struct reloc_control *rc,
  				struct backref_node *node,
  				struct btrfs_key *key,
  				struct btrfs_path *path)
  {
  	struct btrfs_root *root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2677
2678
2679
2680
2681
  	int release = 0;
  	int ret = 0;
  
  	if (!node)
  		return 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2682

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2683
  	BUG_ON(node->processed);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2684
  	root = select_one_root(trans, node);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2685
  	if (root == ERR_PTR(-ENOENT)) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2686
  		update_processed_blocks(rc, node);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2687
  		goto out;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2688
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2689
2690
2691
  	if (!root || root->ref_cows) {
  		ret = reserve_metadata_space(trans, rc, node);
  		if (ret)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2692
  			goto out;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2693
  		release = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2694
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
  	if (root) {
  		if (root->ref_cows) {
  			BUG_ON(node->new_bytenr);
  			BUG_ON(!list_empty(&node->list));
  			btrfs_record_root_in_trans(trans, root);
  			root = root->reloc_root;
  			node->new_bytenr = root->node->start;
  			node->root = root;
  			list_add_tail(&node->list, &rc->backref_cache.changed);
  		} else {
  			path->lowest_level = node->level;
  			ret = btrfs_search_slot(trans, root, key, path, 0, 1);
b3b4aa74b   David Sterba   btrfs: drop unuse...
2707
  			btrfs_release_path(path);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2708
2709
2710
2711
2712
2713
2714
2715
  			if (ret > 0)
  				ret = 0;
  		}
  		if (!ret)
  			update_processed_blocks(rc, node);
  	} else {
  		ret = do_relocation(trans, rc, node, key, path, 1);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2716
  out:
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2717
2718
2719
2720
2721
  	if (ret || node->level == 0 || node->cowonly) {
  		if (release)
  			release_metadata_space(rc, node);
  		remove_backref_node(&rc->backref_cache, node);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
  	return ret;
  }
  
  /*
   * relocate a list of blocks
   */
  static noinline_for_stack
  int relocate_tree_blocks(struct btrfs_trans_handle *trans,
  			 struct reloc_control *rc, struct rb_root *blocks)
  {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2732
2733
2734
2735
  	struct backref_node *node;
  	struct btrfs_path *path;
  	struct tree_block *block;
  	struct rb_node *rb_node;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2736
2737
2738
2739
2740
2741
  	int ret;
  	int err = 0;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2742
2743
2744
  	rb_node = rb_first(blocks);
  	while (rb_node) {
  		block = rb_entry(rb_node, struct tree_block, rb_node);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
  		if (!block->key_ready)
  			reada_tree_block(rc, block);
  		rb_node = rb_next(rb_node);
  	}
  
  	rb_node = rb_first(blocks);
  	while (rb_node) {
  		block = rb_entry(rb_node, struct tree_block, rb_node);
  		if (!block->key_ready)
  			get_tree_block_key(rc, block);
  		rb_node = rb_next(rb_node);
  	}
  
  	rb_node = rb_first(blocks);
  	while (rb_node) {
  		block = rb_entry(rb_node, struct tree_block, rb_node);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2761
  		node = build_backref_tree(rc, &block->key,
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2762
2763
2764
2765
2766
2767
2768
2769
2770
  					  block->level, block->bytenr);
  		if (IS_ERR(node)) {
  			err = PTR_ERR(node);
  			goto out;
  		}
  
  		ret = relocate_tree_block(trans, rc, node, &block->key,
  					  path);
  		if (ret < 0) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2771
2772
  			if (ret != -EAGAIN || rb_node == rb_first(blocks))
  				err = ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2773
2774
  			goto out;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2775
2776
  		rb_node = rb_next(rb_node);
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2777
2778
  out:
  	free_block_list(blocks);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
2779
  	err = finish_pending_nodes(trans, rc, path, err);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2780

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2781
2782
2783
2784
2785
  	btrfs_free_path(path);
  	return err;
  }
  
  static noinline_for_stack
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
  int prealloc_file_extent_cluster(struct inode *inode,
  				 struct file_extent_cluster *cluster)
  {
  	u64 alloc_hint = 0;
  	u64 start;
  	u64 end;
  	u64 offset = BTRFS_I(inode)->index_cnt;
  	u64 num_bytes;
  	int nr = 0;
  	int ret = 0;
  
  	BUG_ON(cluster->start != cluster->boundary[0]);
  	mutex_lock(&inode->i_mutex);
  
  	ret = btrfs_check_data_free_space(inode, cluster->end +
  					  1 - cluster->start);
  	if (ret)
  		goto out;
  
  	while (nr < cluster->nr) {
  		start = cluster->boundary[nr] - offset;
  		if (nr + 1 < cluster->nr)
  			end = cluster->boundary[nr + 1] - 1 - offset;
  		else
  			end = cluster->end - offset;
  
  		lock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  		num_bytes = end + 1 - start;
  		ret = btrfs_prealloc_file_range(inode, 0, start,
  						num_bytes, num_bytes,
  						end + 1, &alloc_hint);
  		unlock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  		if (ret)
  			break;
  		nr++;
  	}
  	btrfs_free_reserved_data_space(inode, cluster->end +
  				       1 - cluster->start);
  out:
  	mutex_unlock(&inode->i_mutex);
  	return ret;
  }
  
  static noinline_for_stack
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2830
2831
2832
2833
2834
2835
2836
  int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
  			 u64 block_start)
  {
  	struct btrfs_root *root = BTRFS_I(inode)->root;
  	struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
  	struct extent_map *em;
  	int ret = 0;
172ddd60a   David Sterba   btrfs: drop gfp p...
2837
  	em = alloc_extent_map();
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
  	if (!em)
  		return -ENOMEM;
  
  	em->start = start;
  	em->len = end + 1 - start;
  	em->block_len = em->len;
  	em->block_start = block_start;
  	em->bdev = root->fs_info->fs_devices->latest_bdev;
  	set_bit(EXTENT_FLAG_PINNED, &em->flags);
  
  	lock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  	while (1) {
  		write_lock(&em_tree->lock);
  		ret = add_extent_mapping(em_tree, em);
  		write_unlock(&em_tree->lock);
  		if (ret != -EEXIST) {
  			free_extent_map(em);
  			break;
  		}
  		btrfs_drop_extent_cache(inode, start, end, 0);
  	}
  	unlock_extent(&BTRFS_I(inode)->io_tree, start, end, GFP_NOFS);
  	return ret;
  }
  
  static int relocate_file_extent_cluster(struct inode *inode,
  					struct file_extent_cluster *cluster)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2865
2866
2867
  {
  	u64 page_start;
  	u64 page_end;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2868
2869
  	u64 offset = BTRFS_I(inode)->index_cnt;
  	unsigned long index;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2870
  	unsigned long last_index;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2871
2872
  	struct page *page;
  	struct file_ra_state *ra;
3b16a4e3c   Josef Bacik   Btrfs: use the in...
2873
  	gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2874
  	int nr = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2875
  	int ret = 0;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2876
2877
  	if (!cluster->nr)
  		return 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2878
2879
2880
  	ra = kzalloc(sizeof(*ra), GFP_NOFS);
  	if (!ra)
  		return -ENOMEM;
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2881
2882
2883
  	ret = prealloc_file_extent_cluster(inode, cluster);
  	if (ret)
  		goto out;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2884

efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2885
  	file_ra_state_init(ra, inode->i_mapping);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2886

0257bb82d   Yan, Zheng   Btrfs: relocate f...
2887
2888
  	ret = setup_extent_mapping(inode, cluster->start - offset,
  				   cluster->end - offset, cluster->start);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2889
  	if (ret)
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2890
  		goto out;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2891

efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2892
2893
  	index = (cluster->start - offset) >> PAGE_CACHE_SHIFT;
  	last_index = (cluster->end - offset) >> PAGE_CACHE_SHIFT;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2894
  	while (index <= last_index) {
660d3f6cd   Josef Bacik   Btrfs: fix how we...
2895
  		mutex_lock(&inode->i_mutex);
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2896
  		ret = btrfs_delalloc_reserve_metadata(inode, PAGE_CACHE_SIZE);
660d3f6cd   Josef Bacik   Btrfs: fix how we...
2897
  		mutex_unlock(&inode->i_mutex);
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2898
2899
  		if (ret)
  			goto out;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2900
  		page = find_lock_page(inode->i_mapping, index);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2901
  		if (!page) {
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2902
2903
2904
  			page_cache_sync_readahead(inode->i_mapping,
  						  ra, NULL, index,
  						  last_index + 1 - index);
a94733d0b   Josef Bacik   Btrfs: use find_o...
2905
  			page = find_or_create_page(inode->i_mapping, index,
3b16a4e3c   Josef Bacik   Btrfs: use the in...
2906
  						   mask);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2907
  			if (!page) {
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2908
2909
  				btrfs_delalloc_release_metadata(inode,
  							PAGE_CACHE_SIZE);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2910
  				ret = -ENOMEM;
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2911
  				goto out;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2912
  			}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2913
  		}
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2914
2915
2916
2917
2918
2919
  
  		if (PageReadahead(page)) {
  			page_cache_async_readahead(inode->i_mapping,
  						   ra, NULL, page, index,
  						   last_index + 1 - index);
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2920
2921
2922
2923
2924
2925
  		if (!PageUptodate(page)) {
  			btrfs_readpage(NULL, page);
  			lock_page(page);
  			if (!PageUptodate(page)) {
  				unlock_page(page);
  				page_cache_release(page);
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2926
2927
  				btrfs_delalloc_release_metadata(inode,
  							PAGE_CACHE_SIZE);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2928
  				ret = -EIO;
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2929
  				goto out;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2930
2931
  			}
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2932
2933
2934
  
  		page_start = (u64)page->index << PAGE_CACHE_SHIFT;
  		page_end = page_start + PAGE_CACHE_SIZE - 1;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2935
2936
2937
  
  		lock_extent(&BTRFS_I(inode)->io_tree,
  			    page_start, page_end, GFP_NOFS);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2938
  		set_page_extent_mapped(page);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2939
2940
2941
2942
  		if (nr < cluster->nr &&
  		    page_start + offset == cluster->boundary[nr]) {
  			set_extent_bits(&BTRFS_I(inode)->io_tree,
  					page_start, page_end,
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2943
  					EXTENT_BOUNDARY, GFP_NOFS);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2944
2945
  			nr++;
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2946

efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2947
  		btrfs_set_extent_delalloc(inode, page_start, page_end, NULL);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2948
  		set_page_dirty(page);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2949

0257bb82d   Yan, Zheng   Btrfs: relocate f...
2950
2951
  		unlock_extent(&BTRFS_I(inode)->io_tree,
  			      page_start, page_end, GFP_NOFS);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2952
2953
  		unlock_page(page);
  		page_cache_release(page);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2954
2955
  
  		index++;
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2956
2957
  		balance_dirty_pages_ratelimited(inode->i_mapping);
  		btrfs_throttle(BTRFS_I(inode)->root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2958
  	}
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2959
  	WARN_ON(nr != cluster->nr);
efa564645   Yan, Zheng   Btrfs: Pre-alloca...
2960
  out:
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2961
  	kfree(ra);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2962
2963
2964
2965
  	return ret;
  }
  
  static noinline_for_stack
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2966
2967
  int relocate_data_extent(struct inode *inode, struct btrfs_key *extent_key,
  			 struct file_extent_cluster *cluster)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2968
  {
0257bb82d   Yan, Zheng   Btrfs: relocate f...
2969
  	int ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2970

0257bb82d   Yan, Zheng   Btrfs: relocate f...
2971
2972
2973
2974
2975
  	if (cluster->nr > 0 && extent_key->objectid != cluster->end + 1) {
  		ret = relocate_file_extent_cluster(inode, cluster);
  		if (ret)
  			return ret;
  		cluster->nr = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2976
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2977

0257bb82d   Yan, Zheng   Btrfs: relocate f...
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
  	if (!cluster->nr)
  		cluster->start = extent_key->objectid;
  	else
  		BUG_ON(cluster->nr >= MAX_EXTENTS);
  	cluster->end = extent_key->objectid + extent_key->offset - 1;
  	cluster->boundary[cluster->nr] = extent_key->objectid;
  	cluster->nr++;
  
  	if (cluster->nr >= MAX_EXTENTS) {
  		ret = relocate_file_extent_cluster(inode, cluster);
  		if (ret)
  			return ret;
  		cluster->nr = 0;
  	}
  	return 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
  }
  
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  static int get_ref_objectid_v0(struct reloc_control *rc,
  			       struct btrfs_path *path,
  			       struct btrfs_key *extent_key,
  			       u64 *ref_objectid, int *path_change)
  {
  	struct btrfs_key key;
  	struct extent_buffer *leaf;
  	struct btrfs_extent_ref_v0 *ref0;
  	int ret;
  	int slot;
  
  	leaf = path->nodes[0];
  	slot = path->slots[0];
  	while (1) {
  		if (slot >= btrfs_header_nritems(leaf)) {
  			ret = btrfs_next_leaf(rc->extent_root, path);
  			if (ret < 0)
  				return ret;
  			BUG_ON(ret > 0);
  			leaf = path->nodes[0];
  			slot = path->slots[0];
  			if (path_change)
  				*path_change = 1;
  		}
  		btrfs_item_key_to_cpu(leaf, &key, slot);
  		if (key.objectid != extent_key->objectid)
  			return -ENOENT;
  
  		if (key.type != BTRFS_EXTENT_REF_V0_KEY) {
  			slot++;
  			continue;
  		}
  		ref0 = btrfs_item_ptr(leaf, slot,
  				struct btrfs_extent_ref_v0);
  		*ref_objectid = btrfs_ref_objectid_v0(leaf, ref0);
  		break;
  	}
  	return 0;
  }
  #endif
  
  /*
   * helper to add a tree block to the list.
   * the major work is getting the generation and level of the block
   */
  static int add_tree_block(struct reloc_control *rc,
  			  struct btrfs_key *extent_key,
  			  struct btrfs_path *path,
  			  struct rb_root *blocks)
  {
  	struct extent_buffer *eb;
  	struct btrfs_extent_item *ei;
  	struct btrfs_tree_block_info *bi;
  	struct tree_block *block;
  	struct rb_node *rb_node;
  	u32 item_size;
  	int level = -1;
  	int generation;
  
  	eb =  path->nodes[0];
  	item_size = btrfs_item_size_nr(eb, path->slots[0]);
  
  	if (item_size >= sizeof(*ei) + sizeof(*bi)) {
  		ei = btrfs_item_ptr(eb, path->slots[0],
  				struct btrfs_extent_item);
  		bi = (struct btrfs_tree_block_info *)(ei + 1);
  		generation = btrfs_extent_generation(eb, ei);
  		level = btrfs_tree_block_level(eb, bi);
  	} else {
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  		u64 ref_owner;
  		int ret;
  
  		BUG_ON(item_size != sizeof(struct btrfs_extent_item_v0));
  		ret = get_ref_objectid_v0(rc, path, extent_key,
  					  &ref_owner, NULL);
411fc6bce   Andi Kleen   Btrfs: Fix variab...
3072
3073
  		if (ret < 0)
  			return ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3074
3075
3076
3077
3078
3079
3080
3081
  		BUG_ON(ref_owner >= BTRFS_MAX_LEVEL);
  		level = (int)ref_owner;
  		/* FIXME: get real generation */
  		generation = 0;
  #else
  		BUG();
  #endif
  	}
b3b4aa74b   David Sterba   btrfs: drop unuse...
3082
  	btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
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
  
  	BUG_ON(level == -1);
  
  	block = kmalloc(sizeof(*block), GFP_NOFS);
  	if (!block)
  		return -ENOMEM;
  
  	block->bytenr = extent_key->objectid;
  	block->key.objectid = extent_key->offset;
  	block->key.offset = generation;
  	block->level = level;
  	block->key_ready = 0;
  
  	rb_node = tree_insert(blocks, block->bytenr, &block->rb_node);
  	BUG_ON(rb_node);
  
  	return 0;
  }
  
  /*
   * helper to add tree blocks for backref of type BTRFS_SHARED_DATA_REF_KEY
   */
  static int __add_tree_block(struct reloc_control *rc,
  			    u64 bytenr, u32 blocksize,
  			    struct rb_root *blocks)
  {
  	struct btrfs_path *path;
  	struct btrfs_key key;
  	int ret;
  
  	if (tree_block_processed(bytenr, blocksize, rc))
  		return 0;
  
  	if (tree_search(blocks, bytenr))
  		return 0;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
  
  	key.objectid = bytenr;
  	key.type = BTRFS_EXTENT_ITEM_KEY;
  	key.offset = blocksize;
  
  	path->search_commit_root = 1;
  	path->skip_locking = 1;
  	ret = btrfs_search_slot(NULL, rc->extent_root, &key, path, 0, 0);
  	if (ret < 0)
  		goto out;
  	BUG_ON(ret);
  
  	btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
  	ret = add_tree_block(rc, &key, path, blocks);
  out:
  	btrfs_free_path(path);
  	return ret;
  }
  
  /*
   * helper to check if the block use full backrefs for pointers in it
   */
  static int block_use_full_backref(struct reloc_control *rc,
  				  struct extent_buffer *eb)
  {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3147
3148
3149
3150
3151
3152
  	u64 flags;
  	int ret;
  
  	if (btrfs_header_flag(eb, BTRFS_HEADER_FLAG_RELOC) ||
  	    btrfs_header_backref_rev(eb) < BTRFS_MIXED_BACKREF_REV)
  		return 1;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3153
3154
  	ret = btrfs_lookup_extent_info(NULL, rc->extent_root,
  				       eb->start, eb->len, NULL, &flags);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3155
  	BUG_ON(ret);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3156
3157
3158
3159
  	if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
  		ret = 1;
  	else
  		ret = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3160
3161
  	return ret;
  }
0af3d00ba   Josef Bacik   Btrfs: create spe...
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
  static int delete_block_group_cache(struct btrfs_fs_info *fs_info,
  				    struct inode *inode, u64 ino)
  {
  	struct btrfs_key key;
  	struct btrfs_path *path;
  	struct btrfs_root *root = fs_info->tree_root;
  	struct btrfs_trans_handle *trans;
  	unsigned long nr;
  	int ret = 0;
  
  	if (inode)
  		goto truncate;
  
  	key.objectid = ino;
  	key.type = BTRFS_INODE_ITEM_KEY;
  	key.offset = 0;
  
  	inode = btrfs_iget(fs_info->sb, &key, root, NULL);
c704005d8   David Sterba   btrfs: unify chec...
3180
  	if (IS_ERR_OR_NULL(inode) || is_bad_inode(inode)) {
0af3d00ba   Josef Bacik   Btrfs: create spe...
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
  		if (inode && !IS_ERR(inode))
  			iput(inode);
  		return -ENOENT;
  	}
  
  truncate:
  	path = btrfs_alloc_path();
  	if (!path) {
  		ret = -ENOMEM;
  		goto out;
  	}
7a7eaa40a   Josef Bacik   Btrfs: take away ...
3192
  	trans = btrfs_join_transaction(root);
0af3d00ba   Josef Bacik   Btrfs: create spe...
3193
3194
  	if (IS_ERR(trans)) {
  		btrfs_free_path(path);
3612b4959   Tsutomu Itoh   btrfs: fix return...
3195
  		ret = PTR_ERR(trans);
0af3d00ba   Josef Bacik   Btrfs: create spe...
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
  		goto out;
  	}
  
  	ret = btrfs_truncate_free_space_cache(root, trans, path, inode);
  
  	btrfs_free_path(path);
  	nr = trans->blocks_used;
  	btrfs_end_transaction(trans, root);
  	btrfs_btree_balance_dirty(root, nr);
  out:
  	iput(inode);
  	return ret;
  }
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
  /*
   * helper to add tree blocks for backref of type BTRFS_EXTENT_DATA_REF_KEY
   * this function scans fs tree to find blocks reference the data extent
   */
  static int find_data_references(struct reloc_control *rc,
  				struct btrfs_key *extent_key,
  				struct extent_buffer *leaf,
  				struct btrfs_extent_data_ref *ref,
  				struct rb_root *blocks)
  {
  	struct btrfs_path *path;
  	struct tree_block *block;
  	struct btrfs_root *root;
  	struct btrfs_file_extent_item *fi;
  	struct rb_node *rb_node;
  	struct btrfs_key key;
  	u64 ref_root;
  	u64 ref_objectid;
  	u64 ref_offset;
  	u32 ref_count;
  	u32 nritems;
  	int err = 0;
  	int added = 0;
  	int counted;
  	int ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3234
3235
3236
3237
  	ref_root = btrfs_extent_data_ref_root(leaf, ref);
  	ref_objectid = btrfs_extent_data_ref_objectid(leaf, ref);
  	ref_offset = btrfs_extent_data_ref_offset(leaf, ref);
  	ref_count = btrfs_extent_data_ref_count(leaf, ref);
0af3d00ba   Josef Bacik   Btrfs: create spe...
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
  	/*
  	 * This is an extent belonging to the free space cache, lets just delete
  	 * it and redo the search.
  	 */
  	if (ref_root == BTRFS_ROOT_TREE_OBJECTID) {
  		ret = delete_block_group_cache(rc->extent_root->fs_info,
  					       NULL, ref_objectid);
  		if (ret != -ENOENT)
  			return ret;
  		ret = 0;
  	}
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
026fd3178   Josef Bacik   Btrfs: don't alwa...
3253
  	path->reada = 1;
0af3d00ba   Josef Bacik   Btrfs: create spe...
3254

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3255
3256
3257
3258
3259
3260
3261
  	root = read_fs_root(rc->extent_root->fs_info, ref_root);
  	if (IS_ERR(root)) {
  		err = PTR_ERR(root);
  		goto out;
  	}
  
  	key.objectid = ref_objectid;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3262
  	key.type = BTRFS_EXTENT_DATA_KEY;
84850e8d8   Yan, Zheng   btrfs: check file...
3263
3264
3265
3266
  	if (ref_offset > ((u64)-1 << 32))
  		key.offset = 0;
  	else
  		key.offset = ref_offset;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
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
  
  	path->search_commit_root = 1;
  	path->skip_locking = 1;
  	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
  	if (ret < 0) {
  		err = ret;
  		goto out;
  	}
  
  	leaf = path->nodes[0];
  	nritems = btrfs_header_nritems(leaf);
  	/*
  	 * the references in tree blocks that use full backrefs
  	 * are not counted in
  	 */
  	if (block_use_full_backref(rc, leaf))
  		counted = 0;
  	else
  		counted = 1;
  	rb_node = tree_search(blocks, leaf->start);
  	if (rb_node) {
  		if (counted)
  			added = 1;
  		else
  			path->slots[0] = nritems;
  	}
  
  	while (ref_count > 0) {
  		while (path->slots[0] >= nritems) {
  			ret = btrfs_next_leaf(root, path);
  			if (ret < 0) {
  				err = ret;
  				goto out;
  			}
  			if (ret > 0) {
  				WARN_ON(1);
  				goto out;
  			}
  
  			leaf = path->nodes[0];
  			nritems = btrfs_header_nritems(leaf);
  			added = 0;
  
  			if (block_use_full_backref(rc, leaf))
  				counted = 0;
  			else
  				counted = 1;
  			rb_node = tree_search(blocks, leaf->start);
  			if (rb_node) {
  				if (counted)
  					added = 1;
  				else
  					path->slots[0] = nritems;
  			}
  		}
  
  		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
  		if (key.objectid != ref_objectid ||
  		    key.type != BTRFS_EXTENT_DATA_KEY) {
  			WARN_ON(1);
  			break;
  		}
  
  		fi = btrfs_item_ptr(leaf, path->slots[0],
  				    struct btrfs_file_extent_item);
  
  		if (btrfs_file_extent_type(leaf, fi) ==
  		    BTRFS_FILE_EXTENT_INLINE)
  			goto next;
  
  		if (btrfs_file_extent_disk_bytenr(leaf, fi) !=
  		    extent_key->objectid)
  			goto next;
  
  		key.offset -= btrfs_file_extent_offset(leaf, fi);
  		if (key.offset != ref_offset)
  			goto next;
  
  		if (counted)
  			ref_count--;
  		if (added)
  			goto next;
  
  		if (!tree_block_processed(leaf->start, leaf->len, rc)) {
  			block = kmalloc(sizeof(*block), GFP_NOFS);
  			if (!block) {
  				err = -ENOMEM;
  				break;
  			}
  			block->bytenr = leaf->start;
  			btrfs_item_key_to_cpu(leaf, &block->key, 0);
  			block->level = 0;
  			block->key_ready = 1;
  			rb_node = tree_insert(blocks, block->bytenr,
  					      &block->rb_node);
  			BUG_ON(rb_node);
  		}
  		if (counted)
  			added = 1;
  		else
  			path->slots[0] = nritems;
  next:
  		path->slots[0]++;
  
  	}
  out:
  	btrfs_free_path(path);
  	return err;
  }
  
  /*
   * hepler to find all tree blocks that reference a given data extent
   */
  static noinline_for_stack
  int add_data_references(struct reloc_control *rc,
  			struct btrfs_key *extent_key,
  			struct btrfs_path *path,
  			struct rb_root *blocks)
  {
  	struct btrfs_key key;
  	struct extent_buffer *eb;
  	struct btrfs_extent_data_ref *dref;
  	struct btrfs_extent_inline_ref *iref;
  	unsigned long ptr;
  	unsigned long end;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3392
  	u32 blocksize = btrfs_level_size(rc->extent_root, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3393
3394
  	int ret;
  	int err = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
  	eb = path->nodes[0];
  	ptr = btrfs_item_ptr_offset(eb, path->slots[0]);
  	end = ptr + btrfs_item_size_nr(eb, path->slots[0]);
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  	if (ptr + sizeof(struct btrfs_extent_item_v0) == end)
  		ptr = end;
  	else
  #endif
  		ptr += sizeof(struct btrfs_extent_item);
  
  	while (ptr < end) {
  		iref = (struct btrfs_extent_inline_ref *)ptr;
  		key.type = btrfs_extent_inline_ref_type(eb, iref);
  		if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
  			key.offset = btrfs_extent_inline_ref_offset(eb, iref);
  			ret = __add_tree_block(rc, key.offset, blocksize,
  					       blocks);
  		} else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
  			dref = (struct btrfs_extent_data_ref *)(&iref->offset);
  			ret = find_data_references(rc, extent_key,
  						   eb, dref, blocks);
  		} else {
  			BUG();
  		}
  		ptr += btrfs_extent_inline_ref_size(key.type);
  	}
  	WARN_ON(ptr > end);
  
  	while (1) {
  		cond_resched();
  		eb = path->nodes[0];
  		if (path->slots[0] >= btrfs_header_nritems(eb)) {
  			ret = btrfs_next_leaf(rc->extent_root, path);
  			if (ret < 0) {
  				err = ret;
  				break;
  			}
  			if (ret > 0)
  				break;
  			eb = path->nodes[0];
  		}
  
  		btrfs_item_key_to_cpu(eb, &key, path->slots[0]);
  		if (key.objectid != extent_key->objectid)
  			break;
  
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  		if (key.type == BTRFS_SHARED_DATA_REF_KEY ||
  		    key.type == BTRFS_EXTENT_REF_V0_KEY) {
  #else
  		BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
  		if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
  #endif
  			ret = __add_tree_block(rc, key.offset, blocksize,
  					       blocks);
  		} else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
  			dref = btrfs_item_ptr(eb, path->slots[0],
  					      struct btrfs_extent_data_ref);
  			ret = find_data_references(rc, extent_key,
  						   eb, dref, blocks);
  		} else {
  			ret = 0;
  		}
  		if (ret) {
  			err = ret;
  			break;
  		}
  		path->slots[0]++;
  	}
b3b4aa74b   David Sterba   btrfs: drop unuse...
3464
  	btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
  	if (err)
  		free_block_list(blocks);
  	return err;
  }
  
  /*
   * hepler to find next unprocessed extent
   */
  static noinline_for_stack
  int find_next_extent(struct btrfs_trans_handle *trans,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3475
3476
  		     struct reloc_control *rc, struct btrfs_path *path,
  		     struct btrfs_key *extent_key)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
  {
  	struct btrfs_key key;
  	struct extent_buffer *leaf;
  	u64 start, end, last;
  	int ret;
  
  	last = rc->block_group->key.objectid + rc->block_group->key.offset;
  	while (1) {
  		cond_resched();
  		if (rc->search_start >= last) {
  			ret = 1;
  			break;
  		}
  
  		key.objectid = rc->search_start;
  		key.type = BTRFS_EXTENT_ITEM_KEY;
  		key.offset = 0;
  
  		path->search_commit_root = 1;
  		path->skip_locking = 1;
  		ret = btrfs_search_slot(NULL, rc->extent_root, &key, path,
  					0, 0);
  		if (ret < 0)
  			break;
  next:
  		leaf = path->nodes[0];
  		if (path->slots[0] >= btrfs_header_nritems(leaf)) {
  			ret = btrfs_next_leaf(rc->extent_root, path);
  			if (ret != 0)
  				break;
  			leaf = path->nodes[0];
  		}
  
  		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
  		if (key.objectid >= last) {
  			ret = 1;
  			break;
  		}
  
  		if (key.type != BTRFS_EXTENT_ITEM_KEY ||
  		    key.objectid + key.offset <= rc->search_start) {
  			path->slots[0]++;
  			goto next;
  		}
  
  		ret = find_first_extent_bit(&rc->processed_blocks,
  					    key.objectid, &start, &end,
  					    EXTENT_DIRTY);
  
  		if (ret == 0 && start <= key.objectid) {
b3b4aa74b   David Sterba   btrfs: drop unuse...
3527
  			btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3528
3529
3530
  			rc->search_start = end + 1;
  		} else {
  			rc->search_start = key.objectid + key.offset;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3531
  			memcpy(extent_key, &key, sizeof(key));
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3532
3533
3534
  			return 0;
  		}
  	}
b3b4aa74b   David Sterba   btrfs: drop unuse...
3535
  	btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3536
3537
3538
3539
3540
3541
  	return ret;
  }
  
  static void set_reloc_control(struct reloc_control *rc)
  {
  	struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
7585717f3   Chris Mason   Btrfs: fix reloca...
3542
3543
  
  	mutex_lock(&fs_info->reloc_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3544
  	fs_info->reloc_ctl = rc;
7585717f3   Chris Mason   Btrfs: fix reloca...
3545
  	mutex_unlock(&fs_info->reloc_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3546
3547
3548
3549
3550
  }
  
  static void unset_reloc_control(struct reloc_control *rc)
  {
  	struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
7585717f3   Chris Mason   Btrfs: fix reloca...
3551
3552
  
  	mutex_lock(&fs_info->reloc_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3553
  	fs_info->reloc_ctl = NULL;
7585717f3   Chris Mason   Btrfs: fix reloca...
3554
  	mutex_unlock(&fs_info->reloc_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
  }
  
  static int check_extent_flags(u64 flags)
  {
  	if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
  	    (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
  		return 1;
  	if (!(flags & BTRFS_EXTENT_FLAG_DATA) &&
  	    !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
  		return 1;
  	if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
  	    (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF))
  		return 1;
  	return 0;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
  static noinline_for_stack
  int prepare_to_relocate(struct reloc_control *rc)
  {
  	struct btrfs_trans_handle *trans;
  	int ret;
  
  	rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root);
  	if (!rc->block_rsv)
  		return -ENOMEM;
  
  	/*
  	 * reserve some space for creating reloc trees.
  	 * btrfs_init_reloc_root will use them when there
  	 * is no reservation in transaction handle.
  	 */
4a92b1b8d   Josef Bacik   Btrfs: stop passi...
3585
  	ret = btrfs_block_rsv_add(rc->extent_root, rc->block_rsv,
8bb8ab2e9   Josef Bacik   Btrfs: rework how...
3586
  				  rc->extent_root->nodesize * 256);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3587
3588
  	if (ret)
  		return ret;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3589
3590
3591
3592
3593
  	memset(&rc->cluster, 0, sizeof(rc->cluster));
  	rc->search_start = rc->block_group->key.objectid;
  	rc->extents_found = 0;
  	rc->nodes_relocated = 0;
  	rc->merging_rsv_size = 0;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3594
3595
3596
  
  	rc->create_reloc_tree = 1;
  	set_reloc_control(rc);
7a7eaa40a   Josef Bacik   Btrfs: take away ...
3597
  	trans = btrfs_join_transaction(rc->extent_root);
3612b4959   Tsutomu Itoh   btrfs: fix return...
3598
  	BUG_ON(IS_ERR(trans));
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3599
3600
3601
  	btrfs_commit_transaction(trans, rc->extent_root);
  	return 0;
  }
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
3602

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
  static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
  {
  	struct rb_root blocks = RB_ROOT;
  	struct btrfs_key key;
  	struct btrfs_trans_handle *trans = NULL;
  	struct btrfs_path *path;
  	struct btrfs_extent_item *ei;
  	unsigned long nr;
  	u64 flags;
  	u32 item_size;
  	int ret;
  	int err = 0;
c87f08ca4   Chris Mason   Btrfs: allow bala...
3615
  	int progress = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3616
3617
  
  	path = btrfs_alloc_path();
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3618
  	if (!path)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3619
  		return -ENOMEM;
026fd3178   Josef Bacik   Btrfs: don't alwa...
3620
  	path->reada = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3621

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3622
3623
3624
3625
3626
  	ret = prepare_to_relocate(rc);
  	if (ret) {
  		err = ret;
  		goto out_free;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3627
3628
  
  	while (1) {
c87f08ca4   Chris Mason   Btrfs: allow bala...
3629
  		progress++;
a22285a6a   Yan, Zheng   Btrfs: Integrate ...
3630
  		trans = btrfs_start_transaction(rc->extent_root, 0);
98d5dc13e   Tsutomu Itoh   btrfs: fix return...
3631
  		BUG_ON(IS_ERR(trans));
c87f08ca4   Chris Mason   Btrfs: allow bala...
3632
  restart:
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3633
3634
3635
3636
3637
3638
  		if (update_backref_cache(trans, &rc->backref_cache)) {
  			btrfs_end_transaction(trans, rc->extent_root);
  			continue;
  		}
  
  		ret = find_next_extent(trans, rc, path, &key);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3639
3640
3641
3642
3643
3644
3645
3646
3647
  		if (ret < 0)
  			err = ret;
  		if (ret != 0)
  			break;
  
  		rc->extents_found++;
  
  		ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
  				    struct btrfs_extent_item);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3648
  		item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
  		if (item_size >= sizeof(*ei)) {
  			flags = btrfs_extent_flags(path->nodes[0], ei);
  			ret = check_extent_flags(flags);
  			BUG_ON(ret);
  
  		} else {
  #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
  			u64 ref_owner;
  			int path_change = 0;
  
  			BUG_ON(item_size !=
  			       sizeof(struct btrfs_extent_item_v0));
  			ret = get_ref_objectid_v0(rc, path, &key, &ref_owner,
  						  &path_change);
  			if (ref_owner < BTRFS_FIRST_FREE_OBJECTID)
  				flags = BTRFS_EXTENT_FLAG_TREE_BLOCK;
  			else
  				flags = BTRFS_EXTENT_FLAG_DATA;
  
  			if (path_change) {
b3b4aa74b   David Sterba   btrfs: drop unuse...
3669
  				btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
  
  				path->search_commit_root = 1;
  				path->skip_locking = 1;
  				ret = btrfs_search_slot(NULL, rc->extent_root,
  							&key, path, 0, 0);
  				if (ret < 0) {
  					err = ret;
  					break;
  				}
  				BUG_ON(ret > 0);
  			}
  #else
  			BUG();
  #endif
  		}
  
  		if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
  			ret = add_tree_block(rc, &key, path, &blocks);
  		} else if (rc->stage == UPDATE_DATA_PTRS &&
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3689
  			   (flags & BTRFS_EXTENT_FLAG_DATA)) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3690
3691
  			ret = add_data_references(rc, &key, path, &blocks);
  		} else {
b3b4aa74b   David Sterba   btrfs: drop unuse...
3692
  			btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3693
3694
3695
  			ret = 0;
  		}
  		if (ret < 0) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3696
  			err = ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3697
3698
3699
3700
3701
3702
  			break;
  		}
  
  		if (!RB_EMPTY_ROOT(&blocks)) {
  			ret = relocate_tree_blocks(trans, rc, &blocks);
  			if (ret < 0) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3703
3704
3705
3706
3707
3708
3709
3710
  				if (ret != -EAGAIN) {
  					err = ret;
  					break;
  				}
  				rc->extents_found--;
  				rc->search_start = key.objectid;
  			}
  		}
36ba022ac   Josef Bacik   Btrfs: seperate o...
3711
  		ret = btrfs_block_rsv_check(rc->extent_root, rc->block_rsv, 5);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3712
3713
  		if (ret < 0) {
  			if (ret != -EAGAIN) {
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3714
  				err = ret;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3715
  				WARN_ON(1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3716
3717
  				break;
  			}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3718
  			rc->commit_transaction = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3719
  		}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3720
3721
3722
3723
3724
3725
3726
3727
3728
  		if (rc->commit_transaction) {
  			rc->commit_transaction = 0;
  			ret = btrfs_commit_transaction(trans, rc->extent_root);
  			BUG_ON(ret);
  		} else {
  			nr = trans->blocks_used;
  			btrfs_end_transaction_throttle(trans, rc->extent_root);
  			btrfs_btree_balance_dirty(rc->extent_root, nr);
  		}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3729
  		trans = NULL;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3730
3731
3732
3733
  
  		if (rc->stage == MOVE_DATA_EXTENTS &&
  		    (flags & BTRFS_EXTENT_FLAG_DATA)) {
  			rc->found_file_extent = 1;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3734
  			ret = relocate_data_extent(rc->data_inode,
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3735
  						   &key, &rc->cluster);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3736
3737
3738
3739
3740
3741
  			if (ret < 0) {
  				err = ret;
  				break;
  			}
  		}
  	}
c87f08ca4   Chris Mason   Btrfs: allow bala...
3742
3743
3744
3745
3746
3747
3748
3749
3750
  	if (trans && progress && err == -ENOSPC) {
  		ret = btrfs_force_chunk_alloc(trans, rc->extent_root,
  					      rc->block_group->flags);
  		if (ret == 0) {
  			err = 0;
  			progress = 0;
  			goto restart;
  		}
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3751

b3b4aa74b   David Sterba   btrfs: drop unuse...
3752
  	btrfs_release_path(path);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3753
3754
  	clear_extent_bits(&rc->processed_blocks, 0, (u64)-1, EXTENT_DIRTY,
  			  GFP_NOFS);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3755
3756
3757
  
  	if (trans) {
  		nr = trans->blocks_used;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3758
  		btrfs_end_transaction_throttle(trans, rc->extent_root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3759
3760
  		btrfs_btree_balance_dirty(rc->extent_root, nr);
  	}
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3761
  	if (!err) {
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3762
3763
  		ret = relocate_file_extent_cluster(rc->data_inode,
  						   &rc->cluster);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3764
3765
3766
  		if (ret < 0)
  			err = ret;
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3767
3768
  	rc->create_reloc_tree = 0;
  	set_reloc_control(rc);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3769

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3770
3771
  	backref_cache_cleanup(&rc->backref_cache);
  	btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3772

3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3773
  	err = prepare_to_merge(rc, err);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3774
3775
  
  	merge_reloc_roots(rc);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3776
  	rc->merge_reloc_tree = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3777
  	unset_reloc_control(rc);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3778
  	btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3779
3780
  
  	/* get rid of pinned extents */
7a7eaa40a   Josef Bacik   Btrfs: take away ...
3781
  	trans = btrfs_join_transaction(rc->extent_root);
3612b4959   Tsutomu Itoh   btrfs: fix return...
3782
3783
3784
3785
  	if (IS_ERR(trans))
  		err = PTR_ERR(trans);
  	else
  		btrfs_commit_transaction(trans, rc->extent_root);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3786
3787
3788
  out_free:
  	btrfs_free_block_rsv(rc->extent_root, rc->block_rsv);
  	btrfs_free_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3789
3790
3791
3792
  	return err;
  }
  
  static int __insert_orphan_inode(struct btrfs_trans_handle *trans,
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3793
  				 struct btrfs_root *root, u64 objectid)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
  {
  	struct btrfs_path *path;
  	struct btrfs_inode_item *item;
  	struct extent_buffer *leaf;
  	int ret;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
  
  	ret = btrfs_insert_empty_inode(trans, root, path, objectid);
  	if (ret)
  		goto out;
  
  	leaf = path->nodes[0];
  	item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item);
  	memset_extent_buffer(leaf, 0, (unsigned long)item, sizeof(*item));
  	btrfs_set_inode_generation(leaf, item, 1);
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3812
  	btrfs_set_inode_size(leaf, item, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3813
  	btrfs_set_inode_mode(leaf, item, S_IFREG | 0600);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3814
3815
  	btrfs_set_inode_flags(leaf, item, BTRFS_INODE_NOCOMPRESS |
  					  BTRFS_INODE_PREALLOC);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3816
  	btrfs_mark_buffer_dirty(leaf);
b3b4aa74b   David Sterba   btrfs: drop unuse...
3817
  	btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3818
3819
3820
3821
3822
3823
3824
3825
3826
  out:
  	btrfs_free_path(path);
  	return ret;
  }
  
  /*
   * helper to create inode for data relocation.
   * the inode is in data relocation tree and its link count is 0
   */
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3827
3828
3829
  static noinline_for_stack
  struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,
  				 struct btrfs_block_group_cache *group)
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
  {
  	struct inode *inode = NULL;
  	struct btrfs_trans_handle *trans;
  	struct btrfs_root *root;
  	struct btrfs_key key;
  	unsigned long nr;
  	u64 objectid = BTRFS_FIRST_FREE_OBJECTID;
  	int err = 0;
  
  	root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID);
  	if (IS_ERR(root))
  		return ERR_CAST(root);
a22285a6a   Yan, Zheng   Btrfs: Integrate ...
3842
  	trans = btrfs_start_transaction(root, 6);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3843
3844
  	if (IS_ERR(trans))
  		return ERR_CAST(trans);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3845

581bb0509   Li Zefan   Btrfs: Cache free...
3846
  	err = btrfs_find_free_objectid(root, &objectid);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3847
3848
  	if (err)
  		goto out;
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3849
  	err = __insert_orphan_inode(trans, root, objectid);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3850
3851
3852
3853
3854
  	BUG_ON(err);
  
  	key.objectid = objectid;
  	key.type = BTRFS_INODE_ITEM_KEY;
  	key.offset = 0;
73f73415c   Josef Bacik   Btrfs: change how...
3855
  	inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3856
3857
3858
3859
3860
3861
3862
  	BUG_ON(IS_ERR(inode) || is_bad_inode(inode));
  	BTRFS_I(inode)->index_cnt = group->key.objectid;
  
  	err = btrfs_orphan_add(trans, inode);
  out:
  	nr = trans->blocks_used;
  	btrfs_end_transaction(trans, root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3863
3864
3865
3866
3867
3868
3869
3870
  	btrfs_btree_balance_dirty(root, nr);
  	if (err) {
  		if (inode)
  			iput(inode);
  		inode = ERR_PTR(err);
  	}
  	return inode;
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
  static struct reloc_control *alloc_reloc_control(void)
  {
  	struct reloc_control *rc;
  
  	rc = kzalloc(sizeof(*rc), GFP_NOFS);
  	if (!rc)
  		return NULL;
  
  	INIT_LIST_HEAD(&rc->reloc_roots);
  	backref_cache_init(&rc->backref_cache);
  	mapping_tree_init(&rc->reloc_root_tree);
f993c883a   David Sterba   btrfs: drop unuse...
3882
  	extent_io_tree_init(&rc->processed_blocks, NULL);
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3883
3884
  	return rc;
  }
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3885
3886
3887
3888
3889
3890
3891
  /*
   * function to relocate all extents in a block group.
   */
  int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)
  {
  	struct btrfs_fs_info *fs_info = extent_root->fs_info;
  	struct reloc_control *rc;
0af3d00ba   Josef Bacik   Btrfs: create spe...
3892
3893
  	struct inode *inode;
  	struct btrfs_path *path;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3894
  	int ret;
f0486c68e   Yan, Zheng   Btrfs: Introduce ...
3895
  	int rw = 0;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3896
  	int err = 0;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3897
  	rc = alloc_reloc_control();
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3898
3899
  	if (!rc)
  		return -ENOMEM;
f0486c68e   Yan, Zheng   Btrfs: Introduce ...
3900
  	rc->extent_root = extent_root;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3901

5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3902
3903
  	rc->block_group = btrfs_lookup_block_group(fs_info, group_start);
  	BUG_ON(!rc->block_group);
f0486c68e   Yan, Zheng   Btrfs: Introduce ...
3904
3905
3906
3907
3908
3909
3910
3911
  	if (!rc->block_group->ro) {
  		ret = btrfs_set_block_group_ro(extent_root, rc->block_group);
  		if (ret) {
  			err = ret;
  			goto out;
  		}
  		rw = 1;
  	}
0af3d00ba   Josef Bacik   Btrfs: create spe...
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
  	path = btrfs_alloc_path();
  	if (!path) {
  		err = -ENOMEM;
  		goto out;
  	}
  
  	inode = lookup_free_space_inode(fs_info->tree_root, rc->block_group,
  					path);
  	btrfs_free_path(path);
  
  	if (!IS_ERR(inode))
  		ret = delete_block_group_cache(fs_info, inode, 0);
  	else
  		ret = PTR_ERR(inode);
  
  	if (ret && ret != -ENOENT) {
  		err = ret;
  		goto out;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
  	rc->data_inode = create_reloc_inode(fs_info, rc->block_group);
  	if (IS_ERR(rc->data_inode)) {
  		err = PTR_ERR(rc->data_inode);
  		rc->data_inode = NULL;
  		goto out;
  	}
  
  	printk(KERN_INFO "btrfs: relocating block group %llu flags %llu
  ",
  	       (unsigned long long)rc->block_group->key.objectid,
  	       (unsigned long long)rc->block_group->flags);
24bbcf044   Yan, Zheng   Btrfs: Add delaye...
3942
3943
  	btrfs_start_delalloc_inodes(fs_info->tree_root, 0);
  	btrfs_wait_ordered_extents(fs_info->tree_root, 0, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3944
3945
  
  	while (1) {
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
3946
3947
3948
  		mutex_lock(&fs_info->cleaner_mutex);
  
  		btrfs_clean_old_snapshots(fs_info->tree_root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3949
  		ret = relocate_block_group(rc);
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
3950
3951
  
  		mutex_unlock(&fs_info->cleaner_mutex);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3952
3953
  		if (ret < 0) {
  			err = ret;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
3954
  			goto out;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
  		}
  
  		if (rc->extents_found == 0)
  			break;
  
  		printk(KERN_INFO "btrfs: found %llu extents
  ",
  			(unsigned long long)rc->extents_found);
  
  		if (rc->stage == MOVE_DATA_EXTENTS && rc->found_file_extent) {
  			btrfs_wait_ordered_range(rc->data_inode, 0, (u64)-1);
  			invalidate_mapping_pages(rc->data_inode->i_mapping,
  						 0, -1);
  			rc->stage = UPDATE_DATA_PTRS;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3969
3970
  		}
  	}
0257bb82d   Yan, Zheng   Btrfs: relocate f...
3971
3972
3973
3974
  	filemap_write_and_wait_range(fs_info->btree_inode->i_mapping,
  				     rc->block_group->key.objectid,
  				     rc->block_group->key.objectid +
  				     rc->block_group->key.offset - 1);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3975
3976
3977
3978
3979
  
  	WARN_ON(rc->block_group->pinned > 0);
  	WARN_ON(rc->block_group->reserved > 0);
  	WARN_ON(btrfs_block_group_used(&rc->block_group->item) > 0);
  out:
f0486c68e   Yan, Zheng   Btrfs: Introduce ...
3980
3981
  	if (err && rw)
  		btrfs_set_block_group_rw(extent_root, rc->block_group);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3982
  	iput(rc->data_inode);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
3983
3984
3985
3986
  	btrfs_put_block_group(rc->block_group);
  	kfree(rc);
  	return err;
  }
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
3987
3988
3989
3990
  static noinline_for_stack int mark_garbage_root(struct btrfs_root *root)
  {
  	struct btrfs_trans_handle *trans;
  	int ret;
a22285a6a   Yan, Zheng   Btrfs: Integrate ...
3991
  	trans = btrfs_start_transaction(root->fs_info->tree_root, 0);
98d5dc13e   Tsutomu Itoh   btrfs: fix return...
3992
  	BUG_ON(IS_ERR(trans));
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
  
  	memset(&root->root_item.drop_progress, 0,
  		sizeof(root->root_item.drop_progress));
  	root->root_item.drop_level = 0;
  	btrfs_set_root_refs(&root->root_item, 0);
  	ret = btrfs_update_root(trans, root->fs_info->tree_root,
  				&root->root_key, &root->root_item);
  	BUG_ON(ret);
  
  	ret = btrfs_end_transaction(trans, root->fs_info->tree_root);
  	BUG_ON(ret);
  	return 0;
  }
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
  /*
   * recover relocation interrupted by system crash.
   *
   * this function resumes merging reloc trees with corresponding fs trees.
   * this is important for keeping the sharing of tree blocks
   */
  int btrfs_recover_relocation(struct btrfs_root *root)
  {
  	LIST_HEAD(reloc_roots);
  	struct btrfs_key key;
  	struct btrfs_root *fs_root;
  	struct btrfs_root *reloc_root;
  	struct btrfs_path *path;
  	struct extent_buffer *leaf;
  	struct reloc_control *rc = NULL;
  	struct btrfs_trans_handle *trans;
  	int ret;
  	int err = 0;
  
  	path = btrfs_alloc_path();
  	if (!path)
  		return -ENOMEM;
026fd3178   Josef Bacik   Btrfs: don't alwa...
4028
  	path->reada = -1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
  
  	key.objectid = BTRFS_TREE_RELOC_OBJECTID;
  	key.type = BTRFS_ROOT_ITEM_KEY;
  	key.offset = (u64)-1;
  
  	while (1) {
  		ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key,
  					path, 0, 0);
  		if (ret < 0) {
  			err = ret;
  			goto out;
  		}
  		if (ret > 0) {
  			if (path->slots[0] == 0)
  				break;
  			path->slots[0]--;
  		}
  		leaf = path->nodes[0];
  		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
b3b4aa74b   David Sterba   btrfs: drop unuse...
4048
  		btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
  
  		if (key.objectid != BTRFS_TREE_RELOC_OBJECTID ||
  		    key.type != BTRFS_ROOT_ITEM_KEY)
  			break;
  
  		reloc_root = btrfs_read_fs_root_no_radix(root, &key);
  		if (IS_ERR(reloc_root)) {
  			err = PTR_ERR(reloc_root);
  			goto out;
  		}
  
  		list_add(&reloc_root->root_list, &reloc_roots);
  
  		if (btrfs_root_refs(&reloc_root->root_item) > 0) {
  			fs_root = read_fs_root(root->fs_info,
  					       reloc_root->root_key.offset);
  			if (IS_ERR(fs_root)) {
76dda93c6   Yan, Zheng   Btrfs: add snapsh...
4066
4067
4068
4069
4070
4071
  				ret = PTR_ERR(fs_root);
  				if (ret != -ENOENT) {
  					err = ret;
  					goto out;
  				}
  				mark_garbage_root(reloc_root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4072
4073
4074
4075
4076
4077
4078
4079
  			}
  		}
  
  		if (key.offset == 0)
  			break;
  
  		key.offset--;
  	}
b3b4aa74b   David Sterba   btrfs: drop unuse...
4080
  	btrfs_release_path(path);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4081
4082
4083
  
  	if (list_empty(&reloc_roots))
  		goto out;
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
4084
  	rc = alloc_reloc_control();
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4085
4086
4087
4088
  	if (!rc) {
  		err = -ENOMEM;
  		goto out;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4089
4090
4091
  	rc->extent_root = root->fs_info->extent_root;
  
  	set_reloc_control(rc);
7a7eaa40a   Josef Bacik   Btrfs: take away ...
4092
  	trans = btrfs_join_transaction(rc->extent_root);
3612b4959   Tsutomu Itoh   btrfs: fix return...
4093
4094
4095
4096
4097
  	if (IS_ERR(trans)) {
  		unset_reloc_control(rc);
  		err = PTR_ERR(trans);
  		goto out_free;
  	}
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
4098
4099
  
  	rc->merge_reloc_tree = 1;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
  	while (!list_empty(&reloc_roots)) {
  		reloc_root = list_entry(reloc_roots.next,
  					struct btrfs_root, root_list);
  		list_del(&reloc_root->root_list);
  
  		if (btrfs_root_refs(&reloc_root->root_item) == 0) {
  			list_add_tail(&reloc_root->root_list,
  				      &rc->reloc_roots);
  			continue;
  		}
  
  		fs_root = read_fs_root(root->fs_info,
  				       reloc_root->root_key.offset);
  		BUG_ON(IS_ERR(fs_root));
  
  		__add_reloc_root(reloc_root);
  		fs_root->reloc_root = reloc_root;
  	}
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4118
4119
4120
4121
4122
  	btrfs_commit_transaction(trans, rc->extent_root);
  
  	merge_reloc_roots(rc);
  
  	unset_reloc_control(rc);
7a7eaa40a   Josef Bacik   Btrfs: take away ...
4123
  	trans = btrfs_join_transaction(rc->extent_root);
3612b4959   Tsutomu Itoh   btrfs: fix return...
4124
4125
4126
4127
4128
  	if (IS_ERR(trans))
  		err = PTR_ERR(trans);
  	else
  		btrfs_commit_transaction(trans, rc->extent_root);
  out_free:
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
4129
  	kfree(rc);
3612b4959   Tsutomu Itoh   btrfs: fix return...
4130
  out:
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
  	while (!list_empty(&reloc_roots)) {
  		reloc_root = list_entry(reloc_roots.next,
  					struct btrfs_root, root_list);
  		list_del(&reloc_root->root_list);
  		free_extent_buffer(reloc_root->node);
  		free_extent_buffer(reloc_root->commit_root);
  		kfree(reloc_root);
  	}
  	btrfs_free_path(path);
  
  	if (err == 0) {
  		/* cleanup orphan inode in data relocation tree */
  		fs_root = read_fs_root(root->fs_info,
  				       BTRFS_DATA_RELOC_TREE_OBJECTID);
  		if (IS_ERR(fs_root))
  			err = PTR_ERR(fs_root);
d7ce5843b   Miao Xie   Btrfs: remove BUG...
4147
  		else
66b4ffd11   Josef Bacik   Btrfs: handle err...
4148
  			err = btrfs_orphan_cleanup(fs_root);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
  	}
  	return err;
  }
  
  /*
   * helper to add ordered checksum for data relocation.
   *
   * cloning checksum properly handles the nodatasum extents.
   * it also saves CPU time to re-calculate the checksum.
   */
  int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len)
  {
  	struct btrfs_ordered_sum *sums;
  	struct btrfs_sector_sum *sector_sum;
  	struct btrfs_ordered_extent *ordered;
  	struct btrfs_root *root = BTRFS_I(inode)->root;
  	size_t offset;
  	int ret;
  	u64 disk_bytenr;
  	LIST_HEAD(list);
  
  	ordered = btrfs_lookup_ordered_extent(inode, file_pos);
  	BUG_ON(ordered->file_offset != file_pos || ordered->len != len);
  
  	disk_bytenr = file_pos + BTRFS_I(inode)->index_cnt;
  	ret = btrfs_lookup_csums_range(root->fs_info->csum_root, disk_bytenr,
a2de733c7   Arne Jansen   btrfs: scrub
4175
  				       disk_bytenr + len - 1, &list, 0);
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
  
  	while (!list_empty(&list)) {
  		sums = list_entry(list.next, struct btrfs_ordered_sum, list);
  		list_del_init(&sums->list);
  
  		sector_sum = sums->sums;
  		sums->bytenr = ordered->start;
  
  		offset = 0;
  		while (offset < sums->len) {
  			sector_sum->bytenr += ordered->start - disk_bytenr;
  			sector_sum++;
  			offset += root->sectorsize;
  		}
  
  		btrfs_add_ordered_sum(inode, ordered, sums);
  	}
  	btrfs_put_ordered_extent(ordered);
411fc6bce   Andi Kleen   Btrfs: Fix variab...
4194
  	return ret;
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
4195
  }
3fd0a5585   Yan, Zheng   Btrfs: Metadata E...
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
  
  void btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
  			   struct btrfs_root *root, struct extent_buffer *buf,
  			   struct extent_buffer *cow)
  {
  	struct reloc_control *rc;
  	struct backref_node *node;
  	int first_cow = 0;
  	int level;
  	int ret;
  
  	rc = root->fs_info->reloc_ctl;
  	if (!rc)
  		return;
  
  	BUG_ON(rc->stage == UPDATE_DATA_PTRS &&
  	       root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID);
  
  	level = btrfs_header_level(buf);
  	if (btrfs_header_generation(buf) <=
  	    btrfs_root_last_snapshot(&root->root_item))
  		first_cow = 1;
  
  	if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID &&
  	    rc->create_reloc_tree) {
  		WARN_ON(!first_cow && level == 0);
  
  		node = rc->backref_cache.path[level];
  		BUG_ON(node->bytenr != buf->start &&
  		       node->new_bytenr != buf->start);
  
  		drop_node_buffer(node);
  		extent_buffer_get(cow);
  		node->eb = cow;
  		node->new_bytenr = cow->start;
  
  		if (!node->pending) {
  			list_move_tail(&node->list,
  				       &rc->backref_cache.pending[level]);
  			node->pending = 1;
  		}
  
  		if (first_cow)
  			__mark_block_processed(rc, node);
  
  		if (first_cow && level > 0)
  			rc->nodes_relocated += buf->len;
  	}
  
  	if (level == 0 && first_cow && rc->stage == UPDATE_DATA_PTRS) {
  		ret = replace_file_extents(trans, rc, root, cow);
  		BUG_ON(ret);
  	}
  }
  
  /*
   * called before creating snapshot. it calculates metadata reservation
   * requried for relocating tree blocks in the snapshot
   */
  void btrfs_reloc_pre_snapshot(struct btrfs_trans_handle *trans,
  			      struct btrfs_pending_snapshot *pending,
  			      u64 *bytes_to_reserve)
  {
  	struct btrfs_root *root;
  	struct reloc_control *rc;
  
  	root = pending->root;
  	if (!root->reloc_root)
  		return;
  
  	rc = root->fs_info->reloc_ctl;
  	if (!rc->merge_reloc_tree)
  		return;
  
  	root = root->reloc_root;
  	BUG_ON(btrfs_root_refs(&root->root_item) == 0);
  	/*
  	 * relocation is in the stage of merging trees. the space
  	 * used by merging a reloc tree is twice the size of
  	 * relocated tree nodes in the worst case. half for cowing
  	 * the reloc tree, half for cowing the fs tree. the space
  	 * used by cowing the reloc tree will be freed after the
  	 * tree is dropped. if we create snapshot, cowing the fs
  	 * tree may use more space than it frees. so we need
  	 * reserve extra space.
  	 */
  	*bytes_to_reserve += rc->nodes_relocated;
  }
  
  /*
   * called after snapshot is created. migrate block reservation
   * and create reloc root for the newly created snapshot
   */
  void btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
  			       struct btrfs_pending_snapshot *pending)
  {
  	struct btrfs_root *root = pending->root;
  	struct btrfs_root *reloc_root;
  	struct btrfs_root *new_root;
  	struct reloc_control *rc;
  	int ret;
  
  	if (!root->reloc_root)
  		return;
  
  	rc = root->fs_info->reloc_ctl;
  	rc->merging_rsv_size += rc->nodes_relocated;
  
  	if (rc->merge_reloc_tree) {
  		ret = btrfs_block_rsv_migrate(&pending->block_rsv,
  					      rc->block_rsv,
  					      rc->nodes_relocated);
  		BUG_ON(ret);
  	}
  
  	new_root = pending->snap;
  	reloc_root = create_reloc_root(trans, root->reloc_root,
  				       new_root->root_key.objectid);
  
  	__add_reloc_root(reloc_root);
  	new_root->reloc_root = reloc_root;
  
  	if (rc->create_reloc_tree) {
  		ret = clone_backref_node(trans, rc, root, reloc_root);
  		BUG_ON(ret);
  	}
  }