Line data Source code
1 : /*
2 : * Copyright (C) 2009 Oracle. All rights reserved.
3 : *
4 : * This program is free software; you can redistribute it and/or
5 : * modify it under the terms of the GNU General Public
6 : * License v2 as published by the Free Software Foundation.
7 : *
8 : * This program is distributed in the hope that it will be useful,
9 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 : * General Public License for more details.
12 : *
13 : * You should have received a copy of the GNU General Public
14 : * License along with this program; if not, write to the
15 : * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 : * Boston, MA 021110-1307, USA.
17 : */
18 :
19 : #include <linux/sched.h>
20 : #include <linux/pagemap.h>
21 : #include <linux/writeback.h>
22 : #include <linux/blkdev.h>
23 : #include <linux/rbtree.h>
24 : #include <linux/slab.h>
25 : #include "ctree.h"
26 : #include "disk-io.h"
27 : #include "transaction.h"
28 : #include "volumes.h"
29 : #include "locking.h"
30 : #include "btrfs_inode.h"
31 : #include "async-thread.h"
32 : #include "free-space-cache.h"
33 : #include "inode-map.h"
34 :
35 : /*
36 : * backref_node, mapping_node and tree_block start with this
37 : */
38 : struct tree_entry {
39 : struct rb_node rb_node;
40 : u64 bytenr;
41 : };
42 :
43 : /*
44 : * present a tree block in the backref cache
45 : */
46 : struct backref_node {
47 : struct rb_node rb_node;
48 : u64 bytenr;
49 :
50 : u64 new_bytenr;
51 : /* objectid of tree block owner, can be not uptodate */
52 : u64 owner;
53 : /* link to pending, changed or detached list */
54 : struct list_head list;
55 : /* list of upper level blocks reference this block */
56 : struct list_head upper;
57 : /* list of child blocks in the cache */
58 : struct list_head lower;
59 : /* NULL if this node is not tree root */
60 : struct btrfs_root *root;
61 : /* extent buffer got by COW the block */
62 : struct extent_buffer *eb;
63 : /* level of tree block */
64 : unsigned int level:8;
65 : /* is the block in non-reference counted tree */
66 : unsigned int cowonly:1;
67 : /* 1 if no child node in the cache */
68 : unsigned int lowest:1;
69 : /* is the extent buffer locked */
70 : unsigned int locked:1;
71 : /* has the block been processed */
72 : unsigned int processed:1;
73 : /* have backrefs of this block been checked */
74 : unsigned int checked:1;
75 : /*
76 : * 1 if corresponding block has been cowed but some upper
77 : * level block pointers may not point to the new location
78 : */
79 : unsigned int pending:1;
80 : /*
81 : * 1 if the backref node isn't connected to any other
82 : * backref node.
83 : */
84 : unsigned int detached:1;
85 : };
86 :
87 : /*
88 : * present a block pointer in the backref cache
89 : */
90 : struct backref_edge {
91 : struct list_head list[2];
92 : struct backref_node *node[2];
93 : };
94 :
95 : #define LOWER 0
96 : #define UPPER 1
97 : #define RELOCATION_RESERVED_NODES 256
98 :
99 : struct backref_cache {
100 : /* red black tree of all backref nodes in the cache */
101 : struct rb_root rb_root;
102 : /* for passing backref nodes to btrfs_reloc_cow_block */
103 : struct backref_node *path[BTRFS_MAX_LEVEL];
104 : /*
105 : * list of blocks that have been cowed but some block
106 : * pointers in upper level blocks may not reflect the
107 : * new location
108 : */
109 : struct list_head pending[BTRFS_MAX_LEVEL];
110 : /* list of backref nodes with no child node */
111 : struct list_head leaves;
112 : /* list of blocks that have been cowed in current transaction */
113 : struct list_head changed;
114 : /* list of detached backref node. */
115 : struct list_head detached;
116 :
117 : u64 last_trans;
118 :
119 : int nr_nodes;
120 : int nr_edges;
121 : };
122 :
123 : /*
124 : * map address of tree root to tree
125 : */
126 : struct mapping_node {
127 : struct rb_node rb_node;
128 : u64 bytenr;
129 : void *data;
130 : };
131 :
132 : struct mapping_tree {
133 : struct rb_root rb_root;
134 : spinlock_t lock;
135 : };
136 :
137 : /*
138 : * present a tree block to process
139 : */
140 : struct tree_block {
141 : struct rb_node rb_node;
142 : u64 bytenr;
143 : struct btrfs_key key;
144 : unsigned int level:8;
145 : unsigned int key_ready:1;
146 : };
147 :
148 : #define MAX_EXTENTS 128
149 :
150 : struct file_extent_cluster {
151 : u64 start;
152 : u64 end;
153 : u64 boundary[MAX_EXTENTS];
154 : unsigned int nr;
155 : };
156 :
157 : struct reloc_control {
158 : /* block group to relocate */
159 : struct btrfs_block_group_cache *block_group;
160 : /* extent tree */
161 : struct btrfs_root *extent_root;
162 : /* inode for moving data */
163 : struct inode *data_inode;
164 :
165 : struct btrfs_block_rsv *block_rsv;
166 :
167 : struct backref_cache backref_cache;
168 :
169 : struct file_extent_cluster cluster;
170 : /* tree blocks have been processed */
171 : struct extent_io_tree processed_blocks;
172 : /* map start of tree root to corresponding reloc tree */
173 : struct mapping_tree reloc_root_tree;
174 : /* list of reloc trees */
175 : struct list_head reloc_roots;
176 : /* size of metadata reservation for merging reloc trees */
177 : u64 merging_rsv_size;
178 : /* size of relocated tree nodes */
179 : u64 nodes_relocated;
180 : /* reserved size for block group relocation*/
181 : u64 reserved_bytes;
182 :
183 : u64 search_start;
184 : u64 extents_found;
185 :
186 : unsigned int stage:8;
187 : unsigned int create_reloc_tree:1;
188 : unsigned int merge_reloc_tree:1;
189 : unsigned int found_file_extent:1;
190 : };
191 :
192 : /* stages of data relocation */
193 : #define MOVE_DATA_EXTENTS 0
194 : #define UPDATE_DATA_PTRS 1
195 :
196 : static void remove_backref_node(struct backref_cache *cache,
197 : struct backref_node *node);
198 : static void __mark_block_processed(struct reloc_control *rc,
199 : struct backref_node *node);
200 :
201 : static void mapping_tree_init(struct mapping_tree *tree)
202 : {
203 72 : tree->rb_root = RB_ROOT;
204 72 : spin_lock_init(&tree->lock);
205 : }
206 :
207 : static void backref_cache_init(struct backref_cache *cache)
208 : {
209 : int i;
210 72 : cache->rb_root = RB_ROOT;
211 576 : for (i = 0; i < BTRFS_MAX_LEVEL; i++)
212 576 : INIT_LIST_HEAD(&cache->pending[i]);
213 72 : INIT_LIST_HEAD(&cache->changed);
214 72 : INIT_LIST_HEAD(&cache->detached);
215 72 : INIT_LIST_HEAD(&cache->leaves);
216 : }
217 :
218 120 : static void backref_cache_cleanup(struct backref_cache *cache)
219 : {
220 : struct backref_node *node;
221 : int i;
222 :
223 360 : while (!list_empty(&cache->detached)) {
224 0 : node = list_entry(cache->detached.next,
225 : struct backref_node, list);
226 0 : remove_backref_node(cache, node);
227 : }
228 :
229 244 : while (!list_empty(&cache->leaves)) {
230 2 : node = list_entry(cache->leaves.next,
231 : struct backref_node, lower);
232 2 : remove_backref_node(cache, node);
233 : }
234 :
235 120 : cache->last_trans = 0;
236 :
237 1080 : for (i = 0; i < BTRFS_MAX_LEVEL; i++)
238 1920 : BUG_ON(!list_empty(&cache->pending[i]));
239 240 : BUG_ON(!list_empty(&cache->changed));
240 120 : BUG_ON(!list_empty(&cache->detached));
241 120 : BUG_ON(!RB_EMPTY_ROOT(&cache->rb_root));
242 120 : BUG_ON(cache->nr_nodes);
243 120 : BUG_ON(cache->nr_edges);
244 120 : }
245 :
246 511 : static struct backref_node *alloc_backref_node(struct backref_cache *cache)
247 : {
248 : struct backref_node *node;
249 :
250 511 : node = kzalloc(sizeof(*node), GFP_NOFS);
251 511 : if (node) {
252 511 : INIT_LIST_HEAD(&node->list);
253 511 : INIT_LIST_HEAD(&node->upper);
254 511 : INIT_LIST_HEAD(&node->lower);
255 511 : RB_CLEAR_NODE(&node->rb_node);
256 511 : cache->nr_nodes++;
257 : }
258 511 : return node;
259 : }
260 :
261 : static void free_backref_node(struct backref_cache *cache,
262 : struct backref_node *node)
263 : {
264 511 : if (node) {
265 511 : cache->nr_nodes--;
266 511 : kfree(node);
267 : }
268 : }
269 :
270 : static struct backref_edge *alloc_backref_edge(struct backref_cache *cache)
271 : {
272 : struct backref_edge *edge;
273 :
274 20 : edge = kzalloc(sizeof(*edge), GFP_NOFS);
275 20 : if (edge)
276 20 : cache->nr_edges++;
277 : return edge;
278 : }
279 :
280 : static void free_backref_edge(struct backref_cache *cache,
281 : struct backref_edge *edge)
282 : {
283 20 : if (edge) {
284 20 : cache->nr_edges--;
285 20 : kfree(edge);
286 : }
287 : }
288 :
289 1376 : static struct rb_node *tree_insert(struct rb_root *root, u64 bytenr,
290 : struct rb_node *node)
291 : {
292 1376 : struct rb_node **p = &root->rb_node;
293 : struct rb_node *parent = NULL;
294 : struct tree_entry *entry;
295 :
296 4546 : while (*p) {
297 : parent = *p;
298 : entry = rb_entry(parent, struct tree_entry, rb_node);
299 :
300 1794 : if (bytenr < entry->bytenr)
301 7 : p = &(*p)->rb_left;
302 1787 : else if (bytenr > entry->bytenr)
303 1787 : p = &(*p)->rb_right;
304 : else
305 : return parent;
306 : }
307 :
308 : rb_link_node(node, parent, p);
309 1376 : rb_insert_color(node, root);
310 1376 : return NULL;
311 : }
312 :
313 : static struct rb_node *tree_search(struct rb_root *root, u64 bytenr)
314 : {
315 475 : struct rb_node *n = root->rb_node;
316 : struct tree_entry *entry;
317 :
318 1412 : while (n) {
319 : entry = rb_entry(n, struct tree_entry, rb_node);
320 :
321 1386 : if (bytenr < entry->bytenr)
322 4 : n = n->rb_left;
323 1382 : else if (bytenr > entry->bytenr)
324 927 : n = n->rb_right;
325 : else
326 : return n;
327 : }
328 : return NULL;
329 : }
330 :
331 0 : static void backref_tree_panic(struct rb_node *rb_node, int errno, u64 bytenr)
332 : {
333 :
334 : struct btrfs_fs_info *fs_info = NULL;
335 : struct backref_node *bnode = rb_entry(rb_node, struct backref_node,
336 : rb_node);
337 0 : if (bnode->root)
338 0 : fs_info = bnode->root->fs_info;
339 0 : btrfs_panic(fs_info, errno, "Inconsistency in backref cache "
340 : "found at offset %llu", bytenr);
341 : }
342 :
343 : /*
344 : * walk up backref nodes until reach node presents tree root
345 : */
346 521 : static struct backref_node *walk_up_backref(struct backref_node *node,
347 : struct backref_edge *edges[],
348 : int *index)
349 : {
350 : struct backref_edge *edge;
351 521 : int idx = *index;
352 :
353 1603 : while (!list_empty(&node->upper)) {
354 : edge = list_entry(node->upper.next,
355 : struct backref_edge, list[LOWER]);
356 20 : edges[idx++] = edge;
357 20 : node = edge->node[UPPER];
358 : }
359 521 : BUG_ON(node->detached);
360 521 : *index = idx;
361 521 : return node;
362 : }
363 :
364 : /*
365 : * walk down backref nodes to find start of next reference path
366 : */
367 : static struct backref_node *walk_down_backref(struct backref_edge *edges[],
368 : int *index)
369 : {
370 : struct backref_edge *edge;
371 : struct backref_node *lower;
372 412 : int idx = *index;
373 :
374 1349 : while (idx > 0) {
375 20 : edge = edges[idx - 1];
376 20 : lower = edge->node[LOWER];
377 20 : if (list_is_last(&edge->list[LOWER], &lower->upper)) {
378 20 : idx--;
379 20 : continue;
380 : }
381 : edge = list_entry(edge->list[LOWER].next,
382 : struct backref_edge, list[LOWER]);
383 0 : edges[idx - 1] = edge;
384 0 : *index = idx;
385 0 : return edge->node[UPPER];
386 : }
387 412 : *index = 0;
388 : return NULL;
389 : }
390 :
391 : static void unlock_node_buffer(struct backref_node *node)
392 : {
393 32 : if (node->locked) {
394 16 : btrfs_tree_unlock(node->eb);
395 16 : node->locked = 0;
396 : }
397 : }
398 :
399 559 : static void drop_node_buffer(struct backref_node *node)
400 : {
401 559 : if (node->eb) {
402 : unlock_node_buffer(node);
403 32 : free_extent_buffer(node->eb);
404 32 : node->eb = NULL;
405 : }
406 559 : }
407 :
408 511 : static void drop_backref_node(struct backref_cache *tree,
409 : struct backref_node *node)
410 : {
411 1022 : BUG_ON(!list_empty(&node->upper));
412 :
413 511 : drop_node_buffer(node);
414 511 : list_del(&node->list);
415 511 : list_del(&node->lower);
416 511 : if (!RB_EMPTY_NODE(&node->rb_node))
417 430 : rb_erase(&node->rb_node, &tree->rb_root);
418 : free_backref_node(tree, node);
419 511 : }
420 :
421 : /*
422 : * remove a backref node from the backref cache
423 : */
424 507 : static void remove_backref_node(struct backref_cache *cache,
425 : struct backref_node *node)
426 : {
427 : struct backref_node *upper;
428 : struct backref_edge *edge;
429 :
430 507 : if (!node)
431 507 : return;
432 :
433 507 : BUG_ON(!node->lowest && !node->detached);
434 1054 : while (!list_empty(&node->upper)) {
435 : edge = list_entry(node->upper.next, struct backref_edge,
436 : list[LOWER]);
437 20 : upper = edge->node[UPPER];
438 20 : list_del(&edge->list[LOWER]);
439 20 : list_del(&edge->list[UPPER]);
440 : free_backref_edge(cache, edge);
441 :
442 20 : if (RB_EMPTY_NODE(&upper->rb_node)) {
443 4 : BUG_ON(!list_empty(&node->upper));
444 4 : drop_backref_node(cache, node);
445 : node = upper;
446 4 : node->lowest = 1;
447 4 : continue;
448 : }
449 : /*
450 : * add the node to leaf node list if no other
451 : * child block cached.
452 : */
453 32 : if (list_empty(&upper->lower)) {
454 16 : list_add_tail(&upper->lower, &cache->leaves);
455 16 : upper->lowest = 1;
456 : }
457 : }
458 :
459 507 : drop_backref_node(cache, node);
460 : }
461 :
462 0 : static void update_backref_node(struct backref_cache *cache,
463 : struct backref_node *node, u64 bytenr)
464 : {
465 : struct rb_node *rb_node;
466 0 : rb_erase(&node->rb_node, &cache->rb_root);
467 0 : node->bytenr = bytenr;
468 0 : rb_node = tree_insert(&cache->rb_root, node->bytenr, &node->rb_node);
469 0 : if (rb_node)
470 0 : backref_tree_panic(rb_node, -EEXIST, bytenr);
471 0 : }
472 :
473 : /*
474 : * update backref cache after a transaction commit
475 : */
476 2659 : static int update_backref_cache(struct btrfs_trans_handle *trans,
477 : struct backref_cache *cache)
478 : {
479 : struct backref_node *node;
480 : int level = 0;
481 :
482 2659 : if (cache->last_trans == 0) {
483 120 : cache->last_trans = trans->transid;
484 : return 0;
485 : }
486 :
487 2539 : if (cache->last_trans == trans->transid)
488 : return 0;
489 :
490 : /*
491 : * detached nodes are used to avoid unnecessary backref
492 : * lookup. transaction commit changes the extent tree.
493 : * so the detached nodes are no longer useful.
494 : */
495 0 : while (!list_empty(&cache->detached)) {
496 0 : node = list_entry(cache->detached.next,
497 : struct backref_node, list);
498 0 : remove_backref_node(cache, node);
499 : }
500 :
501 0 : while (!list_empty(&cache->changed)) {
502 0 : node = list_entry(cache->changed.next,
503 : struct backref_node, list);
504 0 : list_del_init(&node->list);
505 0 : BUG_ON(node->pending);
506 0 : update_backref_node(cache, node, node->new_bytenr);
507 : }
508 :
509 : /*
510 : * some nodes can be left in the pending list if there were
511 : * errors during processing the pending nodes.
512 : */
513 0 : for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
514 0 : list_for_each_entry(node, &cache->pending[level], list) {
515 0 : BUG_ON(!node->pending);
516 0 : if (node->bytenr == node->new_bytenr)
517 0 : continue;
518 0 : update_backref_node(cache, node, node->new_bytenr);
519 : }
520 : }
521 :
522 0 : cache->last_trans = 0;
523 : return 1;
524 : }
525 :
526 :
527 : static int should_ignore_root(struct btrfs_root *root)
528 : {
529 : struct btrfs_root *reloc_root;
530 :
531 491 : if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))
532 : return 0;
533 :
534 414 : reloc_root = root->reloc_root;
535 414 : if (!reloc_root)
536 : return 0;
537 :
538 0 : if (btrfs_root_last_snapshot(&reloc_root->root_item) ==
539 0 : root->fs_info->running_transaction->transid - 1)
540 : return 0;
541 : /*
542 : * if there is reloc tree and it was created in previous
543 : * transaction backref lookup can find the reloc tree,
544 : * so backref node for the fs tree root is useless for
545 : * relocation.
546 : */
547 : return 1;
548 : }
549 : /*
550 : * find reloc tree by address of tree root
551 : */
552 0 : static struct btrfs_root *find_reloc_root(struct reloc_control *rc,
553 : u64 bytenr)
554 : {
555 : struct rb_node *rb_node;
556 : struct mapping_node *node;
557 : struct btrfs_root *root = NULL;
558 :
559 : spin_lock(&rc->reloc_root_tree.lock);
560 : rb_node = tree_search(&rc->reloc_root_tree.rb_root, bytenr);
561 0 : if (rb_node) {
562 : node = rb_entry(rb_node, struct mapping_node, rb_node);
563 0 : root = (struct btrfs_root *)node->data;
564 : }
565 : spin_unlock(&rc->reloc_root_tree.lock);
566 0 : return root;
567 : }
568 :
569 : static int is_cowonly_root(u64 root_objectid)
570 : {
571 1646 : if (root_objectid == BTRFS_ROOT_TREE_OBJECTID ||
572 : root_objectid == BTRFS_EXTENT_TREE_OBJECTID ||
573 1646 : root_objectid == BTRFS_CHUNK_TREE_OBJECTID ||
574 1646 : root_objectid == BTRFS_DEV_TREE_OBJECTID ||
575 1646 : root_objectid == BTRFS_TREE_LOG_OBJECTID ||
576 3180 : root_objectid == BTRFS_CSUM_TREE_OBJECTID ||
577 3159 : root_objectid == BTRFS_UUID_TREE_OBJECTID ||
578 : root_objectid == BTRFS_QUOTA_TREE_OBJECTID)
579 : return 1;
580 : return 0;
581 : }
582 :
583 1646 : static struct btrfs_root *read_fs_root(struct btrfs_fs_info *fs_info,
584 : u64 root_objectid)
585 : {
586 : struct btrfs_key key;
587 :
588 1646 : key.objectid = root_objectid;
589 1646 : key.type = BTRFS_ROOT_ITEM_KEY;
590 1646 : if (is_cowonly_root(root_objectid))
591 77 : key.offset = 0;
592 : else
593 1569 : key.offset = (u64)-1;
594 :
595 1646 : return btrfs_get_fs_root(fs_info, &key, false);
596 : }
597 :
598 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
599 : static noinline_for_stack
600 0 : struct btrfs_root *find_tree_root(struct reloc_control *rc,
601 : struct extent_buffer *leaf,
602 : struct btrfs_extent_ref_v0 *ref0)
603 : {
604 : struct btrfs_root *root;
605 : u64 root_objectid = btrfs_ref_root_v0(leaf, ref0);
606 : u64 generation = btrfs_ref_generation_v0(leaf, ref0);
607 :
608 0 : BUG_ON(root_objectid == BTRFS_TREE_RELOC_OBJECTID);
609 :
610 0 : root = read_fs_root(rc->extent_root->fs_info, root_objectid);
611 0 : BUG_ON(IS_ERR(root));
612 :
613 0 : if (test_bit(BTRFS_ROOT_REF_COWS, &root->state) &&
614 : generation != btrfs_root_generation(&root->root_item))
615 : return NULL;
616 :
617 : return root;
618 : }
619 : #endif
620 :
621 : static noinline_for_stack
622 505 : int find_inline_backref(struct extent_buffer *leaf, int slot,
623 : unsigned long *ptr, unsigned long *end)
624 : {
625 : struct btrfs_key key;
626 : struct btrfs_extent_item *ei;
627 : struct btrfs_tree_block_info *bi;
628 : u32 item_size;
629 :
630 505 : btrfs_item_key_to_cpu(leaf, &key, slot);
631 :
632 : item_size = btrfs_item_size_nr(leaf, slot);
633 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
634 505 : if (item_size < sizeof(*ei)) {
635 0 : WARN_ON(item_size != sizeof(struct btrfs_extent_item_v0));
636 : return 1;
637 : }
638 : #endif
639 505 : ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
640 505 : WARN_ON(!(btrfs_extent_flags(leaf, ei) &
641 : BTRFS_EXTENT_FLAG_TREE_BLOCK));
642 :
643 505 : if (key.type == BTRFS_EXTENT_ITEM_KEY &&
644 : item_size <= sizeof(*ei) + sizeof(*bi)) {
645 0 : WARN_ON(item_size < sizeof(*ei) + sizeof(*bi));
646 : return 1;
647 : }
648 505 : if (key.type == BTRFS_METADATA_ITEM_KEY &&
649 : item_size <= sizeof(*ei)) {
650 0 : WARN_ON(item_size < sizeof(*ei));
651 : return 1;
652 : }
653 :
654 505 : if (key.type == BTRFS_EXTENT_ITEM_KEY) {
655 : bi = (struct btrfs_tree_block_info *)(ei + 1);
656 505 : *ptr = (unsigned long)(bi + 1);
657 : } else {
658 0 : *ptr = (unsigned long)(ei + 1);
659 : }
660 505 : *end = (unsigned long)ei + item_size;
661 505 : return 0;
662 : }
663 :
664 : /*
665 : * build backref tree for a given tree block. root of the backref tree
666 : * corresponds the tree block, leaves of the backref tree correspond
667 : * roots of b-trees that reference the tree block.
668 : *
669 : * the basic idea of this function is check backrefs of a given block
670 : * to find upper level blocks that refernece the block, and then check
671 : * bakcrefs of these upper level blocks recursively. the recursion stop
672 : * when tree root is reached or backrefs for the block is cached.
673 : *
674 : * NOTE: if we find backrefs for a block are cached, we know backrefs
675 : * for all upper level blocks that directly/indirectly reference the
676 : * block are also cached.
677 : */
678 : static noinline_for_stack
679 505 : struct backref_node *build_backref_tree(struct reloc_control *rc,
680 : struct btrfs_key *node_key,
681 : int level, u64 bytenr)
682 : {
683 : struct backref_cache *cache = &rc->backref_cache;
684 : struct btrfs_path *path1;
685 : struct btrfs_path *path2;
686 531 : struct extent_buffer *eb;
687 : struct btrfs_root *root;
688 : struct backref_node *cur;
689 : struct backref_node *upper;
690 : struct backref_node *lower;
691 : struct backref_node *node = NULL;
692 : struct backref_node *exist = NULL;
693 : struct backref_edge *edge;
694 : struct rb_node *rb_node;
695 : struct btrfs_key key;
696 : unsigned long end;
697 : unsigned long ptr;
698 505 : LIST_HEAD(list);
699 505 : LIST_HEAD(useless);
700 : int cowonly;
701 : int ret;
702 : int err = 0;
703 : bool need_check = true;
704 :
705 505 : path1 = btrfs_alloc_path();
706 505 : path2 = btrfs_alloc_path();
707 505 : if (!path1 || !path2) {
708 : err = -ENOMEM;
709 : goto out;
710 : }
711 505 : path1->reada = 1;
712 505 : path2->reada = 2;
713 :
714 505 : node = alloc_backref_node(cache);
715 505 : if (!node) {
716 : err = -ENOMEM;
717 : goto out;
718 : }
719 :
720 505 : node->bytenr = bytenr;
721 505 : node->level = level;
722 505 : node->lowest = 1;
723 : cur = node;
724 : again:
725 505 : end = 0;
726 505 : ptr = 0;
727 505 : key.objectid = cur->bytenr;
728 505 : key.type = BTRFS_METADATA_ITEM_KEY;
729 505 : key.offset = (u64)-1;
730 :
731 505 : path1->search_commit_root = 1;
732 505 : path1->skip_locking = 1;
733 505 : ret = btrfs_search_slot(NULL, rc->extent_root, &key, path1,
734 : 0, 0);
735 505 : if (ret < 0) {
736 : err = ret;
737 : goto out;
738 : }
739 505 : BUG_ON(!ret || !path1->slots[0]);
740 :
741 505 : path1->slots[0]--;
742 :
743 505 : WARN_ON(cur->checked);
744 1010 : if (!list_empty(&cur->upper)) {
745 : /*
746 : * the backref was added previously when processing
747 : * backref of type BTRFS_TREE_BLOCK_REF_KEY
748 : */
749 0 : BUG_ON(!list_is_singular(&cur->upper));
750 : edge = list_entry(cur->upper.next, struct backref_edge,
751 : list[LOWER]);
752 0 : BUG_ON(!list_empty(&edge->list[UPPER]));
753 0 : exist = edge->node[UPPER];
754 : /*
755 : * add the upper level block to pending list if we need
756 : * check its backrefs
757 : */
758 0 : if (!exist->checked)
759 : list_add_tail(&edge->list[UPPER], &list);
760 : } else {
761 : exist = NULL;
762 : }
763 :
764 : while (1) {
765 525 : cond_resched();
766 525 : eb = path1->nodes[0];
767 :
768 525 : if (ptr >= end) {
769 1050 : if (path1->slots[0] >= btrfs_header_nritems(eb)) {
770 0 : ret = btrfs_next_leaf(rc->extent_root, path1);
771 0 : if (ret < 0) {
772 : err = ret;
773 : goto out;
774 : }
775 0 : if (ret > 0)
776 : break;
777 0 : eb = path1->nodes[0];
778 : }
779 :
780 525 : btrfs_item_key_to_cpu(eb, &key, path1->slots[0]);
781 525 : if (key.objectid != cur->bytenr) {
782 20 : WARN_ON(exist);
783 : break;
784 : }
785 :
786 505 : if (key.type == BTRFS_EXTENT_ITEM_KEY ||
787 : key.type == BTRFS_METADATA_ITEM_KEY) {
788 505 : ret = find_inline_backref(eb, path1->slots[0],
789 : &ptr, &end);
790 505 : if (ret)
791 : goto next;
792 : }
793 : }
794 :
795 505 : if (ptr < end) {
796 : /* update key for inline back ref */
797 : struct btrfs_extent_inline_ref *iref;
798 505 : iref = (struct btrfs_extent_inline_ref *)ptr;
799 505 : key.type = btrfs_extent_inline_ref_type(eb, iref);
800 505 : key.offset = btrfs_extent_inline_ref_offset(eb, iref);
801 505 : WARN_ON(key.type != BTRFS_TREE_BLOCK_REF_KEY &&
802 : key.type != BTRFS_SHARED_BLOCK_REF_KEY);
803 : }
804 :
805 505 : if (exist &&
806 0 : ((key.type == BTRFS_TREE_BLOCK_REF_KEY &&
807 0 : exist->owner == key.offset) ||
808 0 : (key.type == BTRFS_SHARED_BLOCK_REF_KEY &&
809 0 : exist->bytenr == key.offset))) {
810 : exist = NULL;
811 : goto next;
812 : }
813 :
814 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
815 505 : if (key.type == BTRFS_SHARED_BLOCK_REF_KEY ||
816 : key.type == BTRFS_EXTENT_REF_V0_KEY) {
817 0 : if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
818 : struct btrfs_extent_ref_v0 *ref0;
819 0 : ref0 = btrfs_item_ptr(eb, path1->slots[0],
820 : struct btrfs_extent_ref_v0);
821 0 : if (key.objectid == key.offset) {
822 0 : root = find_tree_root(rc, eb, ref0);
823 0 : if (root && !should_ignore_root(root))
824 0 : cur->root = root;
825 : else
826 0 : list_add(&cur->list, &useless);
827 : break;
828 : }
829 0 : if (is_cowonly_root(btrfs_ref_root_v0(eb,
830 : ref0)))
831 0 : cur->cowonly = 1;
832 : }
833 : #else
834 : BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
835 : if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
836 : #endif
837 0 : if (key.objectid == key.offset) {
838 : /*
839 : * only root blocks of reloc trees use
840 : * backref of this type.
841 : */
842 0 : root = find_reloc_root(rc, cur->bytenr);
843 0 : BUG_ON(!root);
844 0 : cur->root = root;
845 0 : break;
846 : }
847 :
848 : edge = alloc_backref_edge(cache);
849 0 : if (!edge) {
850 : err = -ENOMEM;
851 : goto out;
852 : }
853 0 : rb_node = tree_search(&cache->rb_root, key.offset);
854 0 : if (!rb_node) {
855 0 : upper = alloc_backref_node(cache);
856 0 : if (!upper) {
857 : free_backref_edge(cache, edge);
858 : err = -ENOMEM;
859 : goto out;
860 : }
861 0 : upper->bytenr = key.offset;
862 0 : upper->level = cur->level + 1;
863 : /*
864 : * backrefs for the upper level block isn't
865 : * cached, add the block to pending list
866 : */
867 0 : list_add_tail(&edge->list[UPPER], &list);
868 : } else {
869 : upper = rb_entry(rb_node, struct backref_node,
870 : rb_node);
871 0 : BUG_ON(!upper->checked);
872 0 : INIT_LIST_HEAD(&edge->list[UPPER]);
873 : }
874 0 : list_add_tail(&edge->list[LOWER], &cur->upper);
875 0 : edge->node[LOWER] = cur;
876 0 : edge->node[UPPER] = upper;
877 :
878 0 : goto next;
879 505 : } else if (key.type != BTRFS_TREE_BLOCK_REF_KEY) {
880 : goto next;
881 : }
882 :
883 : /* key.type == BTRFS_TREE_BLOCK_REF_KEY */
884 505 : root = read_fs_root(rc->extent_root->fs_info, key.offset);
885 505 : if (IS_ERR(root)) {
886 0 : err = PTR_ERR(root);
887 0 : goto out;
888 : }
889 :
890 505 : if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))
891 77 : cur->cowonly = 1;
892 :
893 505 : if (btrfs_root_level(&root->root_item) == cur->level) {
894 : /* tree root */
895 485 : BUG_ON(btrfs_root_bytenr(&root->root_item) !=
896 : cur->bytenr);
897 485 : if (should_ignore_root(root))
898 0 : list_add(&cur->list, &useless);
899 : else
900 485 : cur->root = root;
901 : break;
902 : }
903 :
904 20 : level = cur->level + 1;
905 :
906 : /*
907 : * searching the tree to find upper level blocks
908 : * reference the block.
909 : */
910 20 : path2->search_commit_root = 1;
911 20 : path2->skip_locking = 1;
912 20 : path2->lowest_level = level;
913 20 : ret = btrfs_search_slot(NULL, root, node_key, path2, 0, 0);
914 20 : path2->lowest_level = 0;
915 20 : if (ret < 0) {
916 : err = ret;
917 : goto out;
918 : }
919 20 : if (ret > 0 && path2->slots[level] > 0)
920 0 : path2->slots[level]--;
921 :
922 20 : eb = path2->nodes[level];
923 40 : WARN_ON(btrfs_node_blockptr(eb, path2->slots[level]) !=
924 : cur->bytenr);
925 :
926 : lower = cur;
927 : need_check = true;
928 26 : for (; level < BTRFS_MAX_LEVEL; level++) {
929 26 : if (!path2->nodes[level]) {
930 6 : BUG_ON(btrfs_root_bytenr(&root->root_item) !=
931 : lower->bytenr);
932 6 : if (should_ignore_root(root))
933 0 : list_add(&lower->list, &useless);
934 : else
935 6 : lower->root = root;
936 : break;
937 : }
938 :
939 : edge = alloc_backref_edge(cache);
940 20 : if (!edge) {
941 : err = -ENOMEM;
942 : goto out;
943 : }
944 :
945 20 : eb = path2->nodes[level];
946 20 : rb_node = tree_search(&cache->rb_root, eb->start);
947 20 : if (!rb_node) {
948 6 : upper = alloc_backref_node(cache);
949 6 : if (!upper) {
950 : free_backref_edge(cache, edge);
951 : err = -ENOMEM;
952 : goto out;
953 : }
954 6 : upper->bytenr = eb->start;
955 6 : upper->owner = btrfs_header_owner(eb);
956 6 : upper->level = lower->level + 1;
957 6 : if (!test_bit(BTRFS_ROOT_REF_COWS,
958 : &root->state))
959 4 : upper->cowonly = 1;
960 :
961 : /*
962 : * if we know the block isn't shared
963 : * we can void checking its backrefs.
964 : */
965 6 : if (btrfs_block_can_be_shared(root, eb))
966 0 : upper->checked = 0;
967 : else
968 6 : upper->checked = 1;
969 :
970 : /*
971 : * add the block to pending list if we
972 : * need check its backrefs, we only do this once
973 : * while walking up a tree as we will catch
974 : * anything else later on.
975 : */
976 6 : if (!upper->checked && need_check) {
977 : need_check = false;
978 0 : list_add_tail(&edge->list[UPPER],
979 : &list);
980 : } else
981 6 : INIT_LIST_HEAD(&edge->list[UPPER]);
982 : } else {
983 : upper = rb_entry(rb_node, struct backref_node,
984 : rb_node);
985 14 : BUG_ON(!upper->checked);
986 14 : INIT_LIST_HEAD(&edge->list[UPPER]);
987 14 : if (!upper->owner)
988 0 : upper->owner = btrfs_header_owner(eb);
989 : }
990 20 : list_add_tail(&edge->list[LOWER], &lower->upper);
991 20 : edge->node[LOWER] = lower;
992 20 : edge->node[UPPER] = upper;
993 :
994 20 : if (rb_node)
995 : break;
996 : lower = upper;
997 : upper = NULL;
998 : }
999 20 : btrfs_release_path(path2);
1000 : next:
1001 20 : if (ptr < end) {
1002 20 : ptr += btrfs_extent_inline_ref_size(key.type);
1003 20 : if (ptr >= end) {
1004 20 : WARN_ON(ptr > end);
1005 20 : ptr = 0;
1006 20 : end = 0;
1007 : }
1008 : }
1009 20 : if (ptr >= end)
1010 20 : path1->slots[0]++;
1011 : }
1012 505 : btrfs_release_path(path1);
1013 :
1014 505 : cur->checked = 1;
1015 505 : WARN_ON(exist);
1016 :
1017 : /* the pending list isn't empty, take the first block to process */
1018 505 : if (!list_empty(&list)) {
1019 : edge = list_entry(list.next, struct backref_edge, list[UPPER]);
1020 0 : list_del_init(&edge->list[UPPER]);
1021 0 : cur = edge->node[UPPER];
1022 0 : goto again;
1023 : }
1024 :
1025 : /*
1026 : * everything goes well, connect backref nodes and insert backref nodes
1027 : * into the cache.
1028 : */
1029 505 : BUG_ON(!node->checked);
1030 505 : cowonly = node->cowonly;
1031 505 : if (!cowonly) {
1032 428 : rb_node = tree_insert(&cache->rb_root, node->bytenr,
1033 : &node->rb_node);
1034 428 : if (rb_node)
1035 0 : backref_tree_panic(rb_node, -EEXIST, node->bytenr);
1036 428 : list_add_tail(&node->lower, &cache->leaves);
1037 : }
1038 :
1039 525 : list_for_each_entry(edge, &node->upper, list[LOWER])
1040 20 : list_add_tail(&edge->list[UPPER], &list);
1041 :
1042 525 : while (!list_empty(&list)) {
1043 20 : edge = list_entry(list.next, struct backref_edge, list[UPPER]);
1044 20 : list_del_init(&edge->list[UPPER]);
1045 20 : upper = edge->node[UPPER];
1046 20 : if (upper->detached) {
1047 0 : list_del(&edge->list[LOWER]);
1048 0 : lower = edge->node[LOWER];
1049 : free_backref_edge(cache, edge);
1050 0 : if (list_empty(&lower->upper))
1051 0 : list_add(&lower->list, &useless);
1052 0 : continue;
1053 : }
1054 :
1055 20 : if (!RB_EMPTY_NODE(&upper->rb_node)) {
1056 14 : if (upper->lowest) {
1057 14 : list_del_init(&upper->lower);
1058 14 : upper->lowest = 0;
1059 : }
1060 :
1061 14 : list_add_tail(&edge->list[UPPER], &upper->lower);
1062 14 : continue;
1063 : }
1064 :
1065 6 : BUG_ON(!upper->checked);
1066 6 : BUG_ON(cowonly != upper->cowonly);
1067 6 : if (!cowonly) {
1068 2 : rb_node = tree_insert(&cache->rb_root, upper->bytenr,
1069 : &upper->rb_node);
1070 2 : if (rb_node)
1071 0 : backref_tree_panic(rb_node, -EEXIST,
1072 : upper->bytenr);
1073 : }
1074 :
1075 6 : list_add_tail(&edge->list[UPPER], &upper->lower);
1076 :
1077 6 : list_for_each_entry(edge, &upper->upper, list[LOWER])
1078 0 : list_add_tail(&edge->list[UPPER], &list);
1079 : }
1080 : /*
1081 : * process useless backref nodes. backref nodes for tree leaves
1082 : * are deleted from the cache. backref nodes for upper level
1083 : * tree blocks are left in the cache to avoid unnecessary backref
1084 : * lookup.
1085 : */
1086 505 : while (!list_empty(&useless)) {
1087 0 : upper = list_entry(useless.next, struct backref_node, list);
1088 0 : list_del_init(&upper->list);
1089 0 : BUG_ON(!list_empty(&upper->upper));
1090 0 : if (upper == node)
1091 : node = NULL;
1092 0 : if (upper->lowest) {
1093 0 : list_del_init(&upper->lower);
1094 0 : upper->lowest = 0;
1095 : }
1096 0 : while (!list_empty(&upper->lower)) {
1097 0 : edge = list_entry(upper->lower.next,
1098 : struct backref_edge, list[UPPER]);
1099 0 : list_del(&edge->list[UPPER]);
1100 0 : list_del(&edge->list[LOWER]);
1101 0 : lower = edge->node[LOWER];
1102 : free_backref_edge(cache, edge);
1103 :
1104 0 : if (list_empty(&lower->upper))
1105 0 : list_add(&lower->list, &useless);
1106 : }
1107 0 : __mark_block_processed(rc, upper);
1108 0 : if (upper->level > 0) {
1109 0 : list_add(&upper->list, &cache->detached);
1110 0 : upper->detached = 1;
1111 : } else {
1112 0 : rb_erase(&upper->rb_node, &cache->rb_root);
1113 : free_backref_node(cache, upper);
1114 : }
1115 : }
1116 : out:
1117 505 : btrfs_free_path(path1);
1118 505 : btrfs_free_path(path2);
1119 505 : if (err) {
1120 0 : while (!list_empty(&useless)) {
1121 : lower = list_entry(useless.next,
1122 : struct backref_node, upper);
1123 0 : list_del_init(&lower->upper);
1124 : }
1125 : upper = node;
1126 : INIT_LIST_HEAD(&list);
1127 0 : while (upper) {
1128 0 : if (RB_EMPTY_NODE(&upper->rb_node)) {
1129 0 : list_splice_tail(&upper->upper, &list);
1130 : free_backref_node(cache, upper);
1131 : }
1132 :
1133 0 : if (list_empty(&list))
1134 : break;
1135 :
1136 : edge = list_entry(list.next, struct backref_edge,
1137 : list[LOWER]);
1138 0 : list_del(&edge->list[LOWER]);
1139 0 : upper = edge->node[UPPER];
1140 : free_backref_edge(cache, edge);
1141 : }
1142 0 : return ERR_PTR(err);
1143 : }
1144 505 : BUG_ON(node && node->detached);
1145 : return node;
1146 : }
1147 :
1148 : /*
1149 : * helper to add backref node for the newly created snapshot.
1150 : * the backref node is created by cloning backref node that
1151 : * corresponds to root of source tree
1152 : */
1153 6 : static int clone_backref_node(struct btrfs_trans_handle *trans,
1154 : struct reloc_control *rc,
1155 : struct btrfs_root *src,
1156 : struct btrfs_root *dest)
1157 : {
1158 6 : struct btrfs_root *reloc_root = src->reloc_root;
1159 6 : struct backref_cache *cache = &rc->backref_cache;
1160 : struct backref_node *node = NULL;
1161 : struct backref_node *new_node;
1162 : struct backref_edge *edge;
1163 : struct backref_edge *new_edge;
1164 : struct rb_node *rb_node;
1165 :
1166 6 : if (cache->last_trans > 0)
1167 0 : update_backref_cache(trans, cache);
1168 :
1169 6 : rb_node = tree_search(&cache->rb_root, src->commit_root->start);
1170 6 : if (rb_node) {
1171 : node = rb_entry(rb_node, struct backref_node, rb_node);
1172 0 : if (node->detached)
1173 : node = NULL;
1174 : else
1175 0 : BUG_ON(node->new_bytenr != reloc_root->node->start);
1176 : }
1177 :
1178 6 : if (!node) {
1179 6 : rb_node = tree_search(&cache->rb_root,
1180 6 : reloc_root->commit_root->start);
1181 6 : if (rb_node) {
1182 : node = rb_entry(rb_node, struct backref_node,
1183 : rb_node);
1184 0 : BUG_ON(node->detached);
1185 : }
1186 : }
1187 :
1188 6 : if (!node)
1189 : return 0;
1190 :
1191 0 : new_node = alloc_backref_node(cache);
1192 0 : if (!new_node)
1193 : return -ENOMEM;
1194 :
1195 0 : new_node->bytenr = dest->node->start;
1196 0 : new_node->level = node->level;
1197 0 : new_node->lowest = node->lowest;
1198 0 : new_node->checked = 1;
1199 0 : new_node->root = dest;
1200 :
1201 0 : if (!node->lowest) {
1202 0 : list_for_each_entry(edge, &node->lower, list[UPPER]) {
1203 : new_edge = alloc_backref_edge(cache);
1204 0 : if (!new_edge)
1205 : goto fail;
1206 :
1207 0 : new_edge->node[UPPER] = new_node;
1208 0 : new_edge->node[LOWER] = edge->node[LOWER];
1209 0 : list_add_tail(&new_edge->list[UPPER],
1210 : &new_node->lower);
1211 : }
1212 : } else {
1213 0 : list_add_tail(&new_node->lower, &cache->leaves);
1214 : }
1215 :
1216 0 : rb_node = tree_insert(&cache->rb_root, new_node->bytenr,
1217 : &new_node->rb_node);
1218 0 : if (rb_node)
1219 0 : backref_tree_panic(rb_node, -EEXIST, new_node->bytenr);
1220 :
1221 0 : if (!new_node->lowest) {
1222 0 : list_for_each_entry(new_edge, &new_node->lower, list[UPPER]) {
1223 0 : list_add_tail(&new_edge->list[LOWER],
1224 0 : &new_edge->node[LOWER]->upper);
1225 : }
1226 : }
1227 : return 0;
1228 : fail:
1229 0 : while (!list_empty(&new_node->lower)) {
1230 0 : new_edge = list_entry(new_node->lower.next,
1231 : struct backref_edge, list[UPPER]);
1232 0 : list_del(&new_edge->list[UPPER]);
1233 : free_backref_edge(cache, new_edge);
1234 : }
1235 : free_backref_node(cache, new_node);
1236 : return -ENOMEM;
1237 : }
1238 :
1239 : /*
1240 : * helper to add 'address of tree root -> reloc tree' mapping
1241 : */
1242 439 : static int __must_check __add_reloc_root(struct btrfs_root *root)
1243 : {
1244 : struct rb_node *rb_node;
1245 : struct mapping_node *node;
1246 439 : struct reloc_control *rc = root->fs_info->reloc_ctl;
1247 :
1248 : node = kmalloc(sizeof(*node), GFP_NOFS);
1249 439 : if (!node)
1250 : return -ENOMEM;
1251 :
1252 439 : node->bytenr = root->node->start;
1253 439 : node->data = root;
1254 :
1255 : spin_lock(&rc->reloc_root_tree.lock);
1256 439 : rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
1257 : node->bytenr, &node->rb_node);
1258 : spin_unlock(&rc->reloc_root_tree.lock);
1259 439 : if (rb_node) {
1260 0 : btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found "
1261 : "for start=%llu while inserting into relocation "
1262 : "tree", node->bytenr);
1263 : kfree(node);
1264 : return -EEXIST;
1265 : }
1266 :
1267 439 : list_add_tail(&root->root_list, &rc->reloc_roots);
1268 439 : return 0;
1269 : }
1270 :
1271 : /*
1272 : * helper to delete the 'address of tree root -> reloc tree'
1273 : * mapping
1274 : */
1275 439 : static void __del_reloc_root(struct btrfs_root *root)
1276 : {
1277 : struct rb_node *rb_node;
1278 : struct mapping_node *node = NULL;
1279 439 : struct reloc_control *rc = root->fs_info->reloc_ctl;
1280 :
1281 : spin_lock(&rc->reloc_root_tree.lock);
1282 439 : rb_node = tree_search(&rc->reloc_root_tree.rb_root,
1283 439 : root->node->start);
1284 439 : if (rb_node) {
1285 : node = rb_entry(rb_node, struct mapping_node, rb_node);
1286 439 : rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root);
1287 : }
1288 : spin_unlock(&rc->reloc_root_tree.lock);
1289 :
1290 439 : if (!node)
1291 439 : return;
1292 439 : BUG_ON((struct btrfs_root *)node->data != root);
1293 :
1294 439 : spin_lock(&root->fs_info->trans_lock);
1295 439 : list_del_init(&root->root_list);
1296 439 : spin_unlock(&root->fs_info->trans_lock);
1297 439 : kfree(node);
1298 : }
1299 :
1300 : /*
1301 : * helper to update the 'address of tree root -> reloc tree'
1302 : * mapping
1303 : */
1304 2 : static int __update_reloc_root(struct btrfs_root *root, u64 new_bytenr)
1305 : {
1306 : struct rb_node *rb_node;
1307 : struct mapping_node *node = NULL;
1308 2 : struct reloc_control *rc = root->fs_info->reloc_ctl;
1309 :
1310 : spin_lock(&rc->reloc_root_tree.lock);
1311 2 : rb_node = tree_search(&rc->reloc_root_tree.rb_root,
1312 2 : root->node->start);
1313 2 : if (rb_node) {
1314 : node = rb_entry(rb_node, struct mapping_node, rb_node);
1315 2 : rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root);
1316 : }
1317 : spin_unlock(&rc->reloc_root_tree.lock);
1318 :
1319 2 : if (!node)
1320 : return 0;
1321 2 : BUG_ON((struct btrfs_root *)node->data != root);
1322 :
1323 : spin_lock(&rc->reloc_root_tree.lock);
1324 2 : node->bytenr = new_bytenr;
1325 2 : rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
1326 : node->bytenr, &node->rb_node);
1327 : spin_unlock(&rc->reloc_root_tree.lock);
1328 2 : if (rb_node)
1329 0 : backref_tree_panic(rb_node, -EEXIST, node->bytenr);
1330 : return 0;
1331 : }
1332 :
1333 439 : static struct btrfs_root *create_reloc_root(struct btrfs_trans_handle *trans,
1334 : struct btrfs_root *root, u64 objectid)
1335 : {
1336 : struct btrfs_root *reloc_root;
1337 : struct extent_buffer *eb;
1338 : struct btrfs_root_item *root_item;
1339 : struct btrfs_key root_key;
1340 : u64 last_snap = 0;
1341 : int ret;
1342 :
1343 : root_item = kmalloc(sizeof(*root_item), GFP_NOFS);
1344 439 : BUG_ON(!root_item);
1345 :
1346 439 : root_key.objectid = BTRFS_TREE_RELOC_OBJECTID;
1347 439 : root_key.type = BTRFS_ROOT_ITEM_KEY;
1348 439 : root_key.offset = objectid;
1349 :
1350 439 : if (root->root_key.objectid == objectid) {
1351 : /* called by btrfs_init_reloc_root */
1352 429 : ret = btrfs_copy_root(trans, root, root->commit_root, &eb,
1353 : BTRFS_TREE_RELOC_OBJECTID);
1354 429 : BUG_ON(ret);
1355 :
1356 : last_snap = btrfs_root_last_snapshot(&root->root_item);
1357 429 : btrfs_set_root_last_snapshot(&root->root_item,
1358 429 : trans->transid - 1);
1359 : } else {
1360 : /*
1361 : * called by btrfs_reloc_post_snapshot_hook.
1362 : * the source tree is a reloc tree, all tree blocks
1363 : * modified after it was created have RELOC flag
1364 : * set in their headers. so it's OK to not update
1365 : * the 'last_snapshot'.
1366 : */
1367 10 : ret = btrfs_copy_root(trans, root, root->node, &eb,
1368 : BTRFS_TREE_RELOC_OBJECTID);
1369 10 : BUG_ON(ret);
1370 : }
1371 :
1372 439 : memcpy(root_item, &root->root_item, sizeof(*root_item));
1373 878 : btrfs_set_root_bytenr(root_item, eb->start);
1374 : btrfs_set_root_level(root_item, btrfs_header_level(eb));
1375 439 : btrfs_set_root_generation(root_item, trans->transid);
1376 :
1377 439 : if (root->root_key.objectid == objectid) {
1378 : btrfs_set_root_refs(root_item, 0);
1379 429 : memset(&root_item->drop_progress, 0,
1380 : sizeof(struct btrfs_disk_key));
1381 429 : root_item->drop_level = 0;
1382 : /*
1383 : * abuse rtransid, it is safe because it is impossible to
1384 : * receive data into a relocation tree.
1385 : */
1386 : btrfs_set_root_rtransid(root_item, last_snap);
1387 429 : btrfs_set_root_otransid(root_item, trans->transid);
1388 : }
1389 :
1390 439 : btrfs_tree_unlock(eb);
1391 439 : free_extent_buffer(eb);
1392 :
1393 439 : ret = btrfs_insert_root(trans, root->fs_info->tree_root,
1394 : &root_key, root_item);
1395 439 : BUG_ON(ret);
1396 439 : kfree(root_item);
1397 :
1398 439 : reloc_root = btrfs_read_fs_root(root->fs_info->tree_root, &root_key);
1399 439 : BUG_ON(IS_ERR(reloc_root));
1400 439 : reloc_root->last_trans = trans->transid;
1401 439 : return reloc_root;
1402 : }
1403 :
1404 : /*
1405 : * create reloc tree for a given fs tree. reloc tree is just a
1406 : * snapshot of the fs tree with special root objectid.
1407 : */
1408 2547 : int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,
1409 : struct btrfs_root *root)
1410 : {
1411 : struct btrfs_root *reloc_root;
1412 2547 : struct reloc_control *rc = root->fs_info->reloc_ctl;
1413 : struct btrfs_block_rsv *rsv;
1414 : int clear_rsv = 0;
1415 : int ret;
1416 :
1417 2547 : if (root->reloc_root) {
1418 : reloc_root = root->reloc_root;
1419 446 : reloc_root->last_trans = trans->transid;
1420 446 : return 0;
1421 : }
1422 :
1423 2530 : if (!rc || !rc->create_reloc_tree ||
1424 429 : root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
1425 : return 0;
1426 :
1427 429 : if (!trans->reloc_reserved) {
1428 427 : rsv = trans->block_rsv;
1429 427 : trans->block_rsv = rc->block_rsv;
1430 : clear_rsv = 1;
1431 : }
1432 429 : reloc_root = create_reloc_root(trans, root, root->root_key.objectid);
1433 429 : if (clear_rsv)
1434 427 : trans->block_rsv = rsv;
1435 :
1436 429 : ret = __add_reloc_root(reloc_root);
1437 429 : BUG_ON(ret < 0);
1438 429 : root->reloc_root = reloc_root;
1439 429 : return 0;
1440 : }
1441 :
1442 : /*
1443 : * update root item of reloc tree
1444 : */
1445 3422 : int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
1446 : struct btrfs_root *root)
1447 : {
1448 : struct btrfs_root *reloc_root;
1449 : struct btrfs_root_item *root_item;
1450 : int ret;
1451 :
1452 3422 : if (!root->reloc_root)
1453 : goto out;
1454 :
1455 : reloc_root = root->reloc_root;
1456 1310 : root_item = &reloc_root->root_item;
1457 :
1458 2609 : if (root->fs_info->reloc_ctl->merge_reloc_tree &&
1459 : btrfs_root_refs(root_item) == 0) {
1460 439 : root->reloc_root = NULL;
1461 439 : __del_reloc_root(reloc_root);
1462 : }
1463 :
1464 1310 : if (reloc_root->commit_root != reloc_root->node) {
1465 2 : btrfs_set_root_node(root_item, reloc_root->node);
1466 2 : free_extent_buffer(reloc_root->commit_root);
1467 2 : reloc_root->commit_root = btrfs_root_node(reloc_root);
1468 : }
1469 :
1470 1310 : ret = btrfs_update_root(trans, root->fs_info->tree_root,
1471 : &reloc_root->root_key, root_item);
1472 1310 : BUG_ON(ret);
1473 :
1474 : out:
1475 3422 : return 0;
1476 : }
1477 :
1478 : /*
1479 : * helper to find first cached inode with inode number >= objectid
1480 : * in a subvolume
1481 : */
1482 109 : static struct inode *find_next_inode(struct btrfs_root *root, u64 objectid)
1483 : {
1484 : struct rb_node *node;
1485 : struct rb_node *prev;
1486 : struct btrfs_inode *entry;
1487 : struct inode *inode;
1488 :
1489 : spin_lock(&root->inode_lock);
1490 : again:
1491 109 : node = root->inode_tree.rb_node;
1492 : prev = NULL;
1493 945 : while (node) {
1494 : prev = node;
1495 : entry = rb_entry(node, struct btrfs_inode, rb_node);
1496 :
1497 835 : if (objectid < btrfs_ino(&entry->vfs_inode))
1498 201 : node = node->rb_left;
1499 634 : else if (objectid > btrfs_ino(&entry->vfs_inode))
1500 526 : node = node->rb_right;
1501 : else
1502 : break;
1503 : }
1504 109 : if (!node) {
1505 2 : while (prev) {
1506 : entry = rb_entry(prev, struct btrfs_inode, rb_node);
1507 1 : if (objectid <= btrfs_ino(&entry->vfs_inode)) {
1508 : node = prev;
1509 : break;
1510 : }
1511 1 : prev = rb_next(prev);
1512 : }
1513 : }
1514 109 : while (node) {
1515 : entry = rb_entry(node, struct btrfs_inode, rb_node);
1516 108 : inode = igrab(&entry->vfs_inode);
1517 108 : if (inode) {
1518 : spin_unlock(&root->inode_lock);
1519 108 : return inode;
1520 : }
1521 :
1522 0 : objectid = btrfs_ino(&entry->vfs_inode) + 1;
1523 0 : if (cond_resched_lock(&root->inode_lock))
1524 : goto again;
1525 :
1526 0 : node = rb_next(node);
1527 : }
1528 : spin_unlock(&root->inode_lock);
1529 1 : return NULL;
1530 : }
1531 :
1532 : static int in_block_group(u64 bytenr,
1533 : struct btrfs_block_group_cache *block_group)
1534 : {
1535 2058 : if (bytenr >= block_group->key.objectid &&
1536 1029 : bytenr < block_group->key.objectid + block_group->key.offset)
1537 : return 1;
1538 : return 0;
1539 : }
1540 :
1541 : /*
1542 : * get new location of data
1543 : */
1544 1023 : static int get_new_location(struct inode *reloc_inode, u64 *new_bytenr,
1545 : u64 bytenr, u64 num_bytes)
1546 : {
1547 1023 : struct btrfs_root *root = BTRFS_I(reloc_inode)->root;
1548 : struct btrfs_path *path;
1549 : struct btrfs_file_extent_item *fi;
1550 : struct extent_buffer *leaf;
1551 : int ret;
1552 :
1553 1023 : path = btrfs_alloc_path();
1554 1023 : if (!path)
1555 : return -ENOMEM;
1556 :
1557 1023 : bytenr -= BTRFS_I(reloc_inode)->index_cnt;
1558 1023 : ret = btrfs_lookup_file_extent(NULL, root, path, btrfs_ino(reloc_inode),
1559 : bytenr, 0);
1560 1023 : if (ret < 0)
1561 : goto out;
1562 1023 : if (ret > 0) {
1563 : ret = -ENOENT;
1564 : goto out;
1565 : }
1566 :
1567 1023 : leaf = path->nodes[0];
1568 2046 : fi = btrfs_item_ptr(leaf, path->slots[0],
1569 : struct btrfs_file_extent_item);
1570 :
1571 4092 : BUG_ON(btrfs_file_extent_offset(leaf, fi) ||
1572 : btrfs_file_extent_compression(leaf, fi) ||
1573 : btrfs_file_extent_encryption(leaf, fi) ||
1574 : btrfs_file_extent_other_encoding(leaf, fi));
1575 :
1576 1023 : if (num_bytes != btrfs_file_extent_disk_num_bytes(leaf, fi)) {
1577 : ret = -EINVAL;
1578 : goto out;
1579 : }
1580 :
1581 1023 : *new_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
1582 : ret = 0;
1583 : out:
1584 1023 : btrfs_free_path(path);
1585 1023 : return ret;
1586 : }
1587 :
1588 : /*
1589 : * update file extent items in the tree leaf to point to
1590 : * the new locations.
1591 : */
1592 : static noinline_for_stack
1593 8 : int replace_file_extents(struct btrfs_trans_handle *trans,
1594 : struct reloc_control *rc,
1595 : struct btrfs_root *root,
1596 2054 : struct extent_buffer *leaf)
1597 : {
1598 : struct btrfs_key key;
1599 : struct btrfs_file_extent_item *fi;
1600 : struct inode *inode = NULL;
1601 : u64 parent;
1602 : u64 bytenr;
1603 8 : u64 new_bytenr = 0;
1604 : u64 num_bytes;
1605 : u64 end;
1606 : u32 nritems;
1607 : u32 i;
1608 : int ret = 0;
1609 : int first = 1;
1610 : int dirty = 0;
1611 :
1612 8 : if (rc->stage != UPDATE_DATA_PTRS)
1613 : return 0;
1614 :
1615 : /* reloc trees always use full backref */
1616 8 : if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
1617 7 : parent = leaf->start;
1618 : else
1619 : parent = 0;
1620 :
1621 : nritems = btrfs_header_nritems(leaf);
1622 1290 : for (i = 0; i < nritems; i++) {
1623 1282 : cond_resched();
1624 1282 : btrfs_item_key_to_cpu(leaf, &key, i);
1625 1282 : if (key.type != BTRFS_EXTENT_DATA_KEY)
1626 208 : continue;
1627 1074 : fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item);
1628 1074 : if (btrfs_file_extent_type(leaf, fi) ==
1629 : BTRFS_FILE_EXTENT_INLINE)
1630 0 : continue;
1631 : bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
1632 : num_bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
1633 1074 : if (bytenr == 0)
1634 51 : continue;
1635 2046 : if (!in_block_group(bytenr, rc->block_group))
1636 0 : continue;
1637 :
1638 : /*
1639 : * if we are modifying block in fs tree, wait for readpage
1640 : * to complete and drop the extent cache
1641 : */
1642 1023 : if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
1643 3 : if (first) {
1644 1 : inode = find_next_inode(root, key.objectid);
1645 : first = 0;
1646 4 : } else if (inode && btrfs_ino(inode) < key.objectid) {
1647 0 : btrfs_add_delayed_iput(inode);
1648 0 : inode = find_next_inode(root, key.objectid);
1649 : }
1650 6 : if (inode && btrfs_ino(inode) == key.objectid) {
1651 6 : end = key.offset +
1652 : btrfs_file_extent_num_bytes(leaf, fi);
1653 3 : WARN_ON(!IS_ALIGNED(key.offset,
1654 : root->sectorsize));
1655 3 : WARN_ON(!IS_ALIGNED(end, root->sectorsize));
1656 3 : end--;
1657 3 : ret = try_lock_extent(&BTRFS_I(inode)->io_tree,
1658 : key.offset, end);
1659 3 : if (!ret)
1660 0 : continue;
1661 :
1662 3 : btrfs_drop_extent_cache(inode, key.offset, end,
1663 : 1);
1664 3 : unlock_extent(&BTRFS_I(inode)->io_tree,
1665 : key.offset, end);
1666 : }
1667 : }
1668 :
1669 1023 : ret = get_new_location(rc->data_inode, &new_bytenr,
1670 : bytenr, num_bytes);
1671 1023 : if (ret) {
1672 : /*
1673 : * Don't have to abort since we've not changed anything
1674 : * in the file extent yet.
1675 : */
1676 : break;
1677 : }
1678 :
1679 1023 : btrfs_set_file_extent_disk_bytenr(leaf, fi, new_bytenr);
1680 : dirty = 1;
1681 :
1682 2046 : key.offset -= btrfs_file_extent_offset(leaf, fi);
1683 2046 : ret = btrfs_inc_extent_ref(trans, root, new_bytenr,
1684 : num_bytes, parent,
1685 : btrfs_header_owner(leaf),
1686 : key.objectid, key.offset, 1);
1687 1023 : if (ret) {
1688 0 : btrfs_abort_transaction(trans, root, ret);
1689 0 : break;
1690 : }
1691 :
1692 2046 : ret = btrfs_free_extent(trans, root, bytenr, num_bytes,
1693 : parent, btrfs_header_owner(leaf),
1694 : key.objectid, key.offset, 1);
1695 1023 : if (ret) {
1696 0 : btrfs_abort_transaction(trans, root, ret);
1697 0 : break;
1698 : }
1699 : }
1700 8 : if (dirty)
1701 8 : btrfs_mark_buffer_dirty(leaf);
1702 8 : if (inode)
1703 1 : btrfs_add_delayed_iput(inode);
1704 8 : return ret;
1705 : }
1706 :
1707 : static noinline_for_stack
1708 32 : int memcmp_node_keys(struct extent_buffer *eb, int slot,
1709 : struct btrfs_path *path, int level)
1710 : {
1711 : struct btrfs_disk_key key1;
1712 : struct btrfs_disk_key key2;
1713 32 : btrfs_node_key(eb, &key1, slot);
1714 32 : btrfs_node_key(path->nodes[level], &key2, path->slots[level]);
1715 32 : return memcmp(&key1, &key2, sizeof(key1));
1716 : }
1717 :
1718 : /*
1719 : * try to replace tree blocks in fs tree with the new blocks
1720 : * in reloc tree. tree blocks haven't been modified since the
1721 : * reloc tree was create can be replaced.
1722 : *
1723 : * if a block was replaced, level of the block + 1 is returned.
1724 : * if no block got replaced, 0 is returned. if there are other
1725 : * errors, a negative error number is returned.
1726 : */
1727 : static noinline_for_stack
1728 16 : int replace_path(struct btrfs_trans_handle *trans,
1729 32 : struct btrfs_root *dest, struct btrfs_root *src,
1730 : struct btrfs_path *path, struct btrfs_key *next_key,
1731 : int lowest_level, int max_level)
1732 : {
1733 : struct extent_buffer *eb;
1734 64 : struct extent_buffer *parent;
1735 : struct btrfs_key key;
1736 : u64 old_bytenr;
1737 : u64 new_bytenr;
1738 : u64 old_ptr_gen;
1739 : u64 new_ptr_gen;
1740 : u64 last_snapshot;
1741 : u32 blocksize;
1742 : int cow = 0;
1743 : int level;
1744 : int ret;
1745 : int slot;
1746 :
1747 16 : BUG_ON(src->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID);
1748 16 : BUG_ON(dest->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID);
1749 :
1750 : last_snapshot = btrfs_root_last_snapshot(&src->root_item);
1751 : again:
1752 32 : slot = path->slots[lowest_level];
1753 32 : btrfs_node_key_to_cpu(path->nodes[lowest_level], &key, slot);
1754 :
1755 32 : eb = btrfs_lock_root_node(dest);
1756 32 : btrfs_set_lock_blocking(eb);
1757 64 : level = btrfs_header_level(eb);
1758 :
1759 32 : if (level < lowest_level) {
1760 0 : btrfs_tree_unlock(eb);
1761 0 : free_extent_buffer(eb);
1762 0 : return 0;
1763 : }
1764 :
1765 32 : if (cow) {
1766 16 : ret = btrfs_cow_block(trans, dest, eb, NULL, 0, &eb);
1767 16 : BUG_ON(ret);
1768 : }
1769 32 : btrfs_set_lock_blocking(eb);
1770 :
1771 32 : if (next_key) {
1772 32 : next_key->objectid = (u64)-1;
1773 32 : next_key->type = (u8)-1;
1774 32 : next_key->offset = (u64)-1;
1775 : }
1776 :
1777 32 : parent = eb;
1778 : while (1) {
1779 32 : level = btrfs_header_level(parent);
1780 32 : BUG_ON(level < lowest_level);
1781 :
1782 32 : ret = btrfs_bin_search(parent, &key, level, &slot);
1783 32 : if (ret && slot > 0)
1784 0 : slot--;
1785 :
1786 64 : if (next_key && slot + 1 < btrfs_header_nritems(parent))
1787 : btrfs_node_key_to_cpu(parent, next_key, slot + 1);
1788 :
1789 32 : old_bytenr = btrfs_node_blockptr(parent, slot);
1790 : blocksize = btrfs_level_size(dest, level - 1);
1791 32 : old_ptr_gen = btrfs_node_ptr_generation(parent, slot);
1792 :
1793 32 : if (level <= max_level) {
1794 32 : eb = path->nodes[level];
1795 32 : new_bytenr = btrfs_node_blockptr(eb,
1796 : path->slots[level]);
1797 32 : new_ptr_gen = btrfs_node_ptr_generation(eb,
1798 : path->slots[level]);
1799 : } else {
1800 : new_bytenr = 0;
1801 : new_ptr_gen = 0;
1802 : }
1803 :
1804 32 : if (WARN_ON(new_bytenr > 0 && new_bytenr == old_bytenr)) {
1805 : ret = level;
1806 : break;
1807 : }
1808 :
1809 64 : if (new_bytenr == 0 || old_ptr_gen > last_snapshot ||
1810 32 : memcmp_node_keys(parent, slot, path, level)) {
1811 0 : if (level <= lowest_level) {
1812 : ret = 0;
1813 : break;
1814 : }
1815 :
1816 0 : eb = read_tree_block(dest, old_bytenr, blocksize,
1817 : old_ptr_gen);
1818 0 : if (!eb || !extent_buffer_uptodate(eb)) {
1819 0 : ret = (!eb) ? -ENOMEM : -EIO;
1820 0 : free_extent_buffer(eb);
1821 0 : break;
1822 : }
1823 0 : btrfs_tree_lock(eb);
1824 0 : if (cow) {
1825 0 : ret = btrfs_cow_block(trans, dest, eb, parent,
1826 : slot, &eb);
1827 0 : BUG_ON(ret);
1828 : }
1829 0 : btrfs_set_lock_blocking(eb);
1830 :
1831 0 : btrfs_tree_unlock(parent);
1832 0 : free_extent_buffer(parent);
1833 :
1834 0 : parent = eb;
1835 0 : continue;
1836 : }
1837 :
1838 32 : if (!cow) {
1839 16 : btrfs_tree_unlock(parent);
1840 16 : free_extent_buffer(parent);
1841 : cow = 1;
1842 16 : goto again;
1843 : }
1844 :
1845 16 : btrfs_node_key_to_cpu(path->nodes[level], &key,
1846 : path->slots[level]);
1847 16 : btrfs_release_path(path);
1848 :
1849 16 : path->lowest_level = level;
1850 16 : ret = btrfs_search_slot(trans, src, &key, path, 0, 1);
1851 16 : path->lowest_level = 0;
1852 16 : BUG_ON(ret);
1853 :
1854 : /*
1855 : * swap blocks in fs tree and reloc tree.
1856 : */
1857 16 : btrfs_set_node_blockptr(parent, slot, new_bytenr);
1858 16 : btrfs_set_node_ptr_generation(parent, slot, new_ptr_gen);
1859 16 : btrfs_mark_buffer_dirty(parent);
1860 :
1861 16 : btrfs_set_node_blockptr(path->nodes[level],
1862 : path->slots[level], old_bytenr);
1863 16 : btrfs_set_node_ptr_generation(path->nodes[level],
1864 : path->slots[level], old_ptr_gen);
1865 16 : btrfs_mark_buffer_dirty(path->nodes[level]);
1866 :
1867 32 : ret = btrfs_inc_extent_ref(trans, src, old_bytenr, blocksize,
1868 16 : path->nodes[level]->start,
1869 16 : src->root_key.objectid, level - 1, 0,
1870 : 1);
1871 16 : BUG_ON(ret);
1872 16 : ret = btrfs_inc_extent_ref(trans, dest, new_bytenr, blocksize,
1873 : 0, dest->root_key.objectid, level - 1,
1874 : 0, 1);
1875 16 : BUG_ON(ret);
1876 :
1877 32 : ret = btrfs_free_extent(trans, src, new_bytenr, blocksize,
1878 16 : path->nodes[level]->start,
1879 : src->root_key.objectid, level - 1, 0,
1880 : 1);
1881 16 : BUG_ON(ret);
1882 :
1883 16 : ret = btrfs_free_extent(trans, dest, old_bytenr, blocksize,
1884 : 0, dest->root_key.objectid, level - 1,
1885 : 0, 1);
1886 16 : BUG_ON(ret);
1887 :
1888 16 : btrfs_unlock_up_safe(path, 0);
1889 :
1890 : ret = level;
1891 16 : break;
1892 0 : }
1893 16 : btrfs_tree_unlock(parent);
1894 16 : free_extent_buffer(parent);
1895 16 : return ret;
1896 : }
1897 :
1898 : /*
1899 : * helper to find next relocated block in reloc tree
1900 : */
1901 : static noinline_for_stack
1902 16 : int walk_up_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
1903 : int *level)
1904 : {
1905 16 : struct extent_buffer *eb;
1906 : int i;
1907 : u64 last_snapshot;
1908 : u32 nritems;
1909 :
1910 : last_snapshot = btrfs_root_last_snapshot(&root->root_item);
1911 :
1912 32 : for (i = 0; i < *level; i++) {
1913 16 : free_extent_buffer(path->nodes[i]);
1914 16 : path->nodes[i] = NULL;
1915 : }
1916 :
1917 2 : for (i = *level; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) {
1918 : eb = path->nodes[i];
1919 : nritems = btrfs_header_nritems(eb);
1920 32 : while (path->slots[i] + 1 < nritems) {
1921 14 : path->slots[i]++;
1922 14 : if (btrfs_node_ptr_generation(eb, path->slots[i]) <=
1923 : last_snapshot)
1924 0 : continue;
1925 :
1926 14 : *level = i;
1927 14 : return 0;
1928 : }
1929 2 : free_extent_buffer(path->nodes[i]);
1930 2 : path->nodes[i] = NULL;
1931 : }
1932 : return 1;
1933 : }
1934 :
1935 : /*
1936 : * walk down reloc tree to find relocated block of lowest level
1937 : */
1938 : static noinline_for_stack
1939 453 : int walk_down_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
1940 : int *level)
1941 : {
1942 16 : struct extent_buffer *eb = NULL;
1943 : int i;
1944 : u64 bytenr;
1945 : u64 ptr_gen = 0;
1946 : u64 last_snapshot;
1947 : u32 blocksize;
1948 : u32 nritems;
1949 :
1950 : last_snapshot = btrfs_root_last_snapshot(&root->root_item);
1951 :
1952 906 : for (i = *level; i > 0; i--) {
1953 16 : eb = path->nodes[i];
1954 : nritems = btrfs_header_nritems(eb);
1955 34 : while (path->slots[i] < nritems) {
1956 : ptr_gen = btrfs_node_ptr_generation(eb, path->slots[i]);
1957 18 : if (ptr_gen > last_snapshot)
1958 : break;
1959 2 : path->slots[i]++;
1960 : }
1961 16 : if (path->slots[i] >= nritems) {
1962 0 : if (i == *level)
1963 : break;
1964 0 : *level = i + 1;
1965 0 : return 0;
1966 : }
1967 16 : if (i == 1) {
1968 16 : *level = i;
1969 16 : return 0;
1970 : }
1971 :
1972 : bytenr = btrfs_node_blockptr(eb, path->slots[i]);
1973 : blocksize = btrfs_level_size(root, i - 1);
1974 0 : eb = read_tree_block(root, bytenr, blocksize, ptr_gen);
1975 0 : if (!eb || !extent_buffer_uptodate(eb)) {
1976 0 : free_extent_buffer(eb);
1977 0 : return -EIO;
1978 : }
1979 0 : BUG_ON(btrfs_header_level(eb) != i - 1);
1980 0 : path->nodes[i - 1] = eb;
1981 0 : path->slots[i - 1] = 0;
1982 : }
1983 : return 1;
1984 : }
1985 :
1986 : /*
1987 : * invalidate extent cache for file extents whose key in range of
1988 : * [min_key, max_key)
1989 : */
1990 7 : static int invalidate_extent_cache(struct btrfs_root *root,
1991 : struct btrfs_key *min_key,
1992 : struct btrfs_key *max_key)
1993 : {
1994 : struct inode *inode = NULL;
1995 : u64 objectid;
1996 : u64 start, end;
1997 : u64 ino;
1998 :
1999 7 : objectid = min_key->objectid;
2000 : while (1) {
2001 114 : cond_resched();
2002 114 : iput(inode);
2003 :
2004 114 : if (objectid > max_key->objectid)
2005 : break;
2006 :
2007 108 : inode = find_next_inode(root, objectid);
2008 108 : if (!inode)
2009 : break;
2010 : ino = btrfs_ino(inode);
2011 :
2012 107 : if (ino > max_key->objectid) {
2013 0 : iput(inode);
2014 0 : break;
2015 : }
2016 :
2017 107 : objectid = ino + 1;
2018 107 : if (!S_ISREG(inode->i_mode))
2019 0 : continue;
2020 :
2021 107 : if (unlikely(min_key->objectid == ino)) {
2022 7 : if (min_key->type > BTRFS_EXTENT_DATA_KEY)
2023 0 : continue;
2024 7 : if (min_key->type < BTRFS_EXTENT_DATA_KEY)
2025 : start = 0;
2026 : else {
2027 5 : start = min_key->offset;
2028 5 : WARN_ON(!IS_ALIGNED(start, root->sectorsize));
2029 : }
2030 : } else {
2031 : start = 0;
2032 : }
2033 :
2034 107 : if (unlikely(max_key->objectid == ino)) {
2035 6 : if (max_key->type < BTRFS_EXTENT_DATA_KEY)
2036 1 : continue;
2037 5 : if (max_key->type > BTRFS_EXTENT_DATA_KEY) {
2038 : end = (u64)-1;
2039 : } else {
2040 5 : if (max_key->offset == 0)
2041 0 : continue;
2042 : end = max_key->offset;
2043 5 : WARN_ON(!IS_ALIGNED(end, root->sectorsize));
2044 5 : end--;
2045 : }
2046 : } else {
2047 : end = (u64)-1;
2048 : }
2049 :
2050 : /* the lock_extent waits for readpage to complete */
2051 106 : lock_extent(&BTRFS_I(inode)->io_tree, start, end);
2052 106 : btrfs_drop_extent_cache(inode, start, end, 1);
2053 106 : unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
2054 : }
2055 7 : return 0;
2056 : }
2057 :
2058 16 : static int find_next_key(struct btrfs_path *path, int level,
2059 : struct btrfs_key *key)
2060 :
2061 : {
2062 34 : while (level < BTRFS_MAX_LEVEL) {
2063 34 : if (!path->nodes[level])
2064 : break;
2065 32 : if (path->slots[level] + 1 <
2066 : btrfs_header_nritems(path->nodes[level])) {
2067 : btrfs_node_key_to_cpu(path->nodes[level], key,
2068 : path->slots[level] + 1);
2069 14 : return 0;
2070 : }
2071 2 : level++;
2072 : }
2073 : return 1;
2074 : }
2075 :
2076 : /*
2077 : * merge the relocated tree blocks in reloc tree with corresponding
2078 : * fs tree.
2079 : */
2080 439 : static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
2081 : struct btrfs_root *root)
2082 : {
2083 439 : LIST_HEAD(inode_list);
2084 : struct btrfs_key key;
2085 : struct btrfs_key next_key;
2086 : struct btrfs_trans_handle *trans = NULL;
2087 : struct btrfs_root *reloc_root;
2088 439 : struct btrfs_root_item *root_item;
2089 : struct btrfs_path *path;
2090 : struct extent_buffer *leaf;
2091 : int level;
2092 : int max_level;
2093 : int replaced = 0;
2094 : int ret;
2095 : int err = 0;
2096 : u32 min_reserved;
2097 :
2098 439 : path = btrfs_alloc_path();
2099 439 : if (!path)
2100 : return -ENOMEM;
2101 439 : path->reada = 1;
2102 :
2103 439 : reloc_root = root->reloc_root;
2104 : root_item = &reloc_root->root_item;
2105 :
2106 439 : if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
2107 439 : level = btrfs_root_level(root_item);
2108 439 : extent_buffer_get(reloc_root->node);
2109 439 : path->nodes[level] = reloc_root->node;
2110 439 : path->slots[level] = 0;
2111 : } else {
2112 : btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
2113 :
2114 0 : level = root_item->drop_level;
2115 0 : BUG_ON(level == 0);
2116 0 : path->lowest_level = level;
2117 0 : ret = btrfs_search_slot(NULL, reloc_root, &key, path, 0, 0);
2118 0 : path->lowest_level = 0;
2119 0 : if (ret < 0) {
2120 0 : btrfs_free_path(path);
2121 0 : return ret;
2122 : }
2123 :
2124 0 : btrfs_node_key_to_cpu(path->nodes[level], &next_key,
2125 : path->slots[level]);
2126 0 : WARN_ON(memcmp(&key, &next_key, sizeof(key)));
2127 :
2128 0 : btrfs_unlock_up_safe(path, 0);
2129 : }
2130 :
2131 439 : min_reserved = root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
2132 439 : memset(&next_key, 0, sizeof(next_key));
2133 :
2134 : while (1) {
2135 453 : ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved,
2136 : BTRFS_RESERVE_FLUSH_ALL);
2137 453 : if (ret) {
2138 : err = ret;
2139 : goto out;
2140 : }
2141 453 : trans = btrfs_start_transaction(root, 0);
2142 453 : if (IS_ERR(trans)) {
2143 0 : err = PTR_ERR(trans);
2144 : trans = NULL;
2145 0 : goto out;
2146 : }
2147 453 : trans->block_rsv = rc->block_rsv;
2148 :
2149 : replaced = 0;
2150 453 : max_level = level;
2151 :
2152 453 : ret = walk_down_reloc_tree(reloc_root, path, &level);
2153 453 : if (ret < 0) {
2154 : err = ret;
2155 : goto out;
2156 : }
2157 453 : if (ret > 0)
2158 : break;
2159 :
2160 30 : if (!find_next_key(path, level, &key) &&
2161 14 : btrfs_comp_cpu_keys(&next_key, &key) >= 0) {
2162 : ret = 0;
2163 : } else {
2164 16 : ret = replace_path(trans, root, reloc_root, path,
2165 : &next_key, level, max_level);
2166 : }
2167 16 : if (ret < 0) {
2168 : err = ret;
2169 : goto out;
2170 : }
2171 :
2172 16 : if (ret > 0) {
2173 16 : level = ret;
2174 16 : btrfs_node_key_to_cpu(path->nodes[level], &key,
2175 : path->slots[level]);
2176 : replaced = 1;
2177 : }
2178 :
2179 16 : ret = walk_up_reloc_tree(reloc_root, path, &level);
2180 16 : if (ret > 0)
2181 : break;
2182 :
2183 14 : BUG_ON(level == 0);
2184 : /*
2185 : * save the merging progress in the drop_progress.
2186 : * this is OK since root refs == 1 in this case.
2187 : */
2188 14 : btrfs_node_key(path->nodes[level], &root_item->drop_progress,
2189 : path->slots[level]);
2190 14 : root_item->drop_level = level;
2191 :
2192 14 : btrfs_end_transaction_throttle(trans, root);
2193 : trans = NULL;
2194 :
2195 14 : btrfs_btree_balance_dirty(root);
2196 :
2197 14 : if (replaced && rc->stage == UPDATE_DATA_PTRS)
2198 6 : invalidate_extent_cache(root, &key, &next_key);
2199 : }
2200 :
2201 : /*
2202 : * handle the case only one block in the fs tree need to be
2203 : * relocated and the block is tree root.
2204 : */
2205 439 : leaf = btrfs_lock_root_node(root);
2206 439 : ret = btrfs_cow_block(trans, root, leaf, NULL, 0, &leaf);
2207 439 : btrfs_tree_unlock(leaf);
2208 439 : free_extent_buffer(leaf);
2209 439 : if (ret < 0)
2210 : err = ret;
2211 : out:
2212 439 : btrfs_free_path(path);
2213 :
2214 439 : if (err == 0) {
2215 439 : memset(&root_item->drop_progress, 0,
2216 : sizeof(root_item->drop_progress));
2217 439 : root_item->drop_level = 0;
2218 : btrfs_set_root_refs(root_item, 0);
2219 439 : btrfs_update_reloc_root(trans, root);
2220 : }
2221 :
2222 439 : if (trans)
2223 439 : btrfs_end_transaction_throttle(trans, root);
2224 :
2225 439 : btrfs_btree_balance_dirty(root);
2226 :
2227 439 : if (replaced && rc->stage == UPDATE_DATA_PTRS)
2228 1 : invalidate_extent_cache(root, &key, &next_key);
2229 :
2230 439 : return err;
2231 : }
2232 :
2233 : static noinline_for_stack
2234 120 : int prepare_to_merge(struct reloc_control *rc, int err)
2235 : {
2236 120 : struct btrfs_root *root = rc->extent_root;
2237 : struct btrfs_root *reloc_root;
2238 : struct btrfs_trans_handle *trans;
2239 120 : LIST_HEAD(reloc_roots);
2240 : u64 num_bytes = 0;
2241 : int ret;
2242 :
2243 120 : mutex_lock(&root->fs_info->reloc_mutex);
2244 120 : rc->merging_rsv_size += root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
2245 120 : rc->merging_rsv_size += rc->nodes_relocated * 2;
2246 120 : mutex_unlock(&root->fs_info->reloc_mutex);
2247 :
2248 : again:
2249 120 : if (!err) {
2250 120 : num_bytes = rc->merging_rsv_size;
2251 120 : ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes,
2252 : BTRFS_RESERVE_FLUSH_ALL);
2253 120 : if (ret)
2254 : err = ret;
2255 : }
2256 :
2257 120 : trans = btrfs_join_transaction(rc->extent_root);
2258 120 : if (IS_ERR(trans)) {
2259 0 : if (!err)
2260 0 : btrfs_block_rsv_release(rc->extent_root,
2261 : rc->block_rsv, num_bytes);
2262 0 : return PTR_ERR(trans);
2263 : }
2264 :
2265 120 : if (!err) {
2266 120 : if (num_bytes != rc->merging_rsv_size) {
2267 0 : btrfs_end_transaction(trans, rc->extent_root);
2268 0 : btrfs_block_rsv_release(rc->extent_root,
2269 : rc->block_rsv, num_bytes);
2270 0 : goto again;
2271 : }
2272 : }
2273 :
2274 120 : rc->merge_reloc_tree = 1;
2275 :
2276 1230 : while (!list_empty(&rc->reloc_roots)) {
2277 435 : reloc_root = list_entry(rc->reloc_roots.next,
2278 : struct btrfs_root, root_list);
2279 435 : list_del_init(&reloc_root->root_list);
2280 :
2281 435 : root = read_fs_root(reloc_root->fs_info,
2282 : reloc_root->root_key.offset);
2283 435 : BUG_ON(IS_ERR(root));
2284 435 : BUG_ON(root->reloc_root != reloc_root);
2285 :
2286 : /*
2287 : * set reference count to 1, so btrfs_recover_relocation
2288 : * knows it should resumes merging
2289 : */
2290 435 : if (!err)
2291 : btrfs_set_root_refs(&reloc_root->root_item, 1);
2292 435 : btrfs_update_reloc_root(trans, root);
2293 :
2294 : list_add(&reloc_root->root_list, &reloc_roots);
2295 : }
2296 :
2297 : list_splice(&reloc_roots, &rc->reloc_roots);
2298 :
2299 120 : if (!err)
2300 120 : btrfs_commit_transaction(trans, rc->extent_root);
2301 : else
2302 0 : btrfs_end_transaction(trans, rc->extent_root);
2303 120 : return err;
2304 : }
2305 :
2306 : static noinline_for_stack
2307 0 : void free_reloc_roots(struct list_head *list)
2308 : {
2309 : struct btrfs_root *reloc_root;
2310 :
2311 0 : while (!list_empty(list)) {
2312 0 : reloc_root = list_entry(list->next, struct btrfs_root,
2313 : root_list);
2314 0 : __del_reloc_root(reloc_root);
2315 : }
2316 0 : }
2317 :
2318 : static noinline_for_stack
2319 120 : int merge_reloc_roots(struct reloc_control *rc)
2320 : {
2321 : struct btrfs_root *root;
2322 : struct btrfs_root *reloc_root;
2323 : u64 last_snap;
2324 : u64 otransid;
2325 : u64 objectid;
2326 120 : LIST_HEAD(reloc_roots);
2327 : int found = 0;
2328 : int ret = 0;
2329 : again:
2330 156 : root = rc->extent_root;
2331 :
2332 : /*
2333 : * this serializes us with btrfs_record_root_in_transaction,
2334 : * we have to make sure nobody is in the middle of
2335 : * adding their roots to the list while we are
2336 : * doing this splice
2337 : */
2338 156 : mutex_lock(&root->fs_info->reloc_mutex);
2339 156 : list_splice_init(&rc->reloc_roots, &reloc_roots);
2340 156 : mutex_unlock(&root->fs_info->reloc_mutex);
2341 :
2342 751 : while (!list_empty(&reloc_roots)) {
2343 : found = 1;
2344 439 : reloc_root = list_entry(reloc_roots.next,
2345 : struct btrfs_root, root_list);
2346 :
2347 439 : if (btrfs_root_refs(&reloc_root->root_item) > 0) {
2348 439 : root = read_fs_root(reloc_root->fs_info,
2349 : reloc_root->root_key.offset);
2350 439 : BUG_ON(IS_ERR(root));
2351 439 : BUG_ON(root->reloc_root != reloc_root);
2352 :
2353 439 : ret = merge_reloc_root(rc, root);
2354 439 : if (ret) {
2355 0 : if (list_empty(&reloc_root->root_list))
2356 : list_add_tail(&reloc_root->root_list,
2357 : &reloc_roots);
2358 : goto out;
2359 : }
2360 : } else {
2361 0 : list_del_init(&reloc_root->root_list);
2362 : }
2363 :
2364 : /*
2365 : * we keep the old last snapshod transid in rtranid when we
2366 : * created the relocation tree.
2367 : */
2368 : last_snap = btrfs_root_rtransid(&reloc_root->root_item);
2369 : otransid = btrfs_root_otransid(&reloc_root->root_item);
2370 : objectid = reloc_root->root_key.offset;
2371 :
2372 439 : ret = btrfs_drop_snapshot(reloc_root, rc->block_rsv, 0, 1);
2373 439 : if (ret < 0) {
2374 0 : if (list_empty(&reloc_root->root_list))
2375 : list_add_tail(&reloc_root->root_list,
2376 : &reloc_roots);
2377 : goto out;
2378 : }
2379 : }
2380 :
2381 156 : if (found) {
2382 : found = 0;
2383 : goto again;
2384 : }
2385 : out:
2386 120 : if (ret) {
2387 0 : btrfs_std_error(root->fs_info, ret);
2388 0 : if (!list_empty(&reloc_roots))
2389 0 : free_reloc_roots(&reloc_roots);
2390 :
2391 : /* new reloc root may be added */
2392 0 : mutex_lock(&root->fs_info->reloc_mutex);
2393 : list_splice_init(&rc->reloc_roots, &reloc_roots);
2394 0 : mutex_unlock(&root->fs_info->reloc_mutex);
2395 0 : if (!list_empty(&reloc_roots))
2396 0 : free_reloc_roots(&reloc_roots);
2397 : }
2398 :
2399 120 : BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root));
2400 120 : return ret;
2401 : }
2402 :
2403 505 : static void free_block_list(struct rb_root *blocks)
2404 : {
2405 : struct tree_block *block;
2406 : struct rb_node *rb_node;
2407 1515 : while ((rb_node = rb_first(blocks))) {
2408 : block = rb_entry(rb_node, struct tree_block, rb_node);
2409 505 : rb_erase(rb_node, blocks);
2410 505 : kfree(block);
2411 : }
2412 505 : }
2413 :
2414 14 : static int record_reloc_root_in_trans(struct btrfs_trans_handle *trans,
2415 : struct btrfs_root *reloc_root)
2416 : {
2417 : struct btrfs_root *root;
2418 :
2419 14 : if (reloc_root->last_trans == trans->transid)
2420 : return 0;
2421 :
2422 0 : root = read_fs_root(reloc_root->fs_info, reloc_root->root_key.offset);
2423 0 : BUG_ON(IS_ERR(root));
2424 0 : BUG_ON(root->reloc_root != reloc_root);
2425 :
2426 0 : return btrfs_record_root_in_trans(trans, root);
2427 : }
2428 :
2429 : static noinline_for_stack
2430 16 : struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
2431 : struct reloc_control *rc,
2432 : struct backref_node *node,
2433 : struct backref_edge *edges[])
2434 : {
2435 : struct backref_node *next;
2436 : struct btrfs_root *root;
2437 16 : int index = 0;
2438 :
2439 : next = node;
2440 : while (1) {
2441 16 : cond_resched();
2442 16 : next = walk_up_backref(next, edges, &index);
2443 16 : root = next->root;
2444 16 : BUG_ON(!root);
2445 16 : BUG_ON(!test_bit(BTRFS_ROOT_REF_COWS, &root->state));
2446 :
2447 16 : if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
2448 14 : record_reloc_root_in_trans(trans, root);
2449 14 : break;
2450 : }
2451 :
2452 2 : btrfs_record_root_in_trans(trans, root);
2453 2 : root = root->reloc_root;
2454 :
2455 2 : if (next->new_bytenr != root->node->start) {
2456 2 : BUG_ON(next->new_bytenr);
2457 4 : BUG_ON(!list_empty(&next->list));
2458 2 : next->new_bytenr = root->node->start;
2459 2 : next->root = root;
2460 2 : list_add_tail(&next->list,
2461 : &rc->backref_cache.changed);
2462 2 : __mark_block_processed(rc, next);
2463 2 : break;
2464 : }
2465 :
2466 0 : WARN_ON(1);
2467 : root = NULL;
2468 : next = walk_down_backref(edges, &index);
2469 0 : if (!next || next->level <= node->level)
2470 : break;
2471 : }
2472 16 : if (!root)
2473 : return NULL;
2474 :
2475 : next = node;
2476 : /* setup backref node path for btrfs_reloc_cow_block */
2477 : while (1) {
2478 16 : rc->backref_cache.path[next->level] = next;
2479 16 : if (--index < 0)
2480 : break;
2481 0 : next = edges[index]->node[UPPER];
2482 0 : }
2483 : return root;
2484 : }
2485 :
2486 : /*
2487 : * select a tree root for relocation. return NULL if the block
2488 : * is reference counted. we should use do_relocation() in this
2489 : * case. return a tree root pointer if the block isn't reference
2490 : * counted. return -ENOENT if the block is root of reloc tree.
2491 : */
2492 : static noinline_for_stack
2493 505 : struct btrfs_root *select_one_root(struct btrfs_trans_handle *trans,
2494 : struct backref_node *node)
2495 : {
2496 : struct backref_node *next;
2497 : struct btrfs_root *root;
2498 : struct btrfs_root *fs_root = NULL;
2499 : struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
2500 505 : int index = 0;
2501 :
2502 : next = node;
2503 : while (1) {
2504 505 : cond_resched();
2505 505 : next = walk_up_backref(next, edges, &index);
2506 505 : root = next->root;
2507 505 : BUG_ON(!root);
2508 :
2509 : /* no other choice for non-references counted tree */
2510 505 : if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))
2511 : return root;
2512 :
2513 428 : if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID)
2514 : fs_root = root;
2515 :
2516 428 : if (next != node)
2517 : return NULL;
2518 :
2519 : next = walk_down_backref(edges, &index);
2520 412 : if (!next || next->level <= node->level)
2521 : break;
2522 : }
2523 :
2524 412 : if (!fs_root)
2525 : return ERR_PTR(-ENOENT);
2526 : return fs_root;
2527 : }
2528 :
2529 : static noinline_for_stack
2530 428 : u64 calcu_metadata_size(struct reloc_control *rc,
2531 : struct backref_node *node, int reserve)
2532 : {
2533 : struct backref_node *next = node;
2534 : struct backref_edge *edge;
2535 : struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
2536 : u64 num_bytes = 0;
2537 : int index = 0;
2538 :
2539 428 : BUG_ON(reserve && node->processed);
2540 :
2541 856 : while (next) {
2542 428 : cond_resched();
2543 : while (1) {
2544 444 : if (next->processed && (reserve || next != node))
2545 : break;
2546 :
2547 860 : num_bytes += btrfs_level_size(rc->extent_root,
2548 430 : next->level);
2549 :
2550 860 : if (list_empty(&next->upper))
2551 : break;
2552 :
2553 : edge = list_entry(next->upper.next,
2554 : struct backref_edge, list[LOWER]);
2555 16 : edges[index++] = edge;
2556 16 : next = edge->node[UPPER];
2557 : }
2558 : next = walk_down_backref(edges, &index);
2559 : }
2560 428 : return num_bytes;
2561 : }
2562 :
2563 428 : static int reserve_metadata_space(struct btrfs_trans_handle *trans,
2564 : struct reloc_control *rc,
2565 : struct backref_node *node)
2566 : {
2567 428 : struct btrfs_root *root = rc->extent_root;
2568 : u64 num_bytes;
2569 : int ret;
2570 : u64 tmp;
2571 :
2572 428 : num_bytes = calcu_metadata_size(rc, node, 1) * 2;
2573 :
2574 428 : trans->block_rsv = rc->block_rsv;
2575 428 : rc->reserved_bytes += num_bytes;
2576 428 : ret = btrfs_block_rsv_refill(root, rc->block_rsv, num_bytes,
2577 : BTRFS_RESERVE_FLUSH_ALL);
2578 428 : if (ret) {
2579 0 : if (ret == -EAGAIN) {
2580 0 : tmp = rc->extent_root->nodesize *
2581 : RELOCATION_RESERVED_NODES;
2582 0 : while (tmp <= rc->reserved_bytes)
2583 0 : tmp <<= 1;
2584 : /*
2585 : * only one thread can access block_rsv at this point,
2586 : * so we don't need hold lock to protect block_rsv.
2587 : * we expand more reservation size here to allow enough
2588 : * space for relocation and we will return eailer in
2589 : * enospc case.
2590 : */
2591 0 : rc->block_rsv->size = tmp + rc->extent_root->nodesize *
2592 : RELOCATION_RESERVED_NODES;
2593 : }
2594 : return ret;
2595 : }
2596 :
2597 : return 0;
2598 : }
2599 :
2600 : /*
2601 : * relocate a block tree, and then update pointers in upper level
2602 : * blocks that reference the block to point to the new location.
2603 : *
2604 : * if called by link_to_upper, the block has already been relocated.
2605 : * in that case this function just updates pointers.
2606 : */
2607 16 : static int do_relocation(struct btrfs_trans_handle *trans,
2608 : struct reloc_control *rc,
2609 : struct backref_node *node,
2610 : struct btrfs_key *key,
2611 : struct btrfs_path *path, int lowest)
2612 : {
2613 : struct backref_node *upper;
2614 : struct backref_edge *edge;
2615 : struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
2616 16 : struct btrfs_root *root;
2617 : struct extent_buffer *eb;
2618 : u32 blocksize;
2619 : u64 bytenr;
2620 : u64 generation;
2621 : int slot;
2622 : int ret;
2623 : int err = 0;
2624 :
2625 16 : BUG_ON(lowest && node->eb);
2626 :
2627 16 : path->lowest_level = node->level + 1;
2628 16 : rc->backref_cache.path[node->level] = node;
2629 32 : list_for_each_entry(edge, &node->upper, list[LOWER]) {
2630 16 : cond_resched();
2631 :
2632 16 : upper = edge->node[UPPER];
2633 16 : root = select_reloc_root(trans, rc, upper, edges);
2634 16 : BUG_ON(!root);
2635 :
2636 16 : if (upper->eb && !upper->locked) {
2637 0 : if (!lowest) {
2638 0 : ret = btrfs_bin_search(upper->eb, key,
2639 0 : upper->level, &slot);
2640 0 : BUG_ON(ret);
2641 0 : bytenr = btrfs_node_blockptr(upper->eb, slot);
2642 0 : if (node->eb->start == bytenr)
2643 : goto next;
2644 : }
2645 0 : drop_node_buffer(upper);
2646 : }
2647 :
2648 16 : if (!upper->eb) {
2649 16 : ret = btrfs_search_slot(trans, root, key, path, 0, 1);
2650 16 : if (ret < 0) {
2651 : err = ret;
2652 : break;
2653 : }
2654 16 : BUG_ON(ret > 0);
2655 :
2656 16 : if (!upper->eb) {
2657 16 : upper->eb = path->nodes[upper->level];
2658 16 : path->nodes[upper->level] = NULL;
2659 : } else {
2660 0 : BUG_ON(upper->eb != path->nodes[upper->level]);
2661 : }
2662 :
2663 16 : upper->locked = 1;
2664 16 : path->locks[upper->level] = 0;
2665 :
2666 16 : slot = path->slots[upper->level];
2667 16 : btrfs_release_path(path);
2668 : } else {
2669 0 : ret = btrfs_bin_search(upper->eb, key, upper->level,
2670 : &slot);
2671 0 : BUG_ON(ret);
2672 : }
2673 :
2674 16 : bytenr = btrfs_node_blockptr(upper->eb, slot);
2675 16 : if (lowest) {
2676 16 : BUG_ON(bytenr != node->bytenr);
2677 : } else {
2678 0 : if (node->eb->start == bytenr)
2679 : goto next;
2680 : }
2681 :
2682 16 : blocksize = btrfs_level_size(root, node->level);
2683 16 : generation = btrfs_node_ptr_generation(upper->eb, slot);
2684 16 : eb = read_tree_block(root, bytenr, blocksize, generation);
2685 16 : if (!eb || !extent_buffer_uptodate(eb)) {
2686 0 : free_extent_buffer(eb);
2687 : err = -EIO;
2688 0 : goto next;
2689 : }
2690 16 : btrfs_tree_lock(eb);
2691 16 : btrfs_set_lock_blocking(eb);
2692 :
2693 16 : if (!node->eb) {
2694 16 : ret = btrfs_cow_block(trans, root, eb, upper->eb,
2695 : slot, &eb);
2696 16 : btrfs_tree_unlock(eb);
2697 16 : free_extent_buffer(eb);
2698 16 : if (ret < 0) {
2699 : err = ret;
2700 : goto next;
2701 : }
2702 16 : BUG_ON(node->eb != eb);
2703 : } else {
2704 0 : btrfs_set_node_blockptr(upper->eb, slot,
2705 : node->eb->start);
2706 0 : btrfs_set_node_ptr_generation(upper->eb, slot,
2707 : trans->transid);
2708 0 : btrfs_mark_buffer_dirty(upper->eb);
2709 :
2710 0 : ret = btrfs_inc_extent_ref(trans, root,
2711 0 : node->eb->start, blocksize,
2712 : upper->eb->start,
2713 : btrfs_header_owner(upper->eb),
2714 0 : node->level, 0, 1);
2715 0 : BUG_ON(ret);
2716 :
2717 0 : ret = btrfs_drop_subtree(trans, root, eb, upper->eb);
2718 0 : BUG_ON(ret);
2719 : }
2720 : next:
2721 16 : if (!upper->pending)
2722 16 : drop_node_buffer(upper);
2723 : else
2724 : unlock_node_buffer(upper);
2725 16 : if (err)
2726 : break;
2727 : }
2728 :
2729 16 : if (!err && node->pending) {
2730 16 : drop_node_buffer(node);
2731 16 : list_move_tail(&node->list, &rc->backref_cache.changed);
2732 16 : node->pending = 0;
2733 : }
2734 :
2735 16 : path->lowest_level = 0;
2736 16 : BUG_ON(err == -ENOSPC);
2737 16 : return err;
2738 : }
2739 :
2740 0 : static int link_to_upper(struct btrfs_trans_handle *trans,
2741 : struct reloc_control *rc,
2742 : struct backref_node *node,
2743 : struct btrfs_path *path)
2744 : {
2745 : struct btrfs_key key;
2746 :
2747 0 : btrfs_node_key_to_cpu(node->eb, &key, 0);
2748 0 : return do_relocation(trans, rc, node, &key, path, 0);
2749 : }
2750 :
2751 505 : static int finish_pending_nodes(struct btrfs_trans_handle *trans,
2752 : struct reloc_control *rc,
2753 : struct btrfs_path *path, int err)
2754 : {
2755 505 : LIST_HEAD(list);
2756 : struct backref_cache *cache = &rc->backref_cache;
2757 : struct backref_node *node;
2758 : int level;
2759 : int ret;
2760 :
2761 4545 : for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
2762 8080 : while (!list_empty(&cache->pending[level])) {
2763 0 : node = list_entry(cache->pending[level].next,
2764 : struct backref_node, list);
2765 0 : list_move_tail(&node->list, &list);
2766 0 : BUG_ON(!node->pending);
2767 :
2768 0 : if (!err) {
2769 0 : ret = link_to_upper(trans, rc, node, path);
2770 0 : if (ret < 0)
2771 : err = ret;
2772 : }
2773 : }
2774 : list_splice_init(&list, &cache->pending[level]);
2775 : }
2776 505 : return err;
2777 : }
2778 :
2779 : static void mark_block_processed(struct reloc_control *rc,
2780 : u64 bytenr, u32 blocksize)
2781 : {
2782 506 : set_extent_bits(&rc->processed_blocks, bytenr, bytenr + blocksize - 1,
2783 : EXTENT_DIRTY, GFP_NOFS);
2784 : }
2785 :
2786 511 : static void __mark_block_processed(struct reloc_control *rc,
2787 : struct backref_node *node)
2788 : {
2789 : u32 blocksize;
2790 517 : if (node->level == 0 ||
2791 6 : in_block_group(node->bytenr, rc->block_group)) {
2792 506 : blocksize = btrfs_level_size(rc->extent_root, node->level);
2793 506 : mark_block_processed(rc, node->bytenr, blocksize);
2794 : }
2795 511 : node->processed = 1;
2796 511 : }
2797 :
2798 : /*
2799 : * mark a block and all blocks directly/indirectly reference the block
2800 : * as processed.
2801 : */
2802 489 : static void update_processed_blocks(struct reloc_control *rc,
2803 : struct backref_node *node)
2804 : {
2805 : struct backref_node *next = node;
2806 : struct backref_edge *edge;
2807 : struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
2808 : int index = 0;
2809 :
2810 1467 : while (next) {
2811 489 : cond_resched();
2812 : while (1) {
2813 493 : if (next->processed)
2814 : break;
2815 :
2816 493 : __mark_block_processed(rc, next);
2817 :
2818 986 : if (list_empty(&next->upper))
2819 : break;
2820 :
2821 : edge = list_entry(next->upper.next,
2822 : struct backref_edge, list[LOWER]);
2823 4 : edges[index++] = edge;
2824 4 : next = edge->node[UPPER];
2825 4 : }
2826 : next = walk_down_backref(edges, &index);
2827 : }
2828 489 : }
2829 :
2830 1021 : static int tree_block_processed(u64 bytenr, u32 blocksize,
2831 : struct reloc_control *rc)
2832 : {
2833 1021 : if (test_range_bit(&rc->processed_blocks, bytenr,
2834 1021 : bytenr + blocksize - 1, EXTENT_DIRTY, 1, NULL))
2835 : return 1;
2836 8 : return 0;
2837 : }
2838 :
2839 504 : static int get_tree_block_key(struct reloc_control *rc,
2840 : struct tree_block *block)
2841 : {
2842 504 : struct extent_buffer *eb;
2843 :
2844 504 : BUG_ON(block->key_ready);
2845 1008 : eb = read_tree_block(rc->extent_root, block->bytenr,
2846 504 : block->key.objectid, block->key.offset);
2847 504 : if (!eb || !extent_buffer_uptodate(eb)) {
2848 0 : free_extent_buffer(eb);
2849 : return -EIO;
2850 : }
2851 504 : WARN_ON(btrfs_header_level(eb) != block->level);
2852 504 : if (block->level == 0)
2853 504 : btrfs_item_key_to_cpu(eb, &block->key, 0);
2854 : else
2855 : btrfs_node_key_to_cpu(eb, &block->key, 0);
2856 504 : free_extent_buffer(eb);
2857 504 : block->key_ready = 1;
2858 : return 0;
2859 : }
2860 :
2861 504 : static int reada_tree_block(struct reloc_control *rc,
2862 : struct tree_block *block)
2863 : {
2864 504 : BUG_ON(block->key_ready);
2865 504 : if (block->key.type == BTRFS_METADATA_ITEM_KEY)
2866 0 : readahead_tree_block(rc->extent_root, block->bytenr,
2867 0 : block->key.objectid,
2868 0 : rc->extent_root->leafsize);
2869 : else
2870 1008 : readahead_tree_block(rc->extent_root, block->bytenr,
2871 504 : block->key.objectid, block->key.offset);
2872 504 : return 0;
2873 : }
2874 :
2875 : /*
2876 : * helper function to relocate a tree block
2877 : */
2878 505 : static int relocate_tree_block(struct btrfs_trans_handle *trans,
2879 : struct reloc_control *rc,
2880 : struct backref_node *node,
2881 : struct btrfs_key *key,
2882 : struct btrfs_path *path)
2883 : {
2884 : struct btrfs_root *root;
2885 : int ret = 0;
2886 :
2887 505 : if (!node)
2888 : return 0;
2889 :
2890 505 : BUG_ON(node->processed);
2891 505 : root = select_one_root(trans, node);
2892 505 : if (root == ERR_PTR(-ENOENT)) {
2893 0 : update_processed_blocks(rc, node);
2894 0 : goto out;
2895 : }
2896 :
2897 994 : if (!root || test_bit(BTRFS_ROOT_REF_COWS, &root->state)) {
2898 428 : ret = reserve_metadata_space(trans, rc, node);
2899 428 : if (ret)
2900 : goto out;
2901 : }
2902 :
2903 505 : if (root) {
2904 489 : if (test_bit(BTRFS_ROOT_REF_COWS, &root->state)) {
2905 412 : BUG_ON(node->new_bytenr);
2906 824 : BUG_ON(!list_empty(&node->list));
2907 412 : btrfs_record_root_in_trans(trans, root);
2908 412 : root = root->reloc_root;
2909 412 : node->new_bytenr = root->node->start;
2910 412 : node->root = root;
2911 412 : list_add_tail(&node->list, &rc->backref_cache.changed);
2912 : } else {
2913 77 : path->lowest_level = node->level;
2914 77 : ret = btrfs_search_slot(trans, root, key, path, 0, 1);
2915 77 : btrfs_release_path(path);
2916 77 : if (ret > 0)
2917 : ret = 0;
2918 : }
2919 489 : if (!ret)
2920 489 : update_processed_blocks(rc, node);
2921 : } else {
2922 16 : ret = do_relocation(trans, rc, node, key, path, 1);
2923 : }
2924 : out:
2925 505 : if (ret || node->level == 0 || node->cowonly)
2926 505 : remove_backref_node(&rc->backref_cache, node);
2927 505 : return ret;
2928 : }
2929 :
2930 : /*
2931 : * relocate a list of blocks
2932 : */
2933 : static noinline_for_stack
2934 505 : int relocate_tree_blocks(struct btrfs_trans_handle *trans,
2935 : struct reloc_control *rc, struct rb_root *blocks)
2936 : {
2937 : struct backref_node *node;
2938 : struct btrfs_path *path;
2939 : struct tree_block *block;
2940 : struct rb_node *rb_node;
2941 : int ret;
2942 : int err = 0;
2943 :
2944 505 : path = btrfs_alloc_path();
2945 505 : if (!path) {
2946 : err = -ENOMEM;
2947 : goto out_free_blocks;
2948 : }
2949 :
2950 505 : rb_node = rb_first(blocks);
2951 1515 : while (rb_node) {
2952 : block = rb_entry(rb_node, struct tree_block, rb_node);
2953 505 : if (!block->key_ready)
2954 504 : reada_tree_block(rc, block);
2955 505 : rb_node = rb_next(rb_node);
2956 : }
2957 :
2958 505 : rb_node = rb_first(blocks);
2959 1515 : while (rb_node) {
2960 : block = rb_entry(rb_node, struct tree_block, rb_node);
2961 505 : if (!block->key_ready) {
2962 504 : err = get_tree_block_key(rc, block);
2963 504 : if (err)
2964 : goto out_free_path;
2965 : }
2966 505 : rb_node = rb_next(rb_node);
2967 : }
2968 :
2969 505 : rb_node = rb_first(blocks);
2970 1515 : while (rb_node) {
2971 : block = rb_entry(rb_node, struct tree_block, rb_node);
2972 :
2973 1010 : node = build_backref_tree(rc, &block->key,
2974 505 : block->level, block->bytenr);
2975 505 : if (IS_ERR(node)) {
2976 0 : err = PTR_ERR(node);
2977 0 : goto out;
2978 : }
2979 :
2980 505 : ret = relocate_tree_block(trans, rc, node, &block->key,
2981 : path);
2982 505 : if (ret < 0) {
2983 0 : if (ret != -EAGAIN || rb_node == rb_first(blocks))
2984 : err = ret;
2985 : goto out;
2986 : }
2987 505 : rb_node = rb_next(rb_node);
2988 : }
2989 : out:
2990 505 : err = finish_pending_nodes(trans, rc, path, err);
2991 :
2992 : out_free_path:
2993 505 : btrfs_free_path(path);
2994 : out_free_blocks:
2995 505 : free_block_list(blocks);
2996 505 : return err;
2997 : }
2998 :
2999 : static noinline_for_stack
3000 9 : int prealloc_file_extent_cluster(struct inode *inode,
3001 : struct file_extent_cluster *cluster)
3002 : {
3003 9 : u64 alloc_hint = 0;
3004 : u64 start;
3005 : u64 end;
3006 9 : u64 offset = BTRFS_I(inode)->index_cnt;
3007 : u64 num_bytes;
3008 : int nr = 0;
3009 : int ret = 0;
3010 :
3011 9 : BUG_ON(cluster->start != cluster->boundary[0]);
3012 9 : mutex_lock(&inode->i_mutex);
3013 :
3014 18 : ret = btrfs_check_data_free_space(inode, cluster->end +
3015 9 : 1 - cluster->start);
3016 9 : if (ret)
3017 : goto out;
3018 :
3019 1030 : while (nr < cluster->nr) {
3020 1021 : start = cluster->boundary[nr] - offset;
3021 1021 : if (nr + 1 < cluster->nr)
3022 1012 : end = cluster->boundary[nr + 1] - 1 - offset;
3023 : else
3024 9 : end = cluster->end - offset;
3025 :
3026 1021 : lock_extent(&BTRFS_I(inode)->io_tree, start, end);
3027 1021 : num_bytes = end + 1 - start;
3028 1021 : ret = btrfs_prealloc_file_range(inode, 0, start,
3029 : num_bytes, num_bytes,
3030 1021 : end + 1, &alloc_hint);
3031 1021 : unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
3032 1021 : if (ret)
3033 : break;
3034 : nr++;
3035 : }
3036 18 : btrfs_free_reserved_data_space(inode, cluster->end +
3037 9 : 1 - cluster->start);
3038 : out:
3039 9 : mutex_unlock(&inode->i_mutex);
3040 9 : return ret;
3041 : }
3042 :
3043 : static noinline_for_stack
3044 9 : int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
3045 : u64 block_start)
3046 : {
3047 9 : struct btrfs_root *root = BTRFS_I(inode)->root;
3048 9 : struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
3049 : struct extent_map *em;
3050 : int ret = 0;
3051 :
3052 9 : em = alloc_extent_map();
3053 9 : if (!em)
3054 : return -ENOMEM;
3055 :
3056 9 : em->start = start;
3057 9 : em->len = end + 1 - start;
3058 9 : em->block_len = em->len;
3059 9 : em->block_start = block_start;
3060 9 : em->bdev = root->fs_info->fs_devices->latest_bdev;
3061 : set_bit(EXTENT_FLAG_PINNED, &em->flags);
3062 :
3063 9 : lock_extent(&BTRFS_I(inode)->io_tree, start, end);
3064 : while (1) {
3065 18 : write_lock(&em_tree->lock);
3066 18 : ret = add_extent_mapping(em_tree, em, 0);
3067 : write_unlock(&em_tree->lock);
3068 18 : if (ret != -EEXIST) {
3069 9 : free_extent_map(em);
3070 : break;
3071 : }
3072 9 : btrfs_drop_extent_cache(inode, start, end, 0);
3073 9 : }
3074 9 : unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
3075 9 : return ret;
3076 : }
3077 :
3078 127 : static int relocate_file_extent_cluster(struct inode *inode,
3079 : struct file_extent_cluster *cluster)
3080 : {
3081 : u64 page_start;
3082 : u64 page_end;
3083 127 : u64 offset = BTRFS_I(inode)->index_cnt;
3084 : unsigned long index;
3085 : unsigned long last_index;
3086 1276 : struct page *page;
3087 : struct file_ra_state *ra;
3088 127 : gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
3089 : int nr = 0;
3090 : int ret = 0;
3091 :
3092 127 : if (!cluster->nr)
3093 : return 0;
3094 :
3095 9 : ra = kzalloc(sizeof(*ra), GFP_NOFS);
3096 9 : if (!ra)
3097 : return -ENOMEM;
3098 :
3099 9 : ret = prealloc_file_extent_cluster(inode, cluster);
3100 9 : if (ret)
3101 : goto out;
3102 :
3103 9 : file_ra_state_init(ra, inode->i_mapping);
3104 :
3105 9 : ret = setup_extent_mapping(inode, cluster->start - offset,
3106 9 : cluster->end - offset, cluster->start);
3107 9 : if (ret)
3108 : goto out;
3109 :
3110 9 : index = (cluster->start - offset) >> PAGE_CACHE_SHIFT;
3111 9 : last_index = (cluster->end - offset) >> PAGE_CACHE_SHIFT;
3112 1294 : while (index <= last_index) {
3113 1276 : ret = btrfs_delalloc_reserve_metadata(inode, PAGE_CACHE_SIZE);
3114 1276 : if (ret)
3115 : goto out;
3116 :
3117 1276 : page = find_lock_page(inode->i_mapping, index);
3118 1276 : if (!page) {
3119 9 : page_cache_sync_readahead(inode->i_mapping,
3120 : ra, NULL, index,
3121 9 : last_index + 1 - index);
3122 9 : page = find_or_create_page(inode->i_mapping, index,
3123 : mask);
3124 9 : if (!page) {
3125 0 : btrfs_delalloc_release_metadata(inode,
3126 : PAGE_CACHE_SIZE);
3127 : ret = -ENOMEM;
3128 0 : goto out;
3129 : }
3130 : }
3131 :
3132 1276 : if (PageReadahead(page)) {
3133 0 : page_cache_async_readahead(inode->i_mapping,
3134 : ra, NULL, page, index,
3135 0 : last_index + 1 - index);
3136 : }
3137 :
3138 1276 : if (!PageUptodate(page)) {
3139 0 : btrfs_readpage(NULL, page);
3140 0 : lock_page(page);
3141 0 : if (!PageUptodate(page)) {
3142 0 : unlock_page(page);
3143 0 : page_cache_release(page);
3144 0 : btrfs_delalloc_release_metadata(inode,
3145 : PAGE_CACHE_SIZE);
3146 : ret = -EIO;
3147 0 : goto out;
3148 : }
3149 : }
3150 :
3151 1276 : page_start = page_offset(page);
3152 1276 : page_end = page_start + PAGE_CACHE_SIZE - 1;
3153 :
3154 1276 : lock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end);
3155 :
3156 1276 : set_page_extent_mapped(page);
3157 :
3158 2297 : if (nr < cluster->nr &&
3159 1021 : page_start + offset == cluster->boundary[nr]) {
3160 1021 : set_extent_bits(&BTRFS_I(inode)->io_tree,
3161 : page_start, page_end,
3162 : EXTENT_BOUNDARY, GFP_NOFS);
3163 1021 : nr++;
3164 : }
3165 :
3166 1276 : btrfs_set_extent_delalloc(inode, page_start, page_end, NULL);
3167 1276 : set_page_dirty(page);
3168 :
3169 1276 : unlock_extent(&BTRFS_I(inode)->io_tree,
3170 : page_start, page_end);
3171 1276 : unlock_page(page);
3172 1276 : page_cache_release(page);
3173 :
3174 1276 : index++;
3175 1276 : balance_dirty_pages_ratelimited(inode->i_mapping);
3176 1276 : btrfs_throttle(BTRFS_I(inode)->root);
3177 : }
3178 9 : WARN_ON(nr != cluster->nr);
3179 : out:
3180 9 : kfree(ra);
3181 9 : return ret;
3182 : }
3183 :
3184 : static noinline_for_stack
3185 1021 : int relocate_data_extent(struct inode *inode, struct btrfs_key *extent_key,
3186 : struct file_extent_cluster *cluster)
3187 : {
3188 : int ret;
3189 :
3190 1021 : if (cluster->nr > 0 && extent_key->objectid != cluster->end + 1) {
3191 0 : ret = relocate_file_extent_cluster(inode, cluster);
3192 0 : if (ret)
3193 : return ret;
3194 0 : cluster->nr = 0;
3195 : }
3196 :
3197 1021 : if (!cluster->nr)
3198 9 : cluster->start = extent_key->objectid;
3199 : else
3200 1012 : BUG_ON(cluster->nr >= MAX_EXTENTS);
3201 1021 : cluster->end = extent_key->objectid + extent_key->offset - 1;
3202 1021 : cluster->boundary[cluster->nr] = extent_key->objectid;
3203 1021 : cluster->nr++;
3204 :
3205 1021 : if (cluster->nr >= MAX_EXTENTS) {
3206 7 : ret = relocate_file_extent_cluster(inode, cluster);
3207 7 : if (ret)
3208 : return ret;
3209 7 : cluster->nr = 0;
3210 : }
3211 : return 0;
3212 : }
3213 :
3214 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
3215 0 : static int get_ref_objectid_v0(struct reloc_control *rc,
3216 : struct btrfs_path *path,
3217 : struct btrfs_key *extent_key,
3218 : u64 *ref_objectid, int *path_change)
3219 : {
3220 : struct btrfs_key key;
3221 0 : struct extent_buffer *leaf;
3222 : struct btrfs_extent_ref_v0 *ref0;
3223 : int ret;
3224 : int slot;
3225 :
3226 0 : leaf = path->nodes[0];
3227 0 : slot = path->slots[0];
3228 : while (1) {
3229 0 : if (slot >= btrfs_header_nritems(leaf)) {
3230 0 : ret = btrfs_next_leaf(rc->extent_root, path);
3231 0 : if (ret < 0)
3232 : return ret;
3233 0 : BUG_ON(ret > 0);
3234 0 : leaf = path->nodes[0];
3235 0 : slot = path->slots[0];
3236 0 : if (path_change)
3237 0 : *path_change = 1;
3238 : }
3239 0 : btrfs_item_key_to_cpu(leaf, &key, slot);
3240 0 : if (key.objectid != extent_key->objectid)
3241 : return -ENOENT;
3242 :
3243 0 : if (key.type != BTRFS_EXTENT_REF_V0_KEY) {
3244 0 : slot++;
3245 0 : continue;
3246 : }
3247 0 : ref0 = btrfs_item_ptr(leaf, slot,
3248 : struct btrfs_extent_ref_v0);
3249 0 : *ref_objectid = btrfs_ref_objectid_v0(leaf, ref0);
3250 : break;
3251 : }
3252 : return 0;
3253 : }
3254 : #endif
3255 :
3256 : /*
3257 : * helper to add a tree block to the list.
3258 : * the major work is getting the generation and level of the block
3259 : */
3260 504 : static int add_tree_block(struct reloc_control *rc,
3261 : struct btrfs_key *extent_key,
3262 : struct btrfs_path *path,
3263 : struct rb_root *blocks)
3264 : {
3265 : struct extent_buffer *eb;
3266 : struct btrfs_extent_item *ei;
3267 : struct btrfs_tree_block_info *bi;
3268 : struct tree_block *block;
3269 : struct rb_node *rb_node;
3270 : u32 item_size;
3271 : int level = -1;
3272 : u64 generation;
3273 :
3274 504 : eb = path->nodes[0];
3275 504 : item_size = btrfs_item_size_nr(eb, path->slots[0]);
3276 :
3277 504 : if (extent_key->type == BTRFS_METADATA_ITEM_KEY ||
3278 : item_size >= sizeof(*ei) + sizeof(*bi)) {
3279 1008 : ei = btrfs_item_ptr(eb, path->slots[0],
3280 : struct btrfs_extent_item);
3281 504 : if (extent_key->type == BTRFS_EXTENT_ITEM_KEY) {
3282 504 : bi = (struct btrfs_tree_block_info *)(ei + 1);
3283 504 : level = btrfs_tree_block_level(eb, bi);
3284 : } else {
3285 0 : level = (int)extent_key->offset;
3286 : }
3287 504 : generation = btrfs_extent_generation(eb, ei);
3288 : } else {
3289 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
3290 : u64 ref_owner;
3291 : int ret;
3292 :
3293 0 : BUG_ON(item_size != sizeof(struct btrfs_extent_item_v0));
3294 0 : ret = get_ref_objectid_v0(rc, path, extent_key,
3295 : &ref_owner, NULL);
3296 0 : if (ret < 0)
3297 0 : return ret;
3298 0 : BUG_ON(ref_owner >= BTRFS_MAX_LEVEL);
3299 0 : level = (int)ref_owner;
3300 : /* FIXME: get real generation */
3301 : generation = 0;
3302 : #else
3303 : BUG();
3304 : #endif
3305 : }
3306 :
3307 504 : btrfs_release_path(path);
3308 :
3309 504 : BUG_ON(level == -1);
3310 :
3311 : block = kmalloc(sizeof(*block), GFP_NOFS);
3312 504 : if (!block)
3313 : return -ENOMEM;
3314 :
3315 504 : block->bytenr = extent_key->objectid;
3316 504 : block->key.objectid = rc->extent_root->leafsize;
3317 504 : block->key.offset = generation;
3318 504 : block->level = level;
3319 504 : block->key_ready = 0;
3320 :
3321 504 : rb_node = tree_insert(blocks, block->bytenr, &block->rb_node);
3322 504 : if (rb_node)
3323 0 : backref_tree_panic(rb_node, -EEXIST, block->bytenr);
3324 :
3325 : return 0;
3326 : }
3327 :
3328 : /*
3329 : * helper to add tree blocks for backref of type BTRFS_SHARED_DATA_REF_KEY
3330 : */
3331 1020 : static int __add_tree_block(struct reloc_control *rc,
3332 : u64 bytenr, u32 blocksize,
3333 : struct rb_root *blocks)
3334 : {
3335 : struct btrfs_path *path;
3336 : struct btrfs_key key;
3337 : int ret;
3338 1020 : bool skinny = btrfs_fs_incompat(rc->extent_root->fs_info,
3339 : SKINNY_METADATA);
3340 :
3341 1020 : if (tree_block_processed(bytenr, blocksize, rc))
3342 : return 0;
3343 :
3344 7 : if (tree_search(blocks, bytenr))
3345 : return 0;
3346 :
3347 7 : path = btrfs_alloc_path();
3348 7 : if (!path)
3349 : return -ENOMEM;
3350 : again:
3351 7 : key.objectid = bytenr;
3352 7 : if (skinny) {
3353 0 : key.type = BTRFS_METADATA_ITEM_KEY;
3354 0 : key.offset = (u64)-1;
3355 : } else {
3356 7 : key.type = BTRFS_EXTENT_ITEM_KEY;
3357 7 : key.offset = blocksize;
3358 : }
3359 :
3360 7 : path->search_commit_root = 1;
3361 7 : path->skip_locking = 1;
3362 7 : ret = btrfs_search_slot(NULL, rc->extent_root, &key, path, 0, 0);
3363 7 : if (ret < 0)
3364 : goto out;
3365 :
3366 7 : if (ret > 0 && skinny) {
3367 0 : if (path->slots[0]) {
3368 0 : path->slots[0]--;
3369 0 : btrfs_item_key_to_cpu(path->nodes[0], &key,
3370 : path->slots[0]);
3371 0 : if (key.objectid == bytenr &&
3372 0 : (key.type == BTRFS_METADATA_ITEM_KEY ||
3373 0 : (key.type == BTRFS_EXTENT_ITEM_KEY &&
3374 0 : key.offset == blocksize)))
3375 : ret = 0;
3376 : }
3377 :
3378 0 : if (ret) {
3379 : skinny = false;
3380 0 : btrfs_release_path(path);
3381 0 : goto again;
3382 : }
3383 : }
3384 7 : BUG_ON(ret);
3385 :
3386 7 : ret = add_tree_block(rc, &key, path, blocks);
3387 : out:
3388 7 : btrfs_free_path(path);
3389 7 : return ret;
3390 : }
3391 :
3392 : /*
3393 : * helper to check if the block use full backrefs for pointers in it
3394 : */
3395 1 : static int block_use_full_backref(struct reloc_control *rc,
3396 : struct extent_buffer *eb)
3397 : {
3398 : u64 flags;
3399 : int ret;
3400 :
3401 2 : if (btrfs_header_flag(eb, BTRFS_HEADER_FLAG_RELOC) ||
3402 : btrfs_header_backref_rev(eb) < BTRFS_MIXED_BACKREF_REV)
3403 : return 1;
3404 :
3405 1 : ret = btrfs_lookup_extent_info(NULL, rc->extent_root,
3406 : eb->start, btrfs_header_level(eb), 1,
3407 : NULL, &flags);
3408 1 : BUG_ON(ret);
3409 :
3410 1 : if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
3411 : ret = 1;
3412 : else
3413 : ret = 0;
3414 : return ret;
3415 : }
3416 :
3417 41 : static int delete_block_group_cache(struct btrfs_fs_info *fs_info,
3418 : struct inode *inode, u64 ino)
3419 : {
3420 : struct btrfs_key key;
3421 41 : struct btrfs_root *root = fs_info->tree_root;
3422 : struct btrfs_trans_handle *trans;
3423 : int ret = 0;
3424 :
3425 41 : if (inode)
3426 : goto truncate;
3427 :
3428 0 : key.objectid = ino;
3429 0 : key.type = BTRFS_INODE_ITEM_KEY;
3430 0 : key.offset = 0;
3431 :
3432 0 : inode = btrfs_iget(fs_info->sb, &key, root, NULL);
3433 0 : if (IS_ERR(inode) || is_bad_inode(inode)) {
3434 0 : if (!IS_ERR(inode))
3435 0 : iput(inode);
3436 : return -ENOENT;
3437 : }
3438 :
3439 : truncate:
3440 41 : ret = btrfs_check_trunc_cache_free_space(root,
3441 : &fs_info->global_block_rsv);
3442 41 : if (ret)
3443 : goto out;
3444 :
3445 41 : trans = btrfs_join_transaction(root);
3446 41 : if (IS_ERR(trans)) {
3447 0 : ret = PTR_ERR(trans);
3448 0 : goto out;
3449 : }
3450 :
3451 41 : ret = btrfs_truncate_free_space_cache(root, trans, inode);
3452 :
3453 41 : btrfs_end_transaction(trans, root);
3454 41 : btrfs_btree_balance_dirty(root);
3455 : out:
3456 41 : iput(inode);
3457 41 : return ret;
3458 : }
3459 :
3460 : /*
3461 : * helper to add tree blocks for backref of type BTRFS_EXTENT_DATA_REF_KEY
3462 : * this function scans fs tree to find blocks reference the data extent
3463 : */
3464 1 : static int find_data_references(struct reloc_control *rc,
3465 : struct btrfs_key *extent_key,
3466 1 : struct extent_buffer *leaf,
3467 : struct btrfs_extent_data_ref *ref,
3468 : struct rb_root *blocks)
3469 : {
3470 : struct btrfs_path *path;
3471 : struct tree_block *block;
3472 : struct btrfs_root *root;
3473 : struct btrfs_file_extent_item *fi;
3474 : struct rb_node *rb_node;
3475 : struct btrfs_key key;
3476 : u64 ref_root;
3477 : u64 ref_objectid;
3478 : u64 ref_offset;
3479 : u32 ref_count;
3480 : u32 nritems;
3481 : int err = 0;
3482 : int added = 0;
3483 : int counted;
3484 : int ret;
3485 :
3486 : ref_root = btrfs_extent_data_ref_root(leaf, ref);
3487 : ref_objectid = btrfs_extent_data_ref_objectid(leaf, ref);
3488 : ref_offset = btrfs_extent_data_ref_offset(leaf, ref);
3489 : ref_count = btrfs_extent_data_ref_count(leaf, ref);
3490 :
3491 : /*
3492 : * This is an extent belonging to the free space cache, lets just delete
3493 : * it and redo the search.
3494 : */
3495 1 : if (ref_root == BTRFS_ROOT_TREE_OBJECTID) {
3496 0 : ret = delete_block_group_cache(rc->extent_root->fs_info,
3497 : NULL, ref_objectid);
3498 0 : if (ret != -ENOENT)
3499 : return ret;
3500 : ret = 0;
3501 : }
3502 :
3503 1 : path = btrfs_alloc_path();
3504 1 : if (!path)
3505 : return -ENOMEM;
3506 1 : path->reada = 1;
3507 :
3508 1 : root = read_fs_root(rc->extent_root->fs_info, ref_root);
3509 1 : if (IS_ERR(root)) {
3510 0 : err = PTR_ERR(root);
3511 0 : goto out;
3512 : }
3513 :
3514 1 : key.objectid = ref_objectid;
3515 1 : key.type = BTRFS_EXTENT_DATA_KEY;
3516 1 : if (ref_offset > ((u64)-1 << 32))
3517 0 : key.offset = 0;
3518 : else
3519 1 : key.offset = ref_offset;
3520 :
3521 1 : path->search_commit_root = 1;
3522 1 : path->skip_locking = 1;
3523 1 : ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
3524 1 : if (ret < 0) {
3525 : err = ret;
3526 : goto out;
3527 : }
3528 :
3529 1 : leaf = path->nodes[0];
3530 : nritems = btrfs_header_nritems(leaf);
3531 : /*
3532 : * the references in tree blocks that use full backrefs
3533 : * are not counted in
3534 : */
3535 1 : if (block_use_full_backref(rc, leaf))
3536 : counted = 0;
3537 : else
3538 : counted = 1;
3539 1 : rb_node = tree_search(blocks, leaf->start);
3540 1 : if (rb_node) {
3541 0 : if (counted)
3542 : added = 1;
3543 : else
3544 0 : path->slots[0] = nritems;
3545 : }
3546 :
3547 4 : while (ref_count > 0) {
3548 3 : while (path->slots[0] >= nritems) {
3549 0 : ret = btrfs_next_leaf(root, path);
3550 0 : if (ret < 0) {
3551 : err = ret;
3552 : goto out;
3553 : }
3554 0 : if (WARN_ON(ret > 0))
3555 : goto out;
3556 :
3557 0 : leaf = path->nodes[0];
3558 : nritems = btrfs_header_nritems(leaf);
3559 : added = 0;
3560 :
3561 0 : if (block_use_full_backref(rc, leaf))
3562 : counted = 0;
3563 : else
3564 : counted = 1;
3565 0 : rb_node = tree_search(blocks, leaf->start);
3566 0 : if (rb_node) {
3567 0 : if (counted)
3568 : added = 1;
3569 : else
3570 0 : path->slots[0] = nritems;
3571 : }
3572 : }
3573 :
3574 3 : btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
3575 3 : if (WARN_ON(key.objectid != ref_objectid ||
3576 : key.type != BTRFS_EXTENT_DATA_KEY))
3577 : break;
3578 :
3579 6 : fi = btrfs_item_ptr(leaf, path->slots[0],
3580 : struct btrfs_file_extent_item);
3581 :
3582 3 : if (btrfs_file_extent_type(leaf, fi) ==
3583 : BTRFS_FILE_EXTENT_INLINE)
3584 : goto next;
3585 :
3586 3 : if (btrfs_file_extent_disk_bytenr(leaf, fi) !=
3587 3 : extent_key->objectid)
3588 : goto next;
3589 :
3590 6 : key.offset -= btrfs_file_extent_offset(leaf, fi);
3591 3 : if (key.offset != ref_offset)
3592 : goto next;
3593 :
3594 3 : if (counted)
3595 3 : ref_count--;
3596 3 : if (added)
3597 : goto next;
3598 :
3599 1 : if (!tree_block_processed(leaf->start, leaf->len, rc)) {
3600 : block = kmalloc(sizeof(*block), GFP_NOFS);
3601 1 : if (!block) {
3602 : err = -ENOMEM;
3603 : break;
3604 : }
3605 1 : block->bytenr = leaf->start;
3606 1 : btrfs_item_key_to_cpu(leaf, &block->key, 0);
3607 1 : block->level = 0;
3608 1 : block->key_ready = 1;
3609 1 : rb_node = tree_insert(blocks, block->bytenr,
3610 : &block->rb_node);
3611 1 : if (rb_node)
3612 0 : backref_tree_panic(rb_node, -EEXIST,
3613 : block->bytenr);
3614 : }
3615 1 : if (counted)
3616 : added = 1;
3617 : else
3618 0 : path->slots[0] = nritems;
3619 : next:
3620 3 : path->slots[0]++;
3621 :
3622 : }
3623 : out:
3624 1 : btrfs_free_path(path);
3625 1 : return err;
3626 : }
3627 :
3628 : /*
3629 : * helper to find all tree blocks that reference a given data extent
3630 : */
3631 : static noinline_for_stack
3632 1021 : int add_data_references(struct reloc_control *rc,
3633 : struct btrfs_key *extent_key,
3634 : struct btrfs_path *path,
3635 : struct rb_root *blocks)
3636 : {
3637 : struct btrfs_key key;
3638 2042 : struct extent_buffer *eb;
3639 : struct btrfs_extent_data_ref *dref;
3640 : struct btrfs_extent_inline_ref *iref;
3641 : unsigned long ptr;
3642 : unsigned long end;
3643 1021 : u32 blocksize = btrfs_level_size(rc->extent_root, 0);
3644 : int ret = 0;
3645 : int err = 0;
3646 :
3647 1021 : eb = path->nodes[0];
3648 2042 : ptr = btrfs_item_ptr_offset(eb, path->slots[0]);
3649 2042 : end = ptr + btrfs_item_size_nr(eb, path->slots[0]);
3650 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
3651 1021 : if (ptr + sizeof(struct btrfs_extent_item_v0) == end)
3652 : ptr = end;
3653 : else
3654 : #endif
3655 1021 : ptr += sizeof(struct btrfs_extent_item);
3656 :
3657 2042 : while (ptr < end) {
3658 1021 : iref = (struct btrfs_extent_inline_ref *)ptr;
3659 1021 : key.type = btrfs_extent_inline_ref_type(eb, iref);
3660 1021 : if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
3661 1020 : key.offset = btrfs_extent_inline_ref_offset(eb, iref);
3662 1020 : ret = __add_tree_block(rc, key.offset, blocksize,
3663 : blocks);
3664 1 : } else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
3665 1 : dref = (struct btrfs_extent_data_ref *)(&iref->offset);
3666 1 : ret = find_data_references(rc, extent_key,
3667 : eb, dref, blocks);
3668 : } else {
3669 0 : BUG();
3670 : }
3671 1021 : if (ret) {
3672 : err = ret;
3673 : goto out;
3674 : }
3675 1021 : ptr += btrfs_extent_inline_ref_size(key.type);
3676 : }
3677 1021 : WARN_ON(ptr > end);
3678 :
3679 : while (1) {
3680 2042 : cond_resched();
3681 2042 : eb = path->nodes[0];
3682 4084 : if (path->slots[0] >= btrfs_header_nritems(eb)) {
3683 4 : ret = btrfs_next_leaf(rc->extent_root, path);
3684 4 : if (ret < 0) {
3685 : err = ret;
3686 : break;
3687 : }
3688 4 : if (ret > 0)
3689 : break;
3690 4 : eb = path->nodes[0];
3691 : }
3692 :
3693 2042 : btrfs_item_key_to_cpu(eb, &key, path->slots[0]);
3694 2042 : if (key.objectid != extent_key->objectid)
3695 : break;
3696 :
3697 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
3698 1021 : if (key.type == BTRFS_SHARED_DATA_REF_KEY ||
3699 : key.type == BTRFS_EXTENT_REF_V0_KEY) {
3700 : #else
3701 : BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
3702 : if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
3703 : #endif
3704 0 : ret = __add_tree_block(rc, key.offset, blocksize,
3705 : blocks);
3706 1021 : } else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
3707 0 : dref = btrfs_item_ptr(eb, path->slots[0],
3708 : struct btrfs_extent_data_ref);
3709 0 : ret = find_data_references(rc, extent_key,
3710 : eb, dref, blocks);
3711 : } else {
3712 : ret = 0;
3713 : }
3714 1021 : if (ret) {
3715 : err = ret;
3716 : break;
3717 : }
3718 1021 : path->slots[0]++;
3719 1021 : }
3720 : out:
3721 1021 : btrfs_release_path(path);
3722 1021 : if (err)
3723 0 : free_block_list(blocks);
3724 1021 : return err;
3725 : }
3726 :
3727 : /*
3728 : * helper to find next unprocessed extent
3729 : */
3730 : static noinline_for_stack
3731 2659 : int find_next_extent(struct btrfs_trans_handle *trans,
3732 : struct reloc_control *rc, struct btrfs_path *path,
3733 : struct btrfs_key *extent_key)
3734 : {
3735 : struct btrfs_key key;
3736 2758 : struct extent_buffer *leaf;
3737 : u64 start, end, last;
3738 : int ret;
3739 :
3740 2659 : last = rc->block_group->key.objectid + rc->block_group->key.offset;
3741 : while (1) {
3742 2660 : cond_resched();
3743 2660 : if (rc->search_start >= last) {
3744 : ret = 1;
3745 : break;
3746 : }
3747 :
3748 2660 : key.objectid = rc->search_start;
3749 2660 : key.type = BTRFS_EXTENT_ITEM_KEY;
3750 2660 : key.offset = 0;
3751 :
3752 2660 : path->search_commit_root = 1;
3753 2660 : path->skip_locking = 1;
3754 2660 : ret = btrfs_search_slot(NULL, rc->extent_root, &key, path,
3755 : 0, 0);
3756 2660 : if (ret < 0)
3757 : break;
3758 : next:
3759 2758 : leaf = path->nodes[0];
3760 5516 : if (path->slots[0] >= btrfs_header_nritems(leaf)) {
3761 9 : ret = btrfs_next_leaf(rc->extent_root, path);
3762 9 : if (ret != 0)
3763 : break;
3764 9 : leaf = path->nodes[0];
3765 : }
3766 :
3767 2758 : btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
3768 2758 : if (key.objectid >= last) {
3769 : ret = 1;
3770 : break;
3771 : }
3772 :
3773 2638 : if (key.type != BTRFS_EXTENT_ITEM_KEY &&
3774 : key.type != BTRFS_METADATA_ITEM_KEY) {
3775 98 : path->slots[0]++;
3776 : goto next;
3777 : }
3778 :
3779 5080 : if (key.type == BTRFS_EXTENT_ITEM_KEY &&
3780 2540 : key.objectid + key.offset <= rc->search_start) {
3781 0 : path->slots[0]++;
3782 : goto next;
3783 : }
3784 :
3785 2540 : if (key.type == BTRFS_METADATA_ITEM_KEY &&
3786 0 : key.objectid + rc->extent_root->leafsize <=
3787 0 : rc->search_start) {
3788 0 : path->slots[0]++;
3789 : goto next;
3790 : }
3791 :
3792 2540 : ret = find_first_extent_bit(&rc->processed_blocks,
3793 : key.objectid, &start, &end,
3794 : EXTENT_DIRTY, NULL);
3795 :
3796 2540 : if (ret == 0 && start <= key.objectid) {
3797 1 : btrfs_release_path(path);
3798 1 : rc->search_start = end + 1;
3799 : } else {
3800 2539 : if (key.type == BTRFS_EXTENT_ITEM_KEY)
3801 2539 : rc->search_start = key.objectid + key.offset;
3802 : else
3803 0 : rc->search_start = key.objectid +
3804 0 : rc->extent_root->leafsize;
3805 2539 : memcpy(extent_key, &key, sizeof(key));
3806 : return 0;
3807 : }
3808 : }
3809 120 : btrfs_release_path(path);
3810 : return ret;
3811 : }
3812 :
3813 240 : static void set_reloc_control(struct reloc_control *rc)
3814 : {
3815 240 : struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
3816 :
3817 240 : mutex_lock(&fs_info->reloc_mutex);
3818 240 : fs_info->reloc_ctl = rc;
3819 240 : mutex_unlock(&fs_info->reloc_mutex);
3820 240 : }
3821 :
3822 120 : static void unset_reloc_control(struct reloc_control *rc)
3823 : {
3824 120 : struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
3825 :
3826 120 : mutex_lock(&fs_info->reloc_mutex);
3827 120 : fs_info->reloc_ctl = NULL;
3828 120 : mutex_unlock(&fs_info->reloc_mutex);
3829 120 : }
3830 :
3831 : static int check_extent_flags(u64 flags)
3832 : {
3833 2539 : if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
3834 : (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
3835 : return 1;
3836 2539 : if (!(flags & BTRFS_EXTENT_FLAG_DATA) &&
3837 : !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
3838 : return 1;
3839 2539 : if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
3840 : (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF))
3841 : return 1;
3842 : return 0;
3843 : }
3844 :
3845 : static noinline_for_stack
3846 120 : int prepare_to_relocate(struct reloc_control *rc)
3847 : {
3848 : struct btrfs_trans_handle *trans;
3849 :
3850 120 : rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root,
3851 : BTRFS_BLOCK_RSV_TEMP);
3852 120 : if (!rc->block_rsv)
3853 : return -ENOMEM;
3854 :
3855 120 : memset(&rc->cluster, 0, sizeof(rc->cluster));
3856 120 : rc->search_start = rc->block_group->key.objectid;
3857 120 : rc->extents_found = 0;
3858 120 : rc->nodes_relocated = 0;
3859 120 : rc->merging_rsv_size = 0;
3860 120 : rc->reserved_bytes = 0;
3861 120 : rc->block_rsv->size = rc->extent_root->nodesize *
3862 : RELOCATION_RESERVED_NODES;
3863 :
3864 120 : rc->create_reloc_tree = 1;
3865 120 : set_reloc_control(rc);
3866 :
3867 120 : trans = btrfs_join_transaction(rc->extent_root);
3868 120 : if (IS_ERR(trans)) {
3869 0 : unset_reloc_control(rc);
3870 : /*
3871 : * extent tree is not a ref_cow tree and has no reloc_root to
3872 : * cleanup. And callers are responsible to free the above
3873 : * block rsv.
3874 : */
3875 0 : return PTR_ERR(trans);
3876 : }
3877 120 : btrfs_commit_transaction(trans, rc->extent_root);
3878 120 : return 0;
3879 : }
3880 :
3881 240 : static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
3882 : {
3883 120 : struct rb_root blocks = RB_ROOT;
3884 : struct btrfs_key key;
3885 2659 : struct btrfs_trans_handle *trans = NULL;
3886 : struct btrfs_path *path;
3887 : struct btrfs_extent_item *ei;
3888 : u64 flags;
3889 : u32 item_size;
3890 : int ret;
3891 : int err = 0;
3892 : int progress = 0;
3893 :
3894 120 : path = btrfs_alloc_path();
3895 120 : if (!path)
3896 : return -ENOMEM;
3897 120 : path->reada = 1;
3898 :
3899 120 : ret = prepare_to_relocate(rc);
3900 120 : if (ret) {
3901 : err = ret;
3902 : goto out_free;
3903 : }
3904 :
3905 : while (1) {
3906 2659 : rc->reserved_bytes = 0;
3907 2659 : ret = btrfs_block_rsv_refill(rc->extent_root,
3908 2659 : rc->block_rsv, rc->block_rsv->size,
3909 : BTRFS_RESERVE_FLUSH_ALL);
3910 2659 : if (ret) {
3911 : err = ret;
3912 : break;
3913 : }
3914 2659 : progress++;
3915 2659 : trans = btrfs_start_transaction(rc->extent_root, 0);
3916 2659 : if (IS_ERR(trans)) {
3917 0 : err = PTR_ERR(trans);
3918 : trans = NULL;
3919 0 : break;
3920 : }
3921 : restart:
3922 5318 : if (update_backref_cache(trans, &rc->backref_cache)) {
3923 0 : btrfs_end_transaction(trans, rc->extent_root);
3924 0 : continue;
3925 : }
3926 :
3927 2659 : ret = find_next_extent(trans, rc, path, &key);
3928 2659 : if (ret < 0)
3929 : err = ret;
3930 2659 : if (ret != 0)
3931 : break;
3932 :
3933 2539 : rc->extents_found++;
3934 :
3935 5078 : ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
3936 : struct btrfs_extent_item);
3937 2539 : item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
3938 2539 : if (item_size >= sizeof(*ei)) {
3939 2539 : flags = btrfs_extent_flags(path->nodes[0], ei);
3940 : ret = check_extent_flags(flags);
3941 2539 : BUG_ON(ret);
3942 :
3943 : } else {
3944 : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
3945 : u64 ref_owner;
3946 0 : int path_change = 0;
3947 :
3948 0 : BUG_ON(item_size !=
3949 : sizeof(struct btrfs_extent_item_v0));
3950 0 : ret = get_ref_objectid_v0(rc, path, &key, &ref_owner,
3951 : &path_change);
3952 0 : if (ref_owner < BTRFS_FIRST_FREE_OBJECTID)
3953 : flags = BTRFS_EXTENT_FLAG_TREE_BLOCK;
3954 : else
3955 : flags = BTRFS_EXTENT_FLAG_DATA;
3956 :
3957 0 : if (path_change) {
3958 0 : btrfs_release_path(path);
3959 :
3960 0 : path->search_commit_root = 1;
3961 0 : path->skip_locking = 1;
3962 0 : ret = btrfs_search_slot(NULL, rc->extent_root,
3963 : &key, path, 0, 0);
3964 0 : if (ret < 0) {
3965 : err = ret;
3966 0 : break;
3967 : }
3968 0 : BUG_ON(ret > 0);
3969 : }
3970 : #else
3971 : BUG();
3972 : #endif
3973 : }
3974 :
3975 2539 : if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
3976 497 : ret = add_tree_block(rc, &key, path, &blocks);
3977 3063 : } else if (rc->stage == UPDATE_DATA_PTRS &&
3978 1021 : (flags & BTRFS_EXTENT_FLAG_DATA)) {
3979 1021 : ret = add_data_references(rc, &key, path, &blocks);
3980 : } else {
3981 1021 : btrfs_release_path(path);
3982 : ret = 0;
3983 : }
3984 2539 : if (ret < 0) {
3985 : err = ret;
3986 : break;
3987 : }
3988 :
3989 2539 : if (!RB_EMPTY_ROOT(&blocks)) {
3990 505 : ret = relocate_tree_blocks(trans, rc, &blocks);
3991 505 : if (ret < 0) {
3992 : /*
3993 : * if we fail to relocate tree blocks, force to update
3994 : * backref cache when committing transaction.
3995 : */
3996 0 : rc->backref_cache.last_trans = trans->transid - 1;
3997 :
3998 0 : if (ret != -EAGAIN) {
3999 : err = ret;
4000 : break;
4001 : }
4002 0 : rc->extents_found--;
4003 0 : rc->search_start = key.objectid;
4004 : }
4005 : }
4006 :
4007 2539 : btrfs_end_transaction_throttle(trans, rc->extent_root);
4008 2539 : btrfs_btree_balance_dirty(rc->extent_root);
4009 : trans = NULL;
4010 :
4011 4057 : if (rc->stage == MOVE_DATA_EXTENTS &&
4012 1518 : (flags & BTRFS_EXTENT_FLAG_DATA)) {
4013 1021 : rc->found_file_extent = 1;
4014 1021 : ret = relocate_data_extent(rc->data_inode,
4015 : &key, &rc->cluster);
4016 1021 : if (ret < 0) {
4017 : err = ret;
4018 : break;
4019 : }
4020 : }
4021 : }
4022 120 : if (trans && progress && err == -ENOSPC) {
4023 0 : ret = btrfs_force_chunk_alloc(trans, rc->extent_root,
4024 0 : rc->block_group->flags);
4025 0 : if (ret == 0) {
4026 : err = 0;
4027 : progress = 0;
4028 : goto restart;
4029 : }
4030 : }
4031 :
4032 120 : btrfs_release_path(path);
4033 120 : clear_extent_bits(&rc->processed_blocks, 0, (u64)-1, EXTENT_DIRTY,
4034 : GFP_NOFS);
4035 :
4036 120 : if (trans) {
4037 120 : btrfs_end_transaction_throttle(trans, rc->extent_root);
4038 120 : btrfs_btree_balance_dirty(rc->extent_root);
4039 : }
4040 :
4041 120 : if (!err) {
4042 120 : ret = relocate_file_extent_cluster(rc->data_inode,
4043 : &rc->cluster);
4044 120 : if (ret < 0)
4045 : err = ret;
4046 : }
4047 :
4048 120 : rc->create_reloc_tree = 0;
4049 120 : set_reloc_control(rc);
4050 :
4051 120 : backref_cache_cleanup(&rc->backref_cache);
4052 120 : btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
4053 :
4054 120 : err = prepare_to_merge(rc, err);
4055 :
4056 120 : merge_reloc_roots(rc);
4057 :
4058 120 : rc->merge_reloc_tree = 0;
4059 120 : unset_reloc_control(rc);
4060 120 : btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
4061 :
4062 : /* get rid of pinned extents */
4063 120 : trans = btrfs_join_transaction(rc->extent_root);
4064 120 : if (IS_ERR(trans))
4065 0 : err = PTR_ERR(trans);
4066 : else
4067 120 : btrfs_commit_transaction(trans, rc->extent_root);
4068 : out_free:
4069 120 : btrfs_free_block_rsv(rc->extent_root, rc->block_rsv);
4070 120 : btrfs_free_path(path);
4071 120 : return err;
4072 : }
4073 :
4074 72 : static int __insert_orphan_inode(struct btrfs_trans_handle *trans,
4075 : struct btrfs_root *root, u64 objectid)
4076 : {
4077 : struct btrfs_path *path;
4078 : struct btrfs_inode_item *item;
4079 : struct extent_buffer *leaf;
4080 : int ret;
4081 :
4082 72 : path = btrfs_alloc_path();
4083 72 : if (!path)
4084 : return -ENOMEM;
4085 :
4086 72 : ret = btrfs_insert_empty_inode(trans, root, path, objectid);
4087 72 : if (ret)
4088 : goto out;
4089 :
4090 72 : leaf = path->nodes[0];
4091 144 : item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item);
4092 72 : memset_extent_buffer(leaf, 0, (unsigned long)item, sizeof(*item));
4093 : btrfs_set_inode_generation(leaf, item, 1);
4094 : btrfs_set_inode_size(leaf, item, 0);
4095 : btrfs_set_inode_mode(leaf, item, S_IFREG | 0600);
4096 : btrfs_set_inode_flags(leaf, item, BTRFS_INODE_NOCOMPRESS |
4097 : BTRFS_INODE_PREALLOC);
4098 72 : btrfs_mark_buffer_dirty(leaf);
4099 72 : btrfs_release_path(path);
4100 : out:
4101 72 : btrfs_free_path(path);
4102 72 : return ret;
4103 : }
4104 :
4105 : /*
4106 : * helper to create inode for data relocation.
4107 : * the inode is in data relocation tree and its link count is 0
4108 : */
4109 : static noinline_for_stack
4110 72 : struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,
4111 : struct btrfs_block_group_cache *group)
4112 : {
4113 : struct inode *inode = NULL;
4114 : struct btrfs_trans_handle *trans;
4115 : struct btrfs_root *root;
4116 : struct btrfs_key key;
4117 72 : u64 objectid = BTRFS_FIRST_FREE_OBJECTID;
4118 : int err = 0;
4119 :
4120 72 : root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID);
4121 72 : if (IS_ERR(root))
4122 : return ERR_CAST(root);
4123 :
4124 72 : trans = btrfs_start_transaction(root, 6);
4125 72 : if (IS_ERR(trans))
4126 : return ERR_CAST(trans);
4127 :
4128 72 : err = btrfs_find_free_objectid(root, &objectid);
4129 72 : if (err)
4130 : goto out;
4131 :
4132 72 : err = __insert_orphan_inode(trans, root, objectid);
4133 72 : BUG_ON(err);
4134 :
4135 72 : key.objectid = objectid;
4136 72 : key.type = BTRFS_INODE_ITEM_KEY;
4137 72 : key.offset = 0;
4138 72 : inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
4139 72 : BUG_ON(IS_ERR(inode) || is_bad_inode(inode));
4140 72 : BTRFS_I(inode)->index_cnt = group->key.objectid;
4141 :
4142 72 : err = btrfs_orphan_add(trans, inode);
4143 : out:
4144 72 : btrfs_end_transaction(trans, root);
4145 72 : btrfs_btree_balance_dirty(root);
4146 72 : if (err) {
4147 0 : if (inode)
4148 0 : iput(inode);
4149 0 : inode = ERR_PTR(err);
4150 : }
4151 : return inode;
4152 : }
4153 :
4154 72 : static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info)
4155 : {
4156 : struct reloc_control *rc;
4157 :
4158 72 : rc = kzalloc(sizeof(*rc), GFP_NOFS);
4159 72 : if (!rc)
4160 : return NULL;
4161 :
4162 72 : INIT_LIST_HEAD(&rc->reloc_roots);
4163 : backref_cache_init(&rc->backref_cache);
4164 : mapping_tree_init(&rc->reloc_root_tree);
4165 72 : extent_io_tree_init(&rc->processed_blocks,
4166 72 : fs_info->btree_inode->i_mapping);
4167 : return rc;
4168 : }
4169 :
4170 : /*
4171 : * function to relocate all extents in a block group.
4172 : */
4173 72 : int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)
4174 : {
4175 72 : struct btrfs_fs_info *fs_info = extent_root->fs_info;
4176 : struct reloc_control *rc;
4177 : struct inode *inode;
4178 : struct btrfs_path *path;
4179 : int ret;
4180 : int rw = 0;
4181 : int err = 0;
4182 :
4183 72 : rc = alloc_reloc_control(fs_info);
4184 72 : if (!rc)
4185 : return -ENOMEM;
4186 :
4187 72 : rc->extent_root = extent_root;
4188 :
4189 72 : rc->block_group = btrfs_lookup_block_group(fs_info, group_start);
4190 72 : BUG_ON(!rc->block_group);
4191 :
4192 72 : if (!rc->block_group->ro) {
4193 66 : ret = btrfs_set_block_group_ro(extent_root, rc->block_group);
4194 66 : if (ret) {
4195 : err = ret;
4196 : goto out;
4197 : }
4198 : rw = 1;
4199 : }
4200 :
4201 72 : path = btrfs_alloc_path();
4202 72 : if (!path) {
4203 : err = -ENOMEM;
4204 : goto out;
4205 : }
4206 :
4207 72 : inode = lookup_free_space_inode(fs_info->tree_root, rc->block_group,
4208 : path);
4209 72 : btrfs_free_path(path);
4210 :
4211 72 : if (!IS_ERR(inode))
4212 41 : ret = delete_block_group_cache(fs_info, inode, 0);
4213 : else
4214 31 : ret = PTR_ERR(inode);
4215 :
4216 72 : if (ret && ret != -ENOENT) {
4217 : err = ret;
4218 : goto out;
4219 : }
4220 :
4221 72 : rc->data_inode = create_reloc_inode(fs_info, rc->block_group);
4222 72 : if (IS_ERR(rc->data_inode)) {
4223 0 : err = PTR_ERR(rc->data_inode);
4224 0 : rc->data_inode = NULL;
4225 0 : goto out;
4226 : }
4227 :
4228 72 : btrfs_info(extent_root->fs_info, "relocating block group %llu flags %llu",
4229 : rc->block_group->key.objectid, rc->block_group->flags);
4230 :
4231 72 : ret = btrfs_start_delalloc_roots(fs_info, 0, -1);
4232 72 : if (ret < 0) {
4233 : err = ret;
4234 : goto out;
4235 : }
4236 72 : btrfs_wait_ordered_roots(fs_info, -1);
4237 :
4238 : while (1) {
4239 120 : mutex_lock(&fs_info->cleaner_mutex);
4240 120 : ret = relocate_block_group(rc);
4241 120 : mutex_unlock(&fs_info->cleaner_mutex);
4242 120 : if (ret < 0) {
4243 : err = ret;
4244 : goto out;
4245 : }
4246 :
4247 120 : if (rc->extents_found == 0)
4248 : break;
4249 :
4250 48 : btrfs_info(extent_root->fs_info, "found %llu extents",
4251 : rc->extents_found);
4252 :
4253 48 : if (rc->stage == MOVE_DATA_EXTENTS && rc->found_file_extent) {
4254 2 : ret = btrfs_wait_ordered_range(rc->data_inode, 0,
4255 : (u64)-1);
4256 2 : if (ret) {
4257 : err = ret;
4258 : goto out;
4259 : }
4260 2 : invalidate_mapping_pages(rc->data_inode->i_mapping,
4261 : 0, -1);
4262 2 : rc->stage = UPDATE_DATA_PTRS;
4263 : }
4264 : }
4265 :
4266 72 : WARN_ON(rc->block_group->pinned > 0);
4267 72 : WARN_ON(rc->block_group->reserved > 0);
4268 144 : WARN_ON(btrfs_block_group_used(&rc->block_group->item) > 0);
4269 : out:
4270 72 : if (err && rw)
4271 0 : btrfs_set_block_group_rw(extent_root, rc->block_group);
4272 72 : iput(rc->data_inode);
4273 72 : btrfs_put_block_group(rc->block_group);
4274 72 : kfree(rc);
4275 72 : return err;
4276 : }
4277 :
4278 0 : static noinline_for_stack int mark_garbage_root(struct btrfs_root *root)
4279 : {
4280 : struct btrfs_trans_handle *trans;
4281 : int ret, err;
4282 :
4283 0 : trans = btrfs_start_transaction(root->fs_info->tree_root, 0);
4284 0 : if (IS_ERR(trans))
4285 0 : return PTR_ERR(trans);
4286 :
4287 0 : memset(&root->root_item.drop_progress, 0,
4288 : sizeof(root->root_item.drop_progress));
4289 0 : root->root_item.drop_level = 0;
4290 : btrfs_set_root_refs(&root->root_item, 0);
4291 0 : ret = btrfs_update_root(trans, root->fs_info->tree_root,
4292 : &root->root_key, &root->root_item);
4293 :
4294 0 : err = btrfs_end_transaction(trans, root->fs_info->tree_root);
4295 0 : if (err)
4296 : return err;
4297 0 : return ret;
4298 : }
4299 :
4300 : /*
4301 : * recover relocation interrupted by system crash.
4302 : *
4303 : * this function resumes merging reloc trees with corresponding fs trees.
4304 : * this is important for keeping the sharing of tree blocks
4305 : */
4306 194 : int btrfs_recover_relocation(struct btrfs_root *root)
4307 : {
4308 194 : LIST_HEAD(reloc_roots);
4309 : struct btrfs_key key;
4310 : struct btrfs_root *fs_root;
4311 : struct btrfs_root *reloc_root;
4312 : struct btrfs_path *path;
4313 : struct extent_buffer *leaf;
4314 0 : struct reloc_control *rc = NULL;
4315 : struct btrfs_trans_handle *trans;
4316 : int ret;
4317 : int err = 0;
4318 :
4319 194 : path = btrfs_alloc_path();
4320 194 : if (!path)
4321 : return -ENOMEM;
4322 194 : path->reada = -1;
4323 :
4324 194 : key.objectid = BTRFS_TREE_RELOC_OBJECTID;
4325 194 : key.type = BTRFS_ROOT_ITEM_KEY;
4326 194 : key.offset = (u64)-1;
4327 :
4328 : while (1) {
4329 194 : ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key,
4330 : path, 0, 0);
4331 194 : if (ret < 0) {
4332 : err = ret;
4333 : goto out;
4334 : }
4335 194 : if (ret > 0) {
4336 194 : if (path->slots[0] == 0)
4337 : break;
4338 194 : path->slots[0]--;
4339 : }
4340 194 : leaf = path->nodes[0];
4341 194 : btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
4342 194 : btrfs_release_path(path);
4343 :
4344 194 : if (key.objectid != BTRFS_TREE_RELOC_OBJECTID ||
4345 0 : key.type != BTRFS_ROOT_ITEM_KEY)
4346 : break;
4347 :
4348 0 : reloc_root = btrfs_read_fs_root(root, &key);
4349 0 : if (IS_ERR(reloc_root)) {
4350 0 : err = PTR_ERR(reloc_root);
4351 0 : goto out;
4352 : }
4353 :
4354 0 : list_add(&reloc_root->root_list, &reloc_roots);
4355 :
4356 0 : if (btrfs_root_refs(&reloc_root->root_item) > 0) {
4357 0 : fs_root = read_fs_root(root->fs_info,
4358 : reloc_root->root_key.offset);
4359 0 : if (IS_ERR(fs_root)) {
4360 0 : ret = PTR_ERR(fs_root);
4361 0 : if (ret != -ENOENT) {
4362 : err = ret;
4363 : goto out;
4364 : }
4365 0 : ret = mark_garbage_root(reloc_root);
4366 0 : if (ret < 0) {
4367 : err = ret;
4368 : goto out;
4369 : }
4370 : }
4371 : }
4372 :
4373 0 : if (key.offset == 0)
4374 : break;
4375 :
4376 0 : key.offset--;
4377 0 : }
4378 194 : btrfs_release_path(path);
4379 :
4380 194 : if (list_empty(&reloc_roots))
4381 : goto out;
4382 :
4383 0 : rc = alloc_reloc_control(root->fs_info);
4384 0 : if (!rc) {
4385 : err = -ENOMEM;
4386 : goto out;
4387 : }
4388 :
4389 0 : rc->extent_root = root->fs_info->extent_root;
4390 :
4391 0 : set_reloc_control(rc);
4392 :
4393 0 : trans = btrfs_join_transaction(rc->extent_root);
4394 0 : if (IS_ERR(trans)) {
4395 0 : unset_reloc_control(rc);
4396 0 : err = PTR_ERR(trans);
4397 0 : goto out_free;
4398 : }
4399 :
4400 0 : rc->merge_reloc_tree = 1;
4401 :
4402 0 : while (!list_empty(&reloc_roots)) {
4403 0 : reloc_root = list_entry(reloc_roots.next,
4404 : struct btrfs_root, root_list);
4405 0 : list_del(&reloc_root->root_list);
4406 :
4407 0 : if (btrfs_root_refs(&reloc_root->root_item) == 0) {
4408 0 : list_add_tail(&reloc_root->root_list,
4409 : &rc->reloc_roots);
4410 0 : continue;
4411 : }
4412 :
4413 0 : fs_root = read_fs_root(root->fs_info,
4414 : reloc_root->root_key.offset);
4415 0 : if (IS_ERR(fs_root)) {
4416 0 : err = PTR_ERR(fs_root);
4417 0 : goto out_free;
4418 : }
4419 :
4420 0 : err = __add_reloc_root(reloc_root);
4421 0 : BUG_ON(err < 0); /* -ENOMEM or logic error */
4422 0 : fs_root->reloc_root = reloc_root;
4423 : }
4424 :
4425 0 : err = btrfs_commit_transaction(trans, rc->extent_root);
4426 0 : if (err)
4427 : goto out_free;
4428 :
4429 0 : merge_reloc_roots(rc);
4430 :
4431 0 : unset_reloc_control(rc);
4432 :
4433 0 : trans = btrfs_join_transaction(rc->extent_root);
4434 0 : if (IS_ERR(trans))
4435 0 : err = PTR_ERR(trans);
4436 : else
4437 0 : err = btrfs_commit_transaction(trans, rc->extent_root);
4438 : out_free:
4439 0 : kfree(rc);
4440 : out:
4441 194 : if (!list_empty(&reloc_roots))
4442 0 : free_reloc_roots(&reloc_roots);
4443 :
4444 194 : btrfs_free_path(path);
4445 :
4446 194 : if (err == 0) {
4447 : /* cleanup orphan inode in data relocation tree */
4448 194 : fs_root = read_fs_root(root->fs_info,
4449 : BTRFS_DATA_RELOC_TREE_OBJECTID);
4450 194 : if (IS_ERR(fs_root))
4451 0 : err = PTR_ERR(fs_root);
4452 : else
4453 194 : err = btrfs_orphan_cleanup(fs_root);
4454 : }
4455 194 : return err;
4456 : }
4457 :
4458 : /*
4459 : * helper to add ordered checksum for data relocation.
4460 : *
4461 : * cloning checksum properly handles the nodatasum extents.
4462 : * it also saves CPU time to re-calculate the checksum.
4463 : */
4464 1021 : int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len)
4465 : {
4466 : struct btrfs_ordered_sum *sums;
4467 : struct btrfs_ordered_extent *ordered;
4468 1021 : struct btrfs_root *root = BTRFS_I(inode)->root;
4469 : int ret;
4470 : u64 disk_bytenr;
4471 : u64 new_bytenr;
4472 1021 : LIST_HEAD(list);
4473 :
4474 1021 : ordered = btrfs_lookup_ordered_extent(inode, file_pos);
4475 1021 : BUG_ON(ordered->file_offset != file_pos || ordered->len != len);
4476 :
4477 1021 : disk_bytenr = file_pos + BTRFS_I(inode)->index_cnt;
4478 1021 : ret = btrfs_lookup_csums_range(root->fs_info->csum_root, disk_bytenr,
4479 1021 : disk_bytenr + len - 1, &list, 0);
4480 1021 : if (ret)
4481 : goto out;
4482 :
4483 2042 : while (!list_empty(&list)) {
4484 1021 : sums = list_entry(list.next, struct btrfs_ordered_sum, list);
4485 1021 : list_del_init(&sums->list);
4486 :
4487 : /*
4488 : * We need to offset the new_bytenr based on where the csum is.
4489 : * We need to do this because we will read in entire prealloc
4490 : * extents but we may have written to say the middle of the
4491 : * prealloc extent, so we need to make sure the csum goes with
4492 : * the right disk offset.
4493 : *
4494 : * We can do this because the data reloc inode refers strictly
4495 : * to the on disk bytes, so we don't have to worry about
4496 : * disk_len vs real len like with real inodes since it's all
4497 : * disk length.
4498 : */
4499 1021 : new_bytenr = ordered->start + (sums->bytenr - disk_bytenr);
4500 1021 : sums->bytenr = new_bytenr;
4501 :
4502 1021 : btrfs_add_ordered_sum(inode, ordered, sums);
4503 : }
4504 : out:
4505 1021 : btrfs_put_ordered_extent(ordered);
4506 1021 : return ret;
4507 : }
4508 :
4509 22831 : int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
4510 505 : struct btrfs_root *root, struct extent_buffer *buf,
4511 : struct extent_buffer *cow)
4512 : {
4513 : struct reloc_control *rc;
4514 : struct backref_node *node;
4515 : int first_cow = 0;
4516 : int level;
4517 : int ret = 0;
4518 :
4519 22831 : rc = root->fs_info->reloc_ctl;
4520 22831 : if (!rc)
4521 : return 0;
4522 :
4523 505 : BUG_ON(rc->stage == UPDATE_DATA_PTRS &&
4524 : root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID);
4525 :
4526 505 : if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
4527 18 : if (buf == root->node)
4528 2 : __update_reloc_root(root, cow->start);
4529 : }
4530 :
4531 505 : level = btrfs_header_level(buf);
4532 505 : if (btrfs_header_generation(buf) <=
4533 : btrfs_root_last_snapshot(&root->root_item))
4534 : first_cow = 1;
4535 :
4536 505 : if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID &&
4537 : rc->create_reloc_tree) {
4538 16 : WARN_ON(!first_cow && level == 0);
4539 :
4540 16 : node = rc->backref_cache.path[level];
4541 16 : BUG_ON(node->bytenr != buf->start &&
4542 : node->new_bytenr != buf->start);
4543 :
4544 16 : drop_node_buffer(node);
4545 : extent_buffer_get(cow);
4546 16 : node->eb = cow;
4547 16 : node->new_bytenr = cow->start;
4548 :
4549 16 : if (!node->pending) {
4550 16 : list_move_tail(&node->list,
4551 : &rc->backref_cache.pending[level]);
4552 16 : node->pending = 1;
4553 : }
4554 :
4555 16 : if (first_cow)
4556 16 : __mark_block_processed(rc, node);
4557 :
4558 16 : if (first_cow && level > 0)
4559 0 : rc->nodes_relocated += buf->len;
4560 : }
4561 :
4562 505 : if (level == 0 && first_cow && rc->stage == UPDATE_DATA_PTRS)
4563 8 : ret = replace_file_extents(trans, rc, root, cow);
4564 505 : return ret;
4565 : }
4566 :
4567 : /*
4568 : * called before creating snapshot. it calculates metadata reservation
4569 : * requried for relocating tree blocks in the snapshot
4570 : */
4571 146 : void btrfs_reloc_pre_snapshot(struct btrfs_trans_handle *trans,
4572 : struct btrfs_pending_snapshot *pending,
4573 : u64 *bytes_to_reserve)
4574 : {
4575 : struct btrfs_root *root;
4576 : struct reloc_control *rc;
4577 :
4578 146 : root = pending->root;
4579 146 : if (!root->reloc_root)
4580 : return;
4581 :
4582 10 : rc = root->fs_info->reloc_ctl;
4583 10 : if (!rc->merge_reloc_tree)
4584 : return;
4585 :
4586 : root = root->reloc_root;
4587 4 : BUG_ON(btrfs_root_refs(&root->root_item) == 0);
4588 : /*
4589 : * relocation is in the stage of merging trees. the space
4590 : * used by merging a reloc tree is twice the size of
4591 : * relocated tree nodes in the worst case. half for cowing
4592 : * the reloc tree, half for cowing the fs tree. the space
4593 : * used by cowing the reloc tree will be freed after the
4594 : * tree is dropped. if we create snapshot, cowing the fs
4595 : * tree may use more space than it frees. so we need
4596 : * reserve extra space.
4597 : */
4598 4 : *bytes_to_reserve += rc->nodes_relocated;
4599 : }
4600 :
4601 : /*
4602 : * called after snapshot is created. migrate block reservation
4603 : * and create reloc root for the newly created snapshot
4604 : */
4605 146 : int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
4606 : struct btrfs_pending_snapshot *pending)
4607 : {
4608 152 : struct btrfs_root *root = pending->root;
4609 : struct btrfs_root *reloc_root;
4610 : struct btrfs_root *new_root;
4611 : struct reloc_control *rc;
4612 : int ret;
4613 :
4614 146 : if (!root->reloc_root)
4615 : return 0;
4616 :
4617 10 : rc = root->fs_info->reloc_ctl;
4618 10 : rc->merging_rsv_size += rc->nodes_relocated;
4619 :
4620 10 : if (rc->merge_reloc_tree) {
4621 4 : ret = btrfs_block_rsv_migrate(&pending->block_rsv,
4622 : rc->block_rsv,
4623 : rc->nodes_relocated);
4624 4 : if (ret)
4625 : return ret;
4626 : }
4627 :
4628 10 : new_root = pending->snap;
4629 10 : reloc_root = create_reloc_root(trans, root->reloc_root,
4630 : new_root->root_key.objectid);
4631 10 : if (IS_ERR(reloc_root))
4632 0 : return PTR_ERR(reloc_root);
4633 :
4634 10 : ret = __add_reloc_root(reloc_root);
4635 10 : BUG_ON(ret < 0);
4636 10 : new_root->reloc_root = reloc_root;
4637 :
4638 10 : if (rc->create_reloc_tree)
4639 6 : ret = clone_backref_node(trans, rc, root, reloc_root);
4640 10 : return ret;
4641 : }
|