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