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