This source file includes following definitions.
- check_extent_in_eb
- free_inode_elem_list
- find_extent_in_eb
- extent_is_shared
- btrfs_prelim_ref_init
- btrfs_prelim_ref_exit
- free_pref
- prelim_ref_compare
- update_share_count
- prelim_ref_insert
- prelim_release
- add_prelim_ref
- add_direct_ref
- add_indirect_ref
- add_all_parents
- resolve_indirect_ref
- unode_aux_to_inode_list
- resolve_indirect_refs
- add_missing_keys
- add_delayed_refs
- add_inline_refs
- add_keyed_refs
- find_parent_nodes
- free_leaf_list
- btrfs_find_all_leafs
- btrfs_find_all_roots_safe
- btrfs_find_all_roots
- btrfs_check_shared
- btrfs_find_one_extref
- btrfs_ref_to_path
- extent_from_logical
- get_extent_inline_ref
- tree_backref_for_extent
- iterate_leaf_refs
- iterate_extent_inodes
- iterate_inodes_from_logical
- iterate_inode_refs
- iterate_inode_extrefs
- iterate_irefs
- inode_to_path
- paths_from_inode
- init_data_container
- init_ipath
- free_ipath
1
2
3
4
5
6 #include <linux/mm.h>
7 #include <linux/rbtree.h>
8 #include <trace/events/btrfs.h>
9 #include "ctree.h"
10 #include "disk-io.h"
11 #include "backref.h"
12 #include "ulist.h"
13 #include "transaction.h"
14 #include "delayed-ref.h"
15 #include "locking.h"
16
17
18 #define BACKREF_FOUND_SHARED 6
19
20 struct extent_inode_elem {
21 u64 inum;
22 u64 offset;
23 struct extent_inode_elem *next;
24 };
25
26 static int check_extent_in_eb(const struct btrfs_key *key,
27 const struct extent_buffer *eb,
28 const struct btrfs_file_extent_item *fi,
29 u64 extent_item_pos,
30 struct extent_inode_elem **eie,
31 bool ignore_offset)
32 {
33 u64 offset = 0;
34 struct extent_inode_elem *e;
35
36 if (!ignore_offset &&
37 !btrfs_file_extent_compression(eb, fi) &&
38 !btrfs_file_extent_encryption(eb, fi) &&
39 !btrfs_file_extent_other_encoding(eb, fi)) {
40 u64 data_offset;
41 u64 data_len;
42
43 data_offset = btrfs_file_extent_offset(eb, fi);
44 data_len = btrfs_file_extent_num_bytes(eb, fi);
45
46 if (extent_item_pos < data_offset ||
47 extent_item_pos >= data_offset + data_len)
48 return 1;
49 offset = extent_item_pos - data_offset;
50 }
51
52 e = kmalloc(sizeof(*e), GFP_NOFS);
53 if (!e)
54 return -ENOMEM;
55
56 e->next = *eie;
57 e->inum = key->objectid;
58 e->offset = key->offset + offset;
59 *eie = e;
60
61 return 0;
62 }
63
64 static void free_inode_elem_list(struct extent_inode_elem *eie)
65 {
66 struct extent_inode_elem *eie_next;
67
68 for (; eie; eie = eie_next) {
69 eie_next = eie->next;
70 kfree(eie);
71 }
72 }
73
74 static int find_extent_in_eb(const struct extent_buffer *eb,
75 u64 wanted_disk_byte, u64 extent_item_pos,
76 struct extent_inode_elem **eie,
77 bool ignore_offset)
78 {
79 u64 disk_byte;
80 struct btrfs_key key;
81 struct btrfs_file_extent_item *fi;
82 int slot;
83 int nritems;
84 int extent_type;
85 int ret;
86
87
88
89
90
91
92 nritems = btrfs_header_nritems(eb);
93 for (slot = 0; slot < nritems; ++slot) {
94 btrfs_item_key_to_cpu(eb, &key, slot);
95 if (key.type != BTRFS_EXTENT_DATA_KEY)
96 continue;
97 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
98 extent_type = btrfs_file_extent_type(eb, fi);
99 if (extent_type == BTRFS_FILE_EXTENT_INLINE)
100 continue;
101
102 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
103 if (disk_byte != wanted_disk_byte)
104 continue;
105
106 ret = check_extent_in_eb(&key, eb, fi, extent_item_pos, eie, ignore_offset);
107 if (ret < 0)
108 return ret;
109 }
110
111 return 0;
112 }
113
114 struct preftree {
115 struct rb_root_cached root;
116 unsigned int count;
117 };
118
119 #define PREFTREE_INIT { .root = RB_ROOT_CACHED, .count = 0 }
120
121 struct preftrees {
122 struct preftree direct;
123 struct preftree indirect;
124 struct preftree indirect_missing_keys;
125 };
126
127
128
129
130
131
132
133
134
135 struct share_check {
136 u64 root_objectid;
137 u64 inum;
138 int share_count;
139 };
140
141 static inline int extent_is_shared(struct share_check *sc)
142 {
143 return (sc && sc->share_count > 1) ? BACKREF_FOUND_SHARED : 0;
144 }
145
146 static struct kmem_cache *btrfs_prelim_ref_cache;
147
148 int __init btrfs_prelim_ref_init(void)
149 {
150 btrfs_prelim_ref_cache = kmem_cache_create("btrfs_prelim_ref",
151 sizeof(struct prelim_ref),
152 0,
153 SLAB_MEM_SPREAD,
154 NULL);
155 if (!btrfs_prelim_ref_cache)
156 return -ENOMEM;
157 return 0;
158 }
159
160 void __cold btrfs_prelim_ref_exit(void)
161 {
162 kmem_cache_destroy(btrfs_prelim_ref_cache);
163 }
164
165 static void free_pref(struct prelim_ref *ref)
166 {
167 kmem_cache_free(btrfs_prelim_ref_cache, ref);
168 }
169
170
171
172
173
174
175 static int prelim_ref_compare(struct prelim_ref *ref1,
176 struct prelim_ref *ref2)
177 {
178 if (ref1->level < ref2->level)
179 return -1;
180 if (ref1->level > ref2->level)
181 return 1;
182 if (ref1->root_id < ref2->root_id)
183 return -1;
184 if (ref1->root_id > ref2->root_id)
185 return 1;
186 if (ref1->key_for_search.type < ref2->key_for_search.type)
187 return -1;
188 if (ref1->key_for_search.type > ref2->key_for_search.type)
189 return 1;
190 if (ref1->key_for_search.objectid < ref2->key_for_search.objectid)
191 return -1;
192 if (ref1->key_for_search.objectid > ref2->key_for_search.objectid)
193 return 1;
194 if (ref1->key_for_search.offset < ref2->key_for_search.offset)
195 return -1;
196 if (ref1->key_for_search.offset > ref2->key_for_search.offset)
197 return 1;
198 if (ref1->parent < ref2->parent)
199 return -1;
200 if (ref1->parent > ref2->parent)
201 return 1;
202
203 return 0;
204 }
205
206 static void update_share_count(struct share_check *sc, int oldcount,
207 int newcount)
208 {
209 if ((!sc) || (oldcount == 0 && newcount < 1))
210 return;
211
212 if (oldcount > 0 && newcount < 1)
213 sc->share_count--;
214 else if (oldcount < 1 && newcount > 0)
215 sc->share_count++;
216 }
217
218
219
220
221
222
223 static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
224 struct preftree *preftree,
225 struct prelim_ref *newref,
226 struct share_check *sc)
227 {
228 struct rb_root_cached *root;
229 struct rb_node **p;
230 struct rb_node *parent = NULL;
231 struct prelim_ref *ref;
232 int result;
233 bool leftmost = true;
234
235 root = &preftree->root;
236 p = &root->rb_root.rb_node;
237
238 while (*p) {
239 parent = *p;
240 ref = rb_entry(parent, struct prelim_ref, rbnode);
241 result = prelim_ref_compare(ref, newref);
242 if (result < 0) {
243 p = &(*p)->rb_left;
244 } else if (result > 0) {
245 p = &(*p)->rb_right;
246 leftmost = false;
247 } else {
248
249 struct extent_inode_elem *eie = ref->inode_list;
250
251 while (eie && eie->next)
252 eie = eie->next;
253
254 if (!eie)
255 ref->inode_list = newref->inode_list;
256 else
257 eie->next = newref->inode_list;
258 trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
259 preftree->count);
260
261
262
263
264
265 update_share_count(sc, ref->count,
266 ref->count + newref->count);
267 ref->count += newref->count;
268 free_pref(newref);
269 return;
270 }
271 }
272
273 update_share_count(sc, 0, newref->count);
274 preftree->count++;
275 trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
276 rb_link_node(&newref->rbnode, parent, p);
277 rb_insert_color_cached(&newref->rbnode, root, leftmost);
278 }
279
280
281
282
283
284 static void prelim_release(struct preftree *preftree)
285 {
286 struct prelim_ref *ref, *next_ref;
287
288 rbtree_postorder_for_each_entry_safe(ref, next_ref,
289 &preftree->root.rb_root, rbnode)
290 free_pref(ref);
291
292 preftree->root = RB_ROOT_CACHED;
293 preftree->count = 0;
294 }
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334 static int add_prelim_ref(const struct btrfs_fs_info *fs_info,
335 struct preftree *preftree, u64 root_id,
336 const struct btrfs_key *key, int level, u64 parent,
337 u64 wanted_disk_byte, int count,
338 struct share_check *sc, gfp_t gfp_mask)
339 {
340 struct prelim_ref *ref;
341
342 if (root_id == BTRFS_DATA_RELOC_TREE_OBJECTID)
343 return 0;
344
345 ref = kmem_cache_alloc(btrfs_prelim_ref_cache, gfp_mask);
346 if (!ref)
347 return -ENOMEM;
348
349 ref->root_id = root_id;
350 if (key) {
351 ref->key_for_search = *key;
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371 if (ref->key_for_search.type == BTRFS_EXTENT_DATA_KEY &&
372 ref->key_for_search.offset >= LLONG_MAX)
373 ref->key_for_search.offset = 0;
374 } else {
375 memset(&ref->key_for_search, 0, sizeof(ref->key_for_search));
376 }
377
378 ref->inode_list = NULL;
379 ref->level = level;
380 ref->count = count;
381 ref->parent = parent;
382 ref->wanted_disk_byte = wanted_disk_byte;
383 prelim_ref_insert(fs_info, preftree, ref, sc);
384 return extent_is_shared(sc);
385 }
386
387
388 static int add_direct_ref(const struct btrfs_fs_info *fs_info,
389 struct preftrees *preftrees, int level, u64 parent,
390 u64 wanted_disk_byte, int count,
391 struct share_check *sc, gfp_t gfp_mask)
392 {
393 return add_prelim_ref(fs_info, &preftrees->direct, 0, NULL, level,
394 parent, wanted_disk_byte, count, sc, gfp_mask);
395 }
396
397
398 static int add_indirect_ref(const struct btrfs_fs_info *fs_info,
399 struct preftrees *preftrees, u64 root_id,
400 const struct btrfs_key *key, int level,
401 u64 wanted_disk_byte, int count,
402 struct share_check *sc, gfp_t gfp_mask)
403 {
404 struct preftree *tree = &preftrees->indirect;
405
406 if (!key)
407 tree = &preftrees->indirect_missing_keys;
408 return add_prelim_ref(fs_info, tree, root_id, key, level, 0,
409 wanted_disk_byte, count, sc, gfp_mask);
410 }
411
412 static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
413 struct ulist *parents, struct prelim_ref *ref,
414 int level, u64 time_seq, const u64 *extent_item_pos,
415 u64 total_refs, bool ignore_offset)
416 {
417 int ret = 0;
418 int slot;
419 struct extent_buffer *eb;
420 struct btrfs_key key;
421 struct btrfs_key *key_for_search = &ref->key_for_search;
422 struct btrfs_file_extent_item *fi;
423 struct extent_inode_elem *eie = NULL, *old = NULL;
424 u64 disk_byte;
425 u64 wanted_disk_byte = ref->wanted_disk_byte;
426 u64 count = 0;
427
428 if (level != 0) {
429 eb = path->nodes[level];
430 ret = ulist_add(parents, eb->start, 0, GFP_NOFS);
431 if (ret < 0)
432 return ret;
433 return 0;
434 }
435
436
437
438
439
440
441 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
442 if (time_seq == SEQ_LAST)
443 ret = btrfs_next_leaf(root, path);
444 else
445 ret = btrfs_next_old_leaf(root, path, time_seq);
446 }
447
448 while (!ret && count < total_refs) {
449 eb = path->nodes[0];
450 slot = path->slots[0];
451
452 btrfs_item_key_to_cpu(eb, &key, slot);
453
454 if (key.objectid != key_for_search->objectid ||
455 key.type != BTRFS_EXTENT_DATA_KEY)
456 break;
457
458 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
459 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
460
461 if (disk_byte == wanted_disk_byte) {
462 eie = NULL;
463 old = NULL;
464 count++;
465 if (extent_item_pos) {
466 ret = check_extent_in_eb(&key, eb, fi,
467 *extent_item_pos,
468 &eie, ignore_offset);
469 if (ret < 0)
470 break;
471 }
472 if (ret > 0)
473 goto next;
474 ret = ulist_add_merge_ptr(parents, eb->start,
475 eie, (void **)&old, GFP_NOFS);
476 if (ret < 0)
477 break;
478 if (!ret && extent_item_pos) {
479 while (old->next)
480 old = old->next;
481 old->next = eie;
482 }
483 eie = NULL;
484 }
485 next:
486 if (time_seq == SEQ_LAST)
487 ret = btrfs_next_item(root, path);
488 else
489 ret = btrfs_next_old_item(root, path, time_seq);
490 }
491
492 if (ret > 0)
493 ret = 0;
494 else if (ret < 0)
495 free_inode_elem_list(eie);
496 return ret;
497 }
498
499
500
501
502
503 static int resolve_indirect_ref(struct btrfs_fs_info *fs_info,
504 struct btrfs_path *path, u64 time_seq,
505 struct prelim_ref *ref, struct ulist *parents,
506 const u64 *extent_item_pos, u64 total_refs,
507 bool ignore_offset)
508 {
509 struct btrfs_root *root;
510 struct btrfs_key root_key;
511 struct extent_buffer *eb;
512 int ret = 0;
513 int root_level;
514 int level = ref->level;
515 int index;
516
517 root_key.objectid = ref->root_id;
518 root_key.type = BTRFS_ROOT_ITEM_KEY;
519 root_key.offset = (u64)-1;
520
521 index = srcu_read_lock(&fs_info->subvol_srcu);
522
523 root = btrfs_get_fs_root(fs_info, &root_key, false);
524 if (IS_ERR(root)) {
525 srcu_read_unlock(&fs_info->subvol_srcu, index);
526 ret = PTR_ERR(root);
527 goto out;
528 }
529
530 if (btrfs_is_testing(fs_info)) {
531 srcu_read_unlock(&fs_info->subvol_srcu, index);
532 ret = -ENOENT;
533 goto out;
534 }
535
536 if (path->search_commit_root)
537 root_level = btrfs_header_level(root->commit_root);
538 else if (time_seq == SEQ_LAST)
539 root_level = btrfs_header_level(root->node);
540 else
541 root_level = btrfs_old_root_level(root, time_seq);
542
543 if (root_level + 1 == level) {
544 srcu_read_unlock(&fs_info->subvol_srcu, index);
545 goto out;
546 }
547
548 path->lowest_level = level;
549 if (time_seq == SEQ_LAST)
550 ret = btrfs_search_slot(NULL, root, &ref->key_for_search, path,
551 0, 0);
552 else
553 ret = btrfs_search_old_slot(root, &ref->key_for_search, path,
554 time_seq);
555
556
557 srcu_read_unlock(&fs_info->subvol_srcu, index);
558
559 btrfs_debug(fs_info,
560 "search slot in root %llu (level %d, ref count %d) returned %d for key (%llu %u %llu)",
561 ref->root_id, level, ref->count, ret,
562 ref->key_for_search.objectid, ref->key_for_search.type,
563 ref->key_for_search.offset);
564 if (ret < 0)
565 goto out;
566
567 eb = path->nodes[level];
568 while (!eb) {
569 if (WARN_ON(!level)) {
570 ret = 1;
571 goto out;
572 }
573 level--;
574 eb = path->nodes[level];
575 }
576
577 ret = add_all_parents(root, path, parents, ref, level, time_seq,
578 extent_item_pos, total_refs, ignore_offset);
579 out:
580 path->lowest_level = 0;
581 btrfs_release_path(path);
582 return ret;
583 }
584
585 static struct extent_inode_elem *
586 unode_aux_to_inode_list(struct ulist_node *node)
587 {
588 if (!node)
589 return NULL;
590 return (struct extent_inode_elem *)(uintptr_t)node->aux;
591 }
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609 static int resolve_indirect_refs(struct btrfs_fs_info *fs_info,
610 struct btrfs_path *path, u64 time_seq,
611 struct preftrees *preftrees,
612 const u64 *extent_item_pos, u64 total_refs,
613 struct share_check *sc, bool ignore_offset)
614 {
615 int err;
616 int ret = 0;
617 struct ulist *parents;
618 struct ulist_node *node;
619 struct ulist_iterator uiter;
620 struct rb_node *rnode;
621
622 parents = ulist_alloc(GFP_NOFS);
623 if (!parents)
624 return -ENOMEM;
625
626
627
628
629
630
631
632 while ((rnode = rb_first_cached(&preftrees->indirect.root))) {
633 struct prelim_ref *ref;
634
635 ref = rb_entry(rnode, struct prelim_ref, rbnode);
636 if (WARN(ref->parent,
637 "BUG: direct ref found in indirect tree")) {
638 ret = -EINVAL;
639 goto out;
640 }
641
642 rb_erase_cached(&ref->rbnode, &preftrees->indirect.root);
643 preftrees->indirect.count--;
644
645 if (ref->count == 0) {
646 free_pref(ref);
647 continue;
648 }
649
650 if (sc && sc->root_objectid &&
651 ref->root_id != sc->root_objectid) {
652 free_pref(ref);
653 ret = BACKREF_FOUND_SHARED;
654 goto out;
655 }
656 err = resolve_indirect_ref(fs_info, path, time_seq, ref,
657 parents, extent_item_pos,
658 total_refs, ignore_offset);
659
660
661
662
663 if (err == -ENOENT) {
664 prelim_ref_insert(fs_info, &preftrees->direct, ref,
665 NULL);
666 continue;
667 } else if (err) {
668 free_pref(ref);
669 ret = err;
670 goto out;
671 }
672
673
674 ULIST_ITER_INIT(&uiter);
675 node = ulist_next(parents, &uiter);
676 ref->parent = node ? node->val : 0;
677 ref->inode_list = unode_aux_to_inode_list(node);
678
679
680 while ((node = ulist_next(parents, &uiter))) {
681 struct prelim_ref *new_ref;
682
683 new_ref = kmem_cache_alloc(btrfs_prelim_ref_cache,
684 GFP_NOFS);
685 if (!new_ref) {
686 free_pref(ref);
687 ret = -ENOMEM;
688 goto out;
689 }
690 memcpy(new_ref, ref, sizeof(*ref));
691 new_ref->parent = node->val;
692 new_ref->inode_list = unode_aux_to_inode_list(node);
693 prelim_ref_insert(fs_info, &preftrees->direct,
694 new_ref, NULL);
695 }
696
697
698
699
700
701 prelim_ref_insert(fs_info, &preftrees->direct, ref, NULL);
702
703 ulist_reinit(parents);
704 cond_resched();
705 }
706 out:
707 ulist_free(parents);
708 return ret;
709 }
710
711
712
713
714 static int add_missing_keys(struct btrfs_fs_info *fs_info,
715 struct preftrees *preftrees, bool lock)
716 {
717 struct prelim_ref *ref;
718 struct extent_buffer *eb;
719 struct preftree *tree = &preftrees->indirect_missing_keys;
720 struct rb_node *node;
721
722 while ((node = rb_first_cached(&tree->root))) {
723 ref = rb_entry(node, struct prelim_ref, rbnode);
724 rb_erase_cached(node, &tree->root);
725
726 BUG_ON(ref->parent);
727 BUG_ON(ref->key_for_search.type);
728 BUG_ON(!ref->wanted_disk_byte);
729
730 eb = read_tree_block(fs_info, ref->wanted_disk_byte, 0,
731 ref->level - 1, NULL);
732 if (IS_ERR(eb)) {
733 free_pref(ref);
734 return PTR_ERR(eb);
735 } else if (!extent_buffer_uptodate(eb)) {
736 free_pref(ref);
737 free_extent_buffer(eb);
738 return -EIO;
739 }
740 if (lock)
741 btrfs_tree_read_lock(eb);
742 if (btrfs_header_level(eb) == 0)
743 btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
744 else
745 btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
746 if (lock)
747 btrfs_tree_read_unlock(eb);
748 free_extent_buffer(eb);
749 prelim_ref_insert(fs_info, &preftrees->indirect, ref, NULL);
750 cond_resched();
751 }
752 return 0;
753 }
754
755
756
757
758
759 static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
760 struct btrfs_delayed_ref_head *head, u64 seq,
761 struct preftrees *preftrees, u64 *total_refs,
762 struct share_check *sc)
763 {
764 struct btrfs_delayed_ref_node *node;
765 struct btrfs_delayed_extent_op *extent_op = head->extent_op;
766 struct btrfs_key key;
767 struct btrfs_key tmp_op_key;
768 struct rb_node *n;
769 int count;
770 int ret = 0;
771
772 if (extent_op && extent_op->update_key)
773 btrfs_disk_key_to_cpu(&tmp_op_key, &extent_op->key);
774
775 spin_lock(&head->lock);
776 for (n = rb_first_cached(&head->ref_tree); n; n = rb_next(n)) {
777 node = rb_entry(n, struct btrfs_delayed_ref_node,
778 ref_node);
779 if (node->seq > seq)
780 continue;
781
782 switch (node->action) {
783 case BTRFS_ADD_DELAYED_EXTENT:
784 case BTRFS_UPDATE_DELAYED_HEAD:
785 WARN_ON(1);
786 continue;
787 case BTRFS_ADD_DELAYED_REF:
788 count = node->ref_mod;
789 break;
790 case BTRFS_DROP_DELAYED_REF:
791 count = node->ref_mod * -1;
792 break;
793 default:
794 BUG();
795 }
796 *total_refs += count;
797 switch (node->type) {
798 case BTRFS_TREE_BLOCK_REF_KEY: {
799
800 struct btrfs_delayed_tree_ref *ref;
801
802 ref = btrfs_delayed_node_to_tree_ref(node);
803 ret = add_indirect_ref(fs_info, preftrees, ref->root,
804 &tmp_op_key, ref->level + 1,
805 node->bytenr, count, sc,
806 GFP_ATOMIC);
807 break;
808 }
809 case BTRFS_SHARED_BLOCK_REF_KEY: {
810
811 struct btrfs_delayed_tree_ref *ref;
812
813 ref = btrfs_delayed_node_to_tree_ref(node);
814
815 ret = add_direct_ref(fs_info, preftrees, ref->level + 1,
816 ref->parent, node->bytenr, count,
817 sc, GFP_ATOMIC);
818 break;
819 }
820 case BTRFS_EXTENT_DATA_REF_KEY: {
821
822 struct btrfs_delayed_data_ref *ref;
823 ref = btrfs_delayed_node_to_data_ref(node);
824
825 key.objectid = ref->objectid;
826 key.type = BTRFS_EXTENT_DATA_KEY;
827 key.offset = ref->offset;
828
829
830
831
832
833 if (sc && sc->inum && ref->objectid != sc->inum) {
834 ret = BACKREF_FOUND_SHARED;
835 goto out;
836 }
837
838 ret = add_indirect_ref(fs_info, preftrees, ref->root,
839 &key, 0, node->bytenr, count, sc,
840 GFP_ATOMIC);
841 break;
842 }
843 case BTRFS_SHARED_DATA_REF_KEY: {
844
845 struct btrfs_delayed_data_ref *ref;
846
847 ref = btrfs_delayed_node_to_data_ref(node);
848
849 ret = add_direct_ref(fs_info, preftrees, 0, ref->parent,
850 node->bytenr, count, sc,
851 GFP_ATOMIC);
852 break;
853 }
854 default:
855 WARN_ON(1);
856 }
857
858
859
860
861 if (ret && (ret != BACKREF_FOUND_SHARED))
862 break;
863 }
864 if (!ret)
865 ret = extent_is_shared(sc);
866 out:
867 spin_unlock(&head->lock);
868 return ret;
869 }
870
871
872
873
874
875
876 static int add_inline_refs(const struct btrfs_fs_info *fs_info,
877 struct btrfs_path *path, u64 bytenr,
878 int *info_level, struct preftrees *preftrees,
879 u64 *total_refs, struct share_check *sc)
880 {
881 int ret = 0;
882 int slot;
883 struct extent_buffer *leaf;
884 struct btrfs_key key;
885 struct btrfs_key found_key;
886 unsigned long ptr;
887 unsigned long end;
888 struct btrfs_extent_item *ei;
889 u64 flags;
890 u64 item_size;
891
892
893
894
895 leaf = path->nodes[0];
896 slot = path->slots[0];
897
898 item_size = btrfs_item_size_nr(leaf, slot);
899 BUG_ON(item_size < sizeof(*ei));
900
901 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
902 flags = btrfs_extent_flags(leaf, ei);
903 *total_refs += btrfs_extent_refs(leaf, ei);
904 btrfs_item_key_to_cpu(leaf, &found_key, slot);
905
906 ptr = (unsigned long)(ei + 1);
907 end = (unsigned long)ei + item_size;
908
909 if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
910 flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
911 struct btrfs_tree_block_info *info;
912
913 info = (struct btrfs_tree_block_info *)ptr;
914 *info_level = btrfs_tree_block_level(leaf, info);
915 ptr += sizeof(struct btrfs_tree_block_info);
916 BUG_ON(ptr > end);
917 } else if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
918 *info_level = found_key.offset;
919 } else {
920 BUG_ON(!(flags & BTRFS_EXTENT_FLAG_DATA));
921 }
922
923 while (ptr < end) {
924 struct btrfs_extent_inline_ref *iref;
925 u64 offset;
926 int type;
927
928 iref = (struct btrfs_extent_inline_ref *)ptr;
929 type = btrfs_get_extent_inline_ref_type(leaf, iref,
930 BTRFS_REF_TYPE_ANY);
931 if (type == BTRFS_REF_TYPE_INVALID)
932 return -EUCLEAN;
933
934 offset = btrfs_extent_inline_ref_offset(leaf, iref);
935
936 switch (type) {
937 case BTRFS_SHARED_BLOCK_REF_KEY:
938 ret = add_direct_ref(fs_info, preftrees,
939 *info_level + 1, offset,
940 bytenr, 1, NULL, GFP_NOFS);
941 break;
942 case BTRFS_SHARED_DATA_REF_KEY: {
943 struct btrfs_shared_data_ref *sdref;
944 int count;
945
946 sdref = (struct btrfs_shared_data_ref *)(iref + 1);
947 count = btrfs_shared_data_ref_count(leaf, sdref);
948
949 ret = add_direct_ref(fs_info, preftrees, 0, offset,
950 bytenr, count, sc, GFP_NOFS);
951 break;
952 }
953 case BTRFS_TREE_BLOCK_REF_KEY:
954 ret = add_indirect_ref(fs_info, preftrees, offset,
955 NULL, *info_level + 1,
956 bytenr, 1, NULL, GFP_NOFS);
957 break;
958 case BTRFS_EXTENT_DATA_REF_KEY: {
959 struct btrfs_extent_data_ref *dref;
960 int count;
961 u64 root;
962
963 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
964 count = btrfs_extent_data_ref_count(leaf, dref);
965 key.objectid = btrfs_extent_data_ref_objectid(leaf,
966 dref);
967 key.type = BTRFS_EXTENT_DATA_KEY;
968 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
969
970 if (sc && sc->inum && key.objectid != sc->inum) {
971 ret = BACKREF_FOUND_SHARED;
972 break;
973 }
974
975 root = btrfs_extent_data_ref_root(leaf, dref);
976
977 ret = add_indirect_ref(fs_info, preftrees, root,
978 &key, 0, bytenr, count,
979 sc, GFP_NOFS);
980 break;
981 }
982 default:
983 WARN_ON(1);
984 }
985 if (ret)
986 return ret;
987 ptr += btrfs_extent_inline_ref_size(type);
988 }
989
990 return 0;
991 }
992
993
994
995
996
997
998 static int add_keyed_refs(struct btrfs_fs_info *fs_info,
999 struct btrfs_path *path, u64 bytenr,
1000 int info_level, struct preftrees *preftrees,
1001 struct share_check *sc)
1002 {
1003 struct btrfs_root *extent_root = fs_info->extent_root;
1004 int ret;
1005 int slot;
1006 struct extent_buffer *leaf;
1007 struct btrfs_key key;
1008
1009 while (1) {
1010 ret = btrfs_next_item(extent_root, path);
1011 if (ret < 0)
1012 break;
1013 if (ret) {
1014 ret = 0;
1015 break;
1016 }
1017
1018 slot = path->slots[0];
1019 leaf = path->nodes[0];
1020 btrfs_item_key_to_cpu(leaf, &key, slot);
1021
1022 if (key.objectid != bytenr)
1023 break;
1024 if (key.type < BTRFS_TREE_BLOCK_REF_KEY)
1025 continue;
1026 if (key.type > BTRFS_SHARED_DATA_REF_KEY)
1027 break;
1028
1029 switch (key.type) {
1030 case BTRFS_SHARED_BLOCK_REF_KEY:
1031
1032 ret = add_direct_ref(fs_info, preftrees,
1033 info_level + 1, key.offset,
1034 bytenr, 1, NULL, GFP_NOFS);
1035 break;
1036 case BTRFS_SHARED_DATA_REF_KEY: {
1037
1038 struct btrfs_shared_data_ref *sdref;
1039 int count;
1040
1041 sdref = btrfs_item_ptr(leaf, slot,
1042 struct btrfs_shared_data_ref);
1043 count = btrfs_shared_data_ref_count(leaf, sdref);
1044 ret = add_direct_ref(fs_info, preftrees, 0,
1045 key.offset, bytenr, count,
1046 sc, GFP_NOFS);
1047 break;
1048 }
1049 case BTRFS_TREE_BLOCK_REF_KEY:
1050
1051 ret = add_indirect_ref(fs_info, preftrees, key.offset,
1052 NULL, info_level + 1, bytenr,
1053 1, NULL, GFP_NOFS);
1054 break;
1055 case BTRFS_EXTENT_DATA_REF_KEY: {
1056
1057 struct btrfs_extent_data_ref *dref;
1058 int count;
1059 u64 root;
1060
1061 dref = btrfs_item_ptr(leaf, slot,
1062 struct btrfs_extent_data_ref);
1063 count = btrfs_extent_data_ref_count(leaf, dref);
1064 key.objectid = btrfs_extent_data_ref_objectid(leaf,
1065 dref);
1066 key.type = BTRFS_EXTENT_DATA_KEY;
1067 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
1068
1069 if (sc && sc->inum && key.objectid != sc->inum) {
1070 ret = BACKREF_FOUND_SHARED;
1071 break;
1072 }
1073
1074 root = btrfs_extent_data_ref_root(leaf, dref);
1075 ret = add_indirect_ref(fs_info, preftrees, root,
1076 &key, 0, bytenr, count,
1077 sc, GFP_NOFS);
1078 break;
1079 }
1080 default:
1081 WARN_ON(1);
1082 }
1083 if (ret)
1084 return ret;
1085
1086 }
1087
1088 return ret;
1089 }
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113 static int find_parent_nodes(struct btrfs_trans_handle *trans,
1114 struct btrfs_fs_info *fs_info, u64 bytenr,
1115 u64 time_seq, struct ulist *refs,
1116 struct ulist *roots, const u64 *extent_item_pos,
1117 struct share_check *sc, bool ignore_offset)
1118 {
1119 struct btrfs_key key;
1120 struct btrfs_path *path;
1121 struct btrfs_delayed_ref_root *delayed_refs = NULL;
1122 struct btrfs_delayed_ref_head *head;
1123 int info_level = 0;
1124 int ret;
1125 struct prelim_ref *ref;
1126 struct rb_node *node;
1127 struct extent_inode_elem *eie = NULL;
1128
1129 u64 total_refs = 0;
1130 struct preftrees preftrees = {
1131 .direct = PREFTREE_INIT,
1132 .indirect = PREFTREE_INIT,
1133 .indirect_missing_keys = PREFTREE_INIT
1134 };
1135
1136 key.objectid = bytenr;
1137 key.offset = (u64)-1;
1138 if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1139 key.type = BTRFS_METADATA_ITEM_KEY;
1140 else
1141 key.type = BTRFS_EXTENT_ITEM_KEY;
1142
1143 path = btrfs_alloc_path();
1144 if (!path)
1145 return -ENOMEM;
1146 if (!trans) {
1147 path->search_commit_root = 1;
1148 path->skip_locking = 1;
1149 }
1150
1151 if (time_seq == SEQ_LAST)
1152 path->skip_locking = 1;
1153
1154
1155
1156
1157
1158
1159 again:
1160 head = NULL;
1161
1162 ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
1163 if (ret < 0)
1164 goto out;
1165 BUG_ON(ret == 0);
1166
1167 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
1168 if (trans && likely(trans->type != __TRANS_DUMMY) &&
1169 time_seq != SEQ_LAST) {
1170 #else
1171 if (trans && time_seq != SEQ_LAST) {
1172 #endif
1173
1174
1175
1176
1177 delayed_refs = &trans->transaction->delayed_refs;
1178 spin_lock(&delayed_refs->lock);
1179 head = btrfs_find_delayed_ref_head(delayed_refs, bytenr);
1180 if (head) {
1181 if (!mutex_trylock(&head->mutex)) {
1182 refcount_inc(&head->refs);
1183 spin_unlock(&delayed_refs->lock);
1184
1185 btrfs_release_path(path);
1186
1187
1188
1189
1190
1191 mutex_lock(&head->mutex);
1192 mutex_unlock(&head->mutex);
1193 btrfs_put_delayed_ref_head(head);
1194 goto again;
1195 }
1196 spin_unlock(&delayed_refs->lock);
1197 ret = add_delayed_refs(fs_info, head, time_seq,
1198 &preftrees, &total_refs, sc);
1199 mutex_unlock(&head->mutex);
1200 if (ret)
1201 goto out;
1202 } else {
1203 spin_unlock(&delayed_refs->lock);
1204 }
1205 }
1206
1207 if (path->slots[0]) {
1208 struct extent_buffer *leaf;
1209 int slot;
1210
1211 path->slots[0]--;
1212 leaf = path->nodes[0];
1213 slot = path->slots[0];
1214 btrfs_item_key_to_cpu(leaf, &key, slot);
1215 if (key.objectid == bytenr &&
1216 (key.type == BTRFS_EXTENT_ITEM_KEY ||
1217 key.type == BTRFS_METADATA_ITEM_KEY)) {
1218 ret = add_inline_refs(fs_info, path, bytenr,
1219 &info_level, &preftrees,
1220 &total_refs, sc);
1221 if (ret)
1222 goto out;
1223 ret = add_keyed_refs(fs_info, path, bytenr, info_level,
1224 &preftrees, sc);
1225 if (ret)
1226 goto out;
1227 }
1228 }
1229
1230 btrfs_release_path(path);
1231
1232 ret = add_missing_keys(fs_info, &preftrees, path->skip_locking == 0);
1233 if (ret)
1234 goto out;
1235
1236 WARN_ON(!RB_EMPTY_ROOT(&preftrees.indirect_missing_keys.root.rb_root));
1237
1238 ret = resolve_indirect_refs(fs_info, path, time_seq, &preftrees,
1239 extent_item_pos, total_refs, sc, ignore_offset);
1240 if (ret)
1241 goto out;
1242
1243 WARN_ON(!RB_EMPTY_ROOT(&preftrees.indirect.root.rb_root));
1244
1245
1246
1247
1248
1249
1250
1251
1252 node = rb_first_cached(&preftrees.direct.root);
1253 while (node) {
1254 ref = rb_entry(node, struct prelim_ref, rbnode);
1255 node = rb_next(&ref->rbnode);
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266 if (roots && ref->count && ref->root_id && ref->parent == 0) {
1267 if (sc && sc->root_objectid &&
1268 ref->root_id != sc->root_objectid) {
1269 ret = BACKREF_FOUND_SHARED;
1270 goto out;
1271 }
1272
1273
1274 ret = ulist_add(roots, ref->root_id, 0, GFP_NOFS);
1275 if (ret < 0)
1276 goto out;
1277 }
1278 if (ref->count && ref->parent) {
1279 if (extent_item_pos && !ref->inode_list &&
1280 ref->level == 0) {
1281 struct extent_buffer *eb;
1282
1283 eb = read_tree_block(fs_info, ref->parent, 0,
1284 ref->level, NULL);
1285 if (IS_ERR(eb)) {
1286 ret = PTR_ERR(eb);
1287 goto out;
1288 } else if (!extent_buffer_uptodate(eb)) {
1289 free_extent_buffer(eb);
1290 ret = -EIO;
1291 goto out;
1292 }
1293
1294 if (!path->skip_locking) {
1295 btrfs_tree_read_lock(eb);
1296 btrfs_set_lock_blocking_read(eb);
1297 }
1298 ret = find_extent_in_eb(eb, bytenr,
1299 *extent_item_pos, &eie, ignore_offset);
1300 if (!path->skip_locking)
1301 btrfs_tree_read_unlock_blocking(eb);
1302 free_extent_buffer(eb);
1303 if (ret < 0)
1304 goto out;
1305 ref->inode_list = eie;
1306 }
1307 ret = ulist_add_merge_ptr(refs, ref->parent,
1308 ref->inode_list,
1309 (void **)&eie, GFP_NOFS);
1310 if (ret < 0)
1311 goto out;
1312 if (!ret && extent_item_pos) {
1313
1314
1315
1316
1317 BUG_ON(!eie);
1318 while (eie->next)
1319 eie = eie->next;
1320 eie->next = ref->inode_list;
1321 }
1322 eie = NULL;
1323 }
1324 cond_resched();
1325 }
1326
1327 out:
1328 btrfs_free_path(path);
1329
1330 prelim_release(&preftrees.direct);
1331 prelim_release(&preftrees.indirect);
1332 prelim_release(&preftrees.indirect_missing_keys);
1333
1334 if (ret < 0)
1335 free_inode_elem_list(eie);
1336 return ret;
1337 }
1338
1339 static void free_leaf_list(struct ulist *blocks)
1340 {
1341 struct ulist_node *node = NULL;
1342 struct extent_inode_elem *eie;
1343 struct ulist_iterator uiter;
1344
1345 ULIST_ITER_INIT(&uiter);
1346 while ((node = ulist_next(blocks, &uiter))) {
1347 if (!node->aux)
1348 continue;
1349 eie = unode_aux_to_inode_list(node);
1350 free_inode_elem_list(eie);
1351 node->aux = 0;
1352 }
1353
1354 ulist_free(blocks);
1355 }
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365 static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
1366 struct btrfs_fs_info *fs_info, u64 bytenr,
1367 u64 time_seq, struct ulist **leafs,
1368 const u64 *extent_item_pos, bool ignore_offset)
1369 {
1370 int ret;
1371
1372 *leafs = ulist_alloc(GFP_NOFS);
1373 if (!*leafs)
1374 return -ENOMEM;
1375
1376 ret = find_parent_nodes(trans, fs_info, bytenr, time_seq,
1377 *leafs, NULL, extent_item_pos, NULL, ignore_offset);
1378 if (ret < 0 && ret != -ENOENT) {
1379 free_leaf_list(*leafs);
1380 return ret;
1381 }
1382
1383 return 0;
1384 }
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399 static int btrfs_find_all_roots_safe(struct btrfs_trans_handle *trans,
1400 struct btrfs_fs_info *fs_info, u64 bytenr,
1401 u64 time_seq, struct ulist **roots,
1402 bool ignore_offset)
1403 {
1404 struct ulist *tmp;
1405 struct ulist_node *node = NULL;
1406 struct ulist_iterator uiter;
1407 int ret;
1408
1409 tmp = ulist_alloc(GFP_NOFS);
1410 if (!tmp)
1411 return -ENOMEM;
1412 *roots = ulist_alloc(GFP_NOFS);
1413 if (!*roots) {
1414 ulist_free(tmp);
1415 return -ENOMEM;
1416 }
1417
1418 ULIST_ITER_INIT(&uiter);
1419 while (1) {
1420 ret = find_parent_nodes(trans, fs_info, bytenr, time_seq,
1421 tmp, *roots, NULL, NULL, ignore_offset);
1422 if (ret < 0 && ret != -ENOENT) {
1423 ulist_free(tmp);
1424 ulist_free(*roots);
1425 return ret;
1426 }
1427 node = ulist_next(tmp, &uiter);
1428 if (!node)
1429 break;
1430 bytenr = node->val;
1431 cond_resched();
1432 }
1433
1434 ulist_free(tmp);
1435 return 0;
1436 }
1437
1438 int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
1439 struct btrfs_fs_info *fs_info, u64 bytenr,
1440 u64 time_seq, struct ulist **roots,
1441 bool ignore_offset)
1442 {
1443 int ret;
1444
1445 if (!trans)
1446 down_read(&fs_info->commit_root_sem);
1447 ret = btrfs_find_all_roots_safe(trans, fs_info, bytenr,
1448 time_seq, roots, ignore_offset);
1449 if (!trans)
1450 up_read(&fs_info->commit_root_sem);
1451 return ret;
1452 }
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468 int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr,
1469 struct ulist *roots, struct ulist *tmp)
1470 {
1471 struct btrfs_fs_info *fs_info = root->fs_info;
1472 struct btrfs_trans_handle *trans;
1473 struct ulist_iterator uiter;
1474 struct ulist_node *node;
1475 struct seq_list elem = SEQ_LIST_INIT(elem);
1476 int ret = 0;
1477 struct share_check shared = {
1478 .root_objectid = root->root_key.objectid,
1479 .inum = inum,
1480 .share_count = 0,
1481 };
1482
1483 ulist_init(roots);
1484 ulist_init(tmp);
1485
1486 trans = btrfs_join_transaction_nostart(root);
1487 if (IS_ERR(trans)) {
1488 if (PTR_ERR(trans) != -ENOENT && PTR_ERR(trans) != -EROFS) {
1489 ret = PTR_ERR(trans);
1490 goto out;
1491 }
1492 trans = NULL;
1493 down_read(&fs_info->commit_root_sem);
1494 } else {
1495 btrfs_get_tree_mod_seq(fs_info, &elem);
1496 }
1497
1498 ULIST_ITER_INIT(&uiter);
1499 while (1) {
1500 ret = find_parent_nodes(trans, fs_info, bytenr, elem.seq, tmp,
1501 roots, NULL, &shared, false);
1502 if (ret == BACKREF_FOUND_SHARED) {
1503
1504 ret = 1;
1505 break;
1506 }
1507 if (ret < 0 && ret != -ENOENT)
1508 break;
1509 ret = 0;
1510 node = ulist_next(tmp, &uiter);
1511 if (!node)
1512 break;
1513 bytenr = node->val;
1514 shared.share_count = 0;
1515 cond_resched();
1516 }
1517
1518 if (trans) {
1519 btrfs_put_tree_mod_seq(fs_info, &elem);
1520 btrfs_end_transaction(trans);
1521 } else {
1522 up_read(&fs_info->commit_root_sem);
1523 }
1524 out:
1525 ulist_release(roots);
1526 ulist_release(tmp);
1527 return ret;
1528 }
1529
1530 int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
1531 u64 start_off, struct btrfs_path *path,
1532 struct btrfs_inode_extref **ret_extref,
1533 u64 *found_off)
1534 {
1535 int ret, slot;
1536 struct btrfs_key key;
1537 struct btrfs_key found_key;
1538 struct btrfs_inode_extref *extref;
1539 const struct extent_buffer *leaf;
1540 unsigned long ptr;
1541
1542 key.objectid = inode_objectid;
1543 key.type = BTRFS_INODE_EXTREF_KEY;
1544 key.offset = start_off;
1545
1546 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1547 if (ret < 0)
1548 return ret;
1549
1550 while (1) {
1551 leaf = path->nodes[0];
1552 slot = path->slots[0];
1553 if (slot >= btrfs_header_nritems(leaf)) {
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563 ret = btrfs_next_leaf(root, path);
1564 if (ret) {
1565 if (ret >= 1)
1566 ret = -ENOENT;
1567 break;
1568 }
1569 continue;
1570 }
1571
1572 btrfs_item_key_to_cpu(leaf, &found_key, slot);
1573
1574
1575
1576
1577
1578
1579
1580 ret = -ENOENT;
1581 if (found_key.objectid != inode_objectid)
1582 break;
1583 if (found_key.type != BTRFS_INODE_EXTREF_KEY)
1584 break;
1585
1586 ret = 0;
1587 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1588 extref = (struct btrfs_inode_extref *)ptr;
1589 *ret_extref = extref;
1590 if (found_off)
1591 *found_off = found_key.offset;
1592 break;
1593 }
1594
1595 return ret;
1596 }
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612 char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
1613 u32 name_len, unsigned long name_off,
1614 struct extent_buffer *eb_in, u64 parent,
1615 char *dest, u32 size)
1616 {
1617 int slot;
1618 u64 next_inum;
1619 int ret;
1620 s64 bytes_left = ((s64)size) - 1;
1621 struct extent_buffer *eb = eb_in;
1622 struct btrfs_key found_key;
1623 int leave_spinning = path->leave_spinning;
1624 struct btrfs_inode_ref *iref;
1625
1626 if (bytes_left >= 0)
1627 dest[bytes_left] = '\0';
1628
1629 path->leave_spinning = 1;
1630 while (1) {
1631 bytes_left -= name_len;
1632 if (bytes_left >= 0)
1633 read_extent_buffer(eb, dest + bytes_left,
1634 name_off, name_len);
1635 if (eb != eb_in) {
1636 if (!path->skip_locking)
1637 btrfs_tree_read_unlock_blocking(eb);
1638 free_extent_buffer(eb);
1639 }
1640 ret = btrfs_find_item(fs_root, path, parent, 0,
1641 BTRFS_INODE_REF_KEY, &found_key);
1642 if (ret > 0)
1643 ret = -ENOENT;
1644 if (ret)
1645 break;
1646
1647 next_inum = found_key.offset;
1648
1649
1650 if (parent == next_inum)
1651 break;
1652
1653 slot = path->slots[0];
1654 eb = path->nodes[0];
1655
1656 if (eb != eb_in) {
1657 if (!path->skip_locking)
1658 btrfs_set_lock_blocking_read(eb);
1659 path->nodes[0] = NULL;
1660 path->locks[0] = 0;
1661 }
1662 btrfs_release_path(path);
1663 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1664
1665 name_len = btrfs_inode_ref_name_len(eb, iref);
1666 name_off = (unsigned long)(iref + 1);
1667
1668 parent = next_inum;
1669 --bytes_left;
1670 if (bytes_left >= 0)
1671 dest[bytes_left] = '/';
1672 }
1673
1674 btrfs_release_path(path);
1675 path->leave_spinning = leave_spinning;
1676
1677 if (ret)
1678 return ERR_PTR(ret);
1679
1680 return dest + bytes_left;
1681 }
1682
1683
1684
1685
1686
1687
1688 int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1689 struct btrfs_path *path, struct btrfs_key *found_key,
1690 u64 *flags_ret)
1691 {
1692 int ret;
1693 u64 flags;
1694 u64 size = 0;
1695 u32 item_size;
1696 const struct extent_buffer *eb;
1697 struct btrfs_extent_item *ei;
1698 struct btrfs_key key;
1699
1700 if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1701 key.type = BTRFS_METADATA_ITEM_KEY;
1702 else
1703 key.type = BTRFS_EXTENT_ITEM_KEY;
1704 key.objectid = logical;
1705 key.offset = (u64)-1;
1706
1707 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
1708 if (ret < 0)
1709 return ret;
1710
1711 ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
1712 if (ret) {
1713 if (ret > 0)
1714 ret = -ENOENT;
1715 return ret;
1716 }
1717 btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1718 if (found_key->type == BTRFS_METADATA_ITEM_KEY)
1719 size = fs_info->nodesize;
1720 else if (found_key->type == BTRFS_EXTENT_ITEM_KEY)
1721 size = found_key->offset;
1722
1723 if (found_key->objectid > logical ||
1724 found_key->objectid + size <= logical) {
1725 btrfs_debug(fs_info,
1726 "logical %llu is not within any extent", logical);
1727 return -ENOENT;
1728 }
1729
1730 eb = path->nodes[0];
1731 item_size = btrfs_item_size_nr(eb, path->slots[0]);
1732 BUG_ON(item_size < sizeof(*ei));
1733
1734 ei = btrfs_item_ptr(eb, path->slots[0], struct btrfs_extent_item);
1735 flags = btrfs_extent_flags(eb, ei);
1736
1737 btrfs_debug(fs_info,
1738 "logical %llu is at position %llu within the extent (%llu EXTENT_ITEM %llu) flags %#llx size %u",
1739 logical, logical - found_key->objectid, found_key->objectid,
1740 found_key->offset, flags, item_size);
1741
1742 WARN_ON(!flags_ret);
1743 if (flags_ret) {
1744 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1745 *flags_ret = BTRFS_EXTENT_FLAG_TREE_BLOCK;
1746 else if (flags & BTRFS_EXTENT_FLAG_DATA)
1747 *flags_ret = BTRFS_EXTENT_FLAG_DATA;
1748 else
1749 BUG();
1750 return 0;
1751 }
1752
1753 return -EIO;
1754 }
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764 static int get_extent_inline_ref(unsigned long *ptr,
1765 const struct extent_buffer *eb,
1766 const struct btrfs_key *key,
1767 const struct btrfs_extent_item *ei,
1768 u32 item_size,
1769 struct btrfs_extent_inline_ref **out_eiref,
1770 int *out_type)
1771 {
1772 unsigned long end;
1773 u64 flags;
1774 struct btrfs_tree_block_info *info;
1775
1776 if (!*ptr) {
1777
1778 flags = btrfs_extent_flags(eb, ei);
1779 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
1780 if (key->type == BTRFS_METADATA_ITEM_KEY) {
1781
1782 *out_eiref =
1783 (struct btrfs_extent_inline_ref *)(ei + 1);
1784 } else {
1785 WARN_ON(key->type != BTRFS_EXTENT_ITEM_KEY);
1786 info = (struct btrfs_tree_block_info *)(ei + 1);
1787 *out_eiref =
1788 (struct btrfs_extent_inline_ref *)(info + 1);
1789 }
1790 } else {
1791 *out_eiref = (struct btrfs_extent_inline_ref *)(ei + 1);
1792 }
1793 *ptr = (unsigned long)*out_eiref;
1794 if ((unsigned long)(*ptr) >= (unsigned long)ei + item_size)
1795 return -ENOENT;
1796 }
1797
1798 end = (unsigned long)ei + item_size;
1799 *out_eiref = (struct btrfs_extent_inline_ref *)(*ptr);
1800 *out_type = btrfs_get_extent_inline_ref_type(eb, *out_eiref,
1801 BTRFS_REF_TYPE_ANY);
1802 if (*out_type == BTRFS_REF_TYPE_INVALID)
1803 return -EUCLEAN;
1804
1805 *ptr += btrfs_extent_inline_ref_size(*out_type);
1806 WARN_ON(*ptr > end);
1807 if (*ptr == end)
1808 return 1;
1809
1810 return 0;
1811 }
1812
1813
1814
1815
1816
1817
1818
1819
1820 int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
1821 struct btrfs_key *key, struct btrfs_extent_item *ei,
1822 u32 item_size, u64 *out_root, u8 *out_level)
1823 {
1824 int ret;
1825 int type;
1826 struct btrfs_extent_inline_ref *eiref;
1827
1828 if (*ptr == (unsigned long)-1)
1829 return 1;
1830
1831 while (1) {
1832 ret = get_extent_inline_ref(ptr, eb, key, ei, item_size,
1833 &eiref, &type);
1834 if (ret < 0)
1835 return ret;
1836
1837 if (type == BTRFS_TREE_BLOCK_REF_KEY ||
1838 type == BTRFS_SHARED_BLOCK_REF_KEY)
1839 break;
1840
1841 if (ret == 1)
1842 return 1;
1843 }
1844
1845
1846 *out_root = btrfs_extent_inline_ref_offset(eb, eiref);
1847
1848 if (key->type == BTRFS_EXTENT_ITEM_KEY) {
1849 struct btrfs_tree_block_info *info;
1850
1851 info = (struct btrfs_tree_block_info *)(ei + 1);
1852 *out_level = btrfs_tree_block_level(eb, info);
1853 } else {
1854 ASSERT(key->type == BTRFS_METADATA_ITEM_KEY);
1855 *out_level = (u8)key->offset;
1856 }
1857
1858 if (ret == 1)
1859 *ptr = (unsigned long)-1;
1860
1861 return 0;
1862 }
1863
1864 static int iterate_leaf_refs(struct btrfs_fs_info *fs_info,
1865 struct extent_inode_elem *inode_list,
1866 u64 root, u64 extent_item_objectid,
1867 iterate_extent_inodes_t *iterate, void *ctx)
1868 {
1869 struct extent_inode_elem *eie;
1870 int ret = 0;
1871
1872 for (eie = inode_list; eie; eie = eie->next) {
1873 btrfs_debug(fs_info,
1874 "ref for %llu resolved, key (%llu EXTEND_DATA %llu), root %llu",
1875 extent_item_objectid, eie->inum,
1876 eie->offset, root);
1877 ret = iterate(eie->inum, eie->offset, root, ctx);
1878 if (ret) {
1879 btrfs_debug(fs_info,
1880 "stopping iteration for %llu due to ret=%d",
1881 extent_item_objectid, ret);
1882 break;
1883 }
1884 }
1885
1886 return ret;
1887 }
1888
1889
1890
1891
1892
1893
1894 int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
1895 u64 extent_item_objectid, u64 extent_item_pos,
1896 int search_commit_root,
1897 iterate_extent_inodes_t *iterate, void *ctx,
1898 bool ignore_offset)
1899 {
1900 int ret;
1901 struct btrfs_trans_handle *trans = NULL;
1902 struct ulist *refs = NULL;
1903 struct ulist *roots = NULL;
1904 struct ulist_node *ref_node = NULL;
1905 struct ulist_node *root_node = NULL;
1906 struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem);
1907 struct ulist_iterator ref_uiter;
1908 struct ulist_iterator root_uiter;
1909
1910 btrfs_debug(fs_info, "resolving all inodes for extent %llu",
1911 extent_item_objectid);
1912
1913 if (!search_commit_root) {
1914 trans = btrfs_attach_transaction(fs_info->extent_root);
1915 if (IS_ERR(trans)) {
1916 if (PTR_ERR(trans) != -ENOENT &&
1917 PTR_ERR(trans) != -EROFS)
1918 return PTR_ERR(trans);
1919 trans = NULL;
1920 }
1921 }
1922
1923 if (trans)
1924 btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1925 else
1926 down_read(&fs_info->commit_root_sem);
1927
1928 ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
1929 tree_mod_seq_elem.seq, &refs,
1930 &extent_item_pos, ignore_offset);
1931 if (ret)
1932 goto out;
1933
1934 ULIST_ITER_INIT(&ref_uiter);
1935 while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
1936 ret = btrfs_find_all_roots_safe(trans, fs_info, ref_node->val,
1937 tree_mod_seq_elem.seq, &roots,
1938 ignore_offset);
1939 if (ret)
1940 break;
1941 ULIST_ITER_INIT(&root_uiter);
1942 while (!ret && (root_node = ulist_next(roots, &root_uiter))) {
1943 btrfs_debug(fs_info,
1944 "root %llu references leaf %llu, data list %#llx",
1945 root_node->val, ref_node->val,
1946 ref_node->aux);
1947 ret = iterate_leaf_refs(fs_info,
1948 (struct extent_inode_elem *)
1949 (uintptr_t)ref_node->aux,
1950 root_node->val,
1951 extent_item_objectid,
1952 iterate, ctx);
1953 }
1954 ulist_free(roots);
1955 }
1956
1957 free_leaf_list(refs);
1958 out:
1959 if (trans) {
1960 btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1961 btrfs_end_transaction(trans);
1962 } else {
1963 up_read(&fs_info->commit_root_sem);
1964 }
1965
1966 return ret;
1967 }
1968
1969 int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info,
1970 struct btrfs_path *path,
1971 iterate_extent_inodes_t *iterate, void *ctx,
1972 bool ignore_offset)
1973 {
1974 int ret;
1975 u64 extent_item_pos;
1976 u64 flags = 0;
1977 struct btrfs_key found_key;
1978 int search_commit_root = path->search_commit_root;
1979
1980 ret = extent_from_logical(fs_info, logical, path, &found_key, &flags);
1981 btrfs_release_path(path);
1982 if (ret < 0)
1983 return ret;
1984 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1985 return -EINVAL;
1986
1987 extent_item_pos = logical - found_key.objectid;
1988 ret = iterate_extent_inodes(fs_info, found_key.objectid,
1989 extent_item_pos, search_commit_root,
1990 iterate, ctx, ignore_offset);
1991
1992 return ret;
1993 }
1994
1995 typedef int (iterate_irefs_t)(u64 parent, u32 name_len, unsigned long name_off,
1996 struct extent_buffer *eb, void *ctx);
1997
1998 static int iterate_inode_refs(u64 inum, struct btrfs_root *fs_root,
1999 struct btrfs_path *path,
2000 iterate_irefs_t *iterate, void *ctx)
2001 {
2002 int ret = 0;
2003 int slot;
2004 u32 cur;
2005 u32 len;
2006 u32 name_len;
2007 u64 parent = 0;
2008 int found = 0;
2009 struct extent_buffer *eb;
2010 struct btrfs_item *item;
2011 struct btrfs_inode_ref *iref;
2012 struct btrfs_key found_key;
2013
2014 while (!ret) {
2015 ret = btrfs_find_item(fs_root, path, inum,
2016 parent ? parent + 1 : 0, BTRFS_INODE_REF_KEY,
2017 &found_key);
2018
2019 if (ret < 0)
2020 break;
2021 if (ret) {
2022 ret = found ? 0 : -ENOENT;
2023 break;
2024 }
2025 ++found;
2026
2027 parent = found_key.offset;
2028 slot = path->slots[0];
2029 eb = btrfs_clone_extent_buffer(path->nodes[0]);
2030 if (!eb) {
2031 ret = -ENOMEM;
2032 break;
2033 }
2034 btrfs_release_path(path);
2035
2036 item = btrfs_item_nr(slot);
2037 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
2038
2039 for (cur = 0; cur < btrfs_item_size(eb, item); cur += len) {
2040 name_len = btrfs_inode_ref_name_len(eb, iref);
2041
2042 btrfs_debug(fs_root->fs_info,
2043 "following ref at offset %u for inode %llu in tree %llu",
2044 cur, found_key.objectid,
2045 fs_root->root_key.objectid);
2046 ret = iterate(parent, name_len,
2047 (unsigned long)(iref + 1), eb, ctx);
2048 if (ret)
2049 break;
2050 len = sizeof(*iref) + name_len;
2051 iref = (struct btrfs_inode_ref *)((char *)iref + len);
2052 }
2053 free_extent_buffer(eb);
2054 }
2055
2056 btrfs_release_path(path);
2057
2058 return ret;
2059 }
2060
2061 static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root,
2062 struct btrfs_path *path,
2063 iterate_irefs_t *iterate, void *ctx)
2064 {
2065 int ret;
2066 int slot;
2067 u64 offset = 0;
2068 u64 parent;
2069 int found = 0;
2070 struct extent_buffer *eb;
2071 struct btrfs_inode_extref *extref;
2072 u32 item_size;
2073 u32 cur_offset;
2074 unsigned long ptr;
2075
2076 while (1) {
2077 ret = btrfs_find_one_extref(fs_root, inum, offset, path, &extref,
2078 &offset);
2079 if (ret < 0)
2080 break;
2081 if (ret) {
2082 ret = found ? 0 : -ENOENT;
2083 break;
2084 }
2085 ++found;
2086
2087 slot = path->slots[0];
2088 eb = btrfs_clone_extent_buffer(path->nodes[0]);
2089 if (!eb) {
2090 ret = -ENOMEM;
2091 break;
2092 }
2093 btrfs_release_path(path);
2094
2095 item_size = btrfs_item_size_nr(eb, slot);
2096 ptr = btrfs_item_ptr_offset(eb, slot);
2097 cur_offset = 0;
2098
2099 while (cur_offset < item_size) {
2100 u32 name_len;
2101
2102 extref = (struct btrfs_inode_extref *)(ptr + cur_offset);
2103 parent = btrfs_inode_extref_parent(eb, extref);
2104 name_len = btrfs_inode_extref_name_len(eb, extref);
2105 ret = iterate(parent, name_len,
2106 (unsigned long)&extref->name, eb, ctx);
2107 if (ret)
2108 break;
2109
2110 cur_offset += btrfs_inode_extref_name_len(eb, extref);
2111 cur_offset += sizeof(*extref);
2112 }
2113 free_extent_buffer(eb);
2114
2115 offset++;
2116 }
2117
2118 btrfs_release_path(path);
2119
2120 return ret;
2121 }
2122
2123 static int iterate_irefs(u64 inum, struct btrfs_root *fs_root,
2124 struct btrfs_path *path, iterate_irefs_t *iterate,
2125 void *ctx)
2126 {
2127 int ret;
2128 int found_refs = 0;
2129
2130 ret = iterate_inode_refs(inum, fs_root, path, iterate, ctx);
2131 if (!ret)
2132 ++found_refs;
2133 else if (ret != -ENOENT)
2134 return ret;
2135
2136 ret = iterate_inode_extrefs(inum, fs_root, path, iterate, ctx);
2137 if (ret == -ENOENT && found_refs)
2138 return 0;
2139
2140 return ret;
2141 }
2142
2143
2144
2145
2146
2147 static int inode_to_path(u64 inum, u32 name_len, unsigned long name_off,
2148 struct extent_buffer *eb, void *ctx)
2149 {
2150 struct inode_fs_paths *ipath = ctx;
2151 char *fspath;
2152 char *fspath_min;
2153 int i = ipath->fspath->elem_cnt;
2154 const int s_ptr = sizeof(char *);
2155 u32 bytes_left;
2156
2157 bytes_left = ipath->fspath->bytes_left > s_ptr ?
2158 ipath->fspath->bytes_left - s_ptr : 0;
2159
2160 fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr;
2161 fspath = btrfs_ref_to_path(ipath->fs_root, ipath->btrfs_path, name_len,
2162 name_off, eb, inum, fspath_min, bytes_left);
2163 if (IS_ERR(fspath))
2164 return PTR_ERR(fspath);
2165
2166 if (fspath > fspath_min) {
2167 ipath->fspath->val[i] = (u64)(unsigned long)fspath;
2168 ++ipath->fspath->elem_cnt;
2169 ipath->fspath->bytes_left = fspath - fspath_min;
2170 } else {
2171 ++ipath->fspath->elem_missed;
2172 ipath->fspath->bytes_missing += fspath_min - fspath;
2173 ipath->fspath->bytes_left = 0;
2174 }
2175
2176 return 0;
2177 }
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189 int paths_from_inode(u64 inum, struct inode_fs_paths *ipath)
2190 {
2191 return iterate_irefs(inum, ipath->fs_root, ipath->btrfs_path,
2192 inode_to_path, ipath);
2193 }
2194
2195 struct btrfs_data_container *init_data_container(u32 total_bytes)
2196 {
2197 struct btrfs_data_container *data;
2198 size_t alloc_bytes;
2199
2200 alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
2201 data = kvmalloc(alloc_bytes, GFP_KERNEL);
2202 if (!data)
2203 return ERR_PTR(-ENOMEM);
2204
2205 if (total_bytes >= sizeof(*data)) {
2206 data->bytes_left = total_bytes - sizeof(*data);
2207 data->bytes_missing = 0;
2208 } else {
2209 data->bytes_missing = sizeof(*data) - total_bytes;
2210 data->bytes_left = 0;
2211 }
2212
2213 data->elem_cnt = 0;
2214 data->elem_missed = 0;
2215
2216 return data;
2217 }
2218
2219
2220
2221
2222
2223
2224
2225 struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
2226 struct btrfs_path *path)
2227 {
2228 struct inode_fs_paths *ifp;
2229 struct btrfs_data_container *fspath;
2230
2231 fspath = init_data_container(total_bytes);
2232 if (IS_ERR(fspath))
2233 return ERR_CAST(fspath);
2234
2235 ifp = kmalloc(sizeof(*ifp), GFP_KERNEL);
2236 if (!ifp) {
2237 kvfree(fspath);
2238 return ERR_PTR(-ENOMEM);
2239 }
2240
2241 ifp->btrfs_path = path;
2242 ifp->fspath = fspath;
2243 ifp->fs_root = fs_root;
2244
2245 return ifp;
2246 }
2247
2248 void free_ipath(struct inode_fs_paths *ipath)
2249 {
2250 if (!ipath)
2251 return;
2252 kvfree(ipath->fspath);
2253 kfree(ipath);
2254 }