1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/vmalloc.h>
20#include "ctree.h"
21#include "disk-io.h"
22#include "backref.h"
23#include "ulist.h"
24#include "transaction.h"
25#include "delayed-ref.h"
26#include "locking.h"
27
28struct extent_inode_elem {
29 u64 inum;
30 u64 offset;
31 struct extent_inode_elem *next;
32};
33
34static int check_extent_in_eb(struct btrfs_key *key, struct extent_buffer *eb,
35 struct btrfs_file_extent_item *fi,
36 u64 extent_item_pos,
37 struct extent_inode_elem **eie)
38{
39 u64 data_offset;
40 u64 data_len;
41 struct extent_inode_elem *e;
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
50 e = kmalloc(sizeof(*e), GFP_NOFS);
51 if (!e)
52 return -ENOMEM;
53
54 e->next = *eie;
55 e->inum = key->objectid;
56 e->offset = key->offset + (extent_item_pos - data_offset);
57 *eie = e;
58
59 return 0;
60}
61
62static int find_extent_in_eb(struct extent_buffer *eb, u64 wanted_disk_byte,
63 u64 extent_item_pos,
64 struct extent_inode_elem **eie)
65{
66 u64 disk_byte;
67 struct btrfs_key key;
68 struct btrfs_file_extent_item *fi;
69 int slot;
70 int nritems;
71 int extent_type;
72 int ret;
73
74
75
76
77
78
79 nritems = btrfs_header_nritems(eb);
80 for (slot = 0; slot < nritems; ++slot) {
81 btrfs_item_key_to_cpu(eb, &key, slot);
82 if (key.type != BTRFS_EXTENT_DATA_KEY)
83 continue;
84 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
85 extent_type = btrfs_file_extent_type(eb, fi);
86 if (extent_type == BTRFS_FILE_EXTENT_INLINE)
87 continue;
88
89 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
90 if (disk_byte != wanted_disk_byte)
91 continue;
92
93 ret = check_extent_in_eb(&key, eb, fi, extent_item_pos, eie);
94 if (ret < 0)
95 return ret;
96 }
97
98 return 0;
99}
100
101
102
103
104struct __prelim_ref {
105 struct list_head list;
106 u64 root_id;
107 struct btrfs_key key_for_search;
108 int level;
109 int count;
110 struct extent_inode_elem *inode_list;
111 u64 parent;
112 u64 wanted_disk_byte;
113};
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154static int __add_prelim_ref(struct list_head *head, u64 root_id,
155 struct btrfs_key *key, int level,
156 u64 parent, u64 wanted_disk_byte, int count)
157{
158 struct __prelim_ref *ref;
159
160
161 ref = kmalloc(sizeof(*ref), GFP_ATOMIC);
162 if (!ref)
163 return -ENOMEM;
164
165 ref->root_id = root_id;
166 if (key)
167 ref->key_for_search = *key;
168 else
169 memset(&ref->key_for_search, 0, sizeof(ref->key_for_search));
170
171 ref->inode_list = NULL;
172 ref->level = level;
173 ref->count = count;
174 ref->parent = parent;
175 ref->wanted_disk_byte = wanted_disk_byte;
176 list_add_tail(&ref->list, head);
177
178 return 0;
179}
180
181static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
182 struct ulist *parents, int level,
183 struct btrfs_key *key_for_search, u64 time_seq,
184 u64 wanted_disk_byte,
185 const u64 *extent_item_pos)
186{
187 int ret = 0;
188 int slot;
189 struct extent_buffer *eb;
190 struct btrfs_key key;
191 struct btrfs_file_extent_item *fi;
192 struct extent_inode_elem *eie = NULL;
193 u64 disk_byte;
194
195 if (level != 0) {
196 eb = path->nodes[level];
197 ret = ulist_add(parents, eb->start, 0, GFP_NOFS);
198 if (ret < 0)
199 return ret;
200 return 0;
201 }
202
203
204
205
206
207
208 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0]))
209 ret = btrfs_next_old_leaf(root, path, time_seq);
210
211 while (!ret) {
212 eb = path->nodes[0];
213 slot = path->slots[0];
214
215 btrfs_item_key_to_cpu(eb, &key, slot);
216
217 if (key.objectid != key_for_search->objectid ||
218 key.type != BTRFS_EXTENT_DATA_KEY)
219 break;
220
221 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
222 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
223
224 if (disk_byte == wanted_disk_byte) {
225 eie = NULL;
226 if (extent_item_pos) {
227 ret = check_extent_in_eb(&key, eb, fi,
228 *extent_item_pos,
229 &eie);
230 if (ret < 0)
231 break;
232 }
233 if (!ret) {
234 ret = ulist_add(parents, eb->start,
235 (uintptr_t)eie, GFP_NOFS);
236 if (ret < 0)
237 break;
238 if (!extent_item_pos) {
239 ret = btrfs_next_old_leaf(root, path,
240 time_seq);
241 continue;
242 }
243 }
244 }
245 ret = btrfs_next_old_item(root, path, time_seq);
246 }
247
248 if (ret > 0)
249 ret = 0;
250 return ret;
251}
252
253
254
255
256
257static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
258 int search_commit_root,
259 u64 time_seq,
260 struct __prelim_ref *ref,
261 struct ulist *parents,
262 const u64 *extent_item_pos)
263{
264 struct btrfs_path *path;
265 struct btrfs_root *root;
266 struct btrfs_key root_key;
267 struct extent_buffer *eb;
268 int ret = 0;
269 int root_level;
270 int level = ref->level;
271
272 path = btrfs_alloc_path();
273 if (!path)
274 return -ENOMEM;
275 path->search_commit_root = !!search_commit_root;
276
277 root_key.objectid = ref->root_id;
278 root_key.type = BTRFS_ROOT_ITEM_KEY;
279 root_key.offset = (u64)-1;
280 root = btrfs_read_fs_root_no_name(fs_info, &root_key);
281 if (IS_ERR(root)) {
282 ret = PTR_ERR(root);
283 goto out;
284 }
285
286 root_level = btrfs_old_root_level(root, time_seq);
287
288 if (root_level + 1 == level)
289 goto out;
290
291 path->lowest_level = level;
292 ret = btrfs_search_old_slot(root, &ref->key_for_search, path, time_seq);
293 pr_debug("search slot in root %llu (level %d, ref count %d) returned "
294 "%d for key (%llu %u %llu)\n",
295 (unsigned long long)ref->root_id, level, ref->count, ret,
296 (unsigned long long)ref->key_for_search.objectid,
297 ref->key_for_search.type,
298 (unsigned long long)ref->key_for_search.offset);
299 if (ret < 0)
300 goto out;
301
302 eb = path->nodes[level];
303 while (!eb) {
304 if (!level) {
305 WARN_ON(1);
306 ret = 1;
307 goto out;
308 }
309 level--;
310 eb = path->nodes[level];
311 }
312
313 ret = add_all_parents(root, path, parents, level, &ref->key_for_search,
314 time_seq, ref->wanted_disk_byte,
315 extent_item_pos);
316out:
317 btrfs_free_path(path);
318 return ret;
319}
320
321
322
323
324static int __resolve_indirect_refs(struct btrfs_fs_info *fs_info,
325 int search_commit_root, u64 time_seq,
326 struct list_head *head,
327 const u64 *extent_item_pos)
328{
329 int err;
330 int ret = 0;
331 struct __prelim_ref *ref;
332 struct __prelim_ref *ref_safe;
333 struct __prelim_ref *new_ref;
334 struct ulist *parents;
335 struct ulist_node *node;
336 struct ulist_iterator uiter;
337
338 parents = ulist_alloc(GFP_NOFS);
339 if (!parents)
340 return -ENOMEM;
341
342
343
344
345
346
347 list_for_each_entry_safe(ref, ref_safe, head, list) {
348 if (ref->parent)
349 continue;
350 if (ref->count == 0)
351 continue;
352 err = __resolve_indirect_ref(fs_info, search_commit_root,
353 time_seq, ref, parents,
354 extent_item_pos);
355 if (err)
356 continue;
357
358
359 ULIST_ITER_INIT(&uiter);
360 node = ulist_next(parents, &uiter);
361 ref->parent = node ? node->val : 0;
362 ref->inode_list = node ?
363 (struct extent_inode_elem *)(uintptr_t)node->aux : 0;
364
365
366 while ((node = ulist_next(parents, &uiter))) {
367 new_ref = kmalloc(sizeof(*new_ref), GFP_NOFS);
368 if (!new_ref) {
369 ret = -ENOMEM;
370 break;
371 }
372 memcpy(new_ref, ref, sizeof(*ref));
373 new_ref->parent = node->val;
374 new_ref->inode_list = (struct extent_inode_elem *)
375 (uintptr_t)node->aux;
376 list_add(&new_ref->list, &ref->list);
377 }
378 ulist_reinit(parents);
379 }
380
381 ulist_free(parents);
382 return ret;
383}
384
385static inline int ref_for_same_block(struct __prelim_ref *ref1,
386 struct __prelim_ref *ref2)
387{
388 if (ref1->level != ref2->level)
389 return 0;
390 if (ref1->root_id != ref2->root_id)
391 return 0;
392 if (ref1->key_for_search.type != ref2->key_for_search.type)
393 return 0;
394 if (ref1->key_for_search.objectid != ref2->key_for_search.objectid)
395 return 0;
396 if (ref1->key_for_search.offset != ref2->key_for_search.offset)
397 return 0;
398 if (ref1->parent != ref2->parent)
399 return 0;
400
401 return 1;
402}
403
404
405
406
407static int __add_missing_keys(struct btrfs_fs_info *fs_info,
408 struct list_head *head)
409{
410 struct list_head *pos;
411 struct extent_buffer *eb;
412
413 list_for_each(pos, head) {
414 struct __prelim_ref *ref;
415 ref = list_entry(pos, struct __prelim_ref, list);
416
417 if (ref->parent)
418 continue;
419 if (ref->key_for_search.type)
420 continue;
421 BUG_ON(!ref->wanted_disk_byte);
422 eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte,
423 fs_info->tree_root->leafsize, 0);
424 BUG_ON(!eb);
425 btrfs_tree_read_lock(eb);
426 if (btrfs_header_level(eb) == 0)
427 btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
428 else
429 btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
430 btrfs_tree_read_unlock(eb);
431 free_extent_buffer(eb);
432 }
433 return 0;
434}
435
436
437
438
439
440
441
442
443
444
445
446static int __merge_refs(struct list_head *head, int mode)
447{
448 struct list_head *pos1;
449
450 list_for_each(pos1, head) {
451 struct list_head *n2;
452 struct list_head *pos2;
453 struct __prelim_ref *ref1;
454
455 ref1 = list_entry(pos1, struct __prelim_ref, list);
456
457 for (pos2 = pos1->next, n2 = pos2->next; pos2 != head;
458 pos2 = n2, n2 = pos2->next) {
459 struct __prelim_ref *ref2;
460 struct __prelim_ref *xchg;
461 struct extent_inode_elem *eie;
462
463 ref2 = list_entry(pos2, struct __prelim_ref, list);
464
465 if (mode == 1) {
466 if (!ref_for_same_block(ref1, ref2))
467 continue;
468 if (!ref1->parent && ref2->parent) {
469 xchg = ref1;
470 ref1 = ref2;
471 ref2 = xchg;
472 }
473 } else {
474 if (ref1->parent != ref2->parent)
475 continue;
476 }
477
478 eie = ref1->inode_list;
479 while (eie && eie->next)
480 eie = eie->next;
481 if (eie)
482 eie->next = ref2->inode_list;
483 else
484 ref1->inode_list = ref2->inode_list;
485 ref1->count += ref2->count;
486
487 list_del(&ref2->list);
488 kfree(ref2);
489 }
490
491 }
492 return 0;
493}
494
495
496
497
498
499static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
500 struct list_head *prefs)
501{
502 struct btrfs_delayed_extent_op *extent_op = head->extent_op;
503 struct rb_node *n = &head->node.rb_node;
504 struct btrfs_key key;
505 struct btrfs_key op_key = {0};
506 int sgn;
507 int ret = 0;
508
509 if (extent_op && extent_op->update_key)
510 btrfs_disk_key_to_cpu(&op_key, &extent_op->key);
511
512 while ((n = rb_prev(n))) {
513 struct btrfs_delayed_ref_node *node;
514 node = rb_entry(n, struct btrfs_delayed_ref_node,
515 rb_node);
516 if (node->bytenr != head->node.bytenr)
517 break;
518 WARN_ON(node->is_head);
519
520 if (node->seq > seq)
521 continue;
522
523 switch (node->action) {
524 case BTRFS_ADD_DELAYED_EXTENT:
525 case BTRFS_UPDATE_DELAYED_HEAD:
526 WARN_ON(1);
527 continue;
528 case BTRFS_ADD_DELAYED_REF:
529 sgn = 1;
530 break;
531 case BTRFS_DROP_DELAYED_REF:
532 sgn = -1;
533 break;
534 default:
535 BUG_ON(1);
536 }
537 switch (node->type) {
538 case BTRFS_TREE_BLOCK_REF_KEY: {
539 struct btrfs_delayed_tree_ref *ref;
540
541 ref = btrfs_delayed_node_to_tree_ref(node);
542 ret = __add_prelim_ref(prefs, ref->root, &op_key,
543 ref->level + 1, 0, node->bytenr,
544 node->ref_mod * sgn);
545 break;
546 }
547 case BTRFS_SHARED_BLOCK_REF_KEY: {
548 struct btrfs_delayed_tree_ref *ref;
549
550 ref = btrfs_delayed_node_to_tree_ref(node);
551 ret = __add_prelim_ref(prefs, ref->root, NULL,
552 ref->level + 1, ref->parent,
553 node->bytenr,
554 node->ref_mod * sgn);
555 break;
556 }
557 case BTRFS_EXTENT_DATA_REF_KEY: {
558 struct btrfs_delayed_data_ref *ref;
559 ref = btrfs_delayed_node_to_data_ref(node);
560
561 key.objectid = ref->objectid;
562 key.type = BTRFS_EXTENT_DATA_KEY;
563 key.offset = ref->offset;
564 ret = __add_prelim_ref(prefs, ref->root, &key, 0, 0,
565 node->bytenr,
566 node->ref_mod * sgn);
567 break;
568 }
569 case BTRFS_SHARED_DATA_REF_KEY: {
570 struct btrfs_delayed_data_ref *ref;
571
572 ref = btrfs_delayed_node_to_data_ref(node);
573
574 key.objectid = ref->objectid;
575 key.type = BTRFS_EXTENT_DATA_KEY;
576 key.offset = ref->offset;
577 ret = __add_prelim_ref(prefs, ref->root, &key, 0,
578 ref->parent, node->bytenr,
579 node->ref_mod * sgn);
580 break;
581 }
582 default:
583 WARN_ON(1);
584 }
585 BUG_ON(ret);
586 }
587
588 return 0;
589}
590
591
592
593
594static int __add_inline_refs(struct btrfs_fs_info *fs_info,
595 struct btrfs_path *path, u64 bytenr,
596 int *info_level, struct list_head *prefs)
597{
598 int ret = 0;
599 int slot;
600 struct extent_buffer *leaf;
601 struct btrfs_key key;
602 unsigned long ptr;
603 unsigned long end;
604 struct btrfs_extent_item *ei;
605 u64 flags;
606 u64 item_size;
607
608
609
610
611 leaf = path->nodes[0];
612 slot = path->slots[0];
613
614 item_size = btrfs_item_size_nr(leaf, slot);
615 BUG_ON(item_size < sizeof(*ei));
616
617 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
618 flags = btrfs_extent_flags(leaf, ei);
619
620 ptr = (unsigned long)(ei + 1);
621 end = (unsigned long)ei + item_size;
622
623 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
624 struct btrfs_tree_block_info *info;
625
626 info = (struct btrfs_tree_block_info *)ptr;
627 *info_level = btrfs_tree_block_level(leaf, info);
628 ptr += sizeof(struct btrfs_tree_block_info);
629 BUG_ON(ptr > end);
630 } else {
631 BUG_ON(!(flags & BTRFS_EXTENT_FLAG_DATA));
632 }
633
634 while (ptr < end) {
635 struct btrfs_extent_inline_ref *iref;
636 u64 offset;
637 int type;
638
639 iref = (struct btrfs_extent_inline_ref *)ptr;
640 type = btrfs_extent_inline_ref_type(leaf, iref);
641 offset = btrfs_extent_inline_ref_offset(leaf, iref);
642
643 switch (type) {
644 case BTRFS_SHARED_BLOCK_REF_KEY:
645 ret = __add_prelim_ref(prefs, 0, NULL,
646 *info_level + 1, offset,
647 bytenr, 1);
648 break;
649 case BTRFS_SHARED_DATA_REF_KEY: {
650 struct btrfs_shared_data_ref *sdref;
651 int count;
652
653 sdref = (struct btrfs_shared_data_ref *)(iref + 1);
654 count = btrfs_shared_data_ref_count(leaf, sdref);
655 ret = __add_prelim_ref(prefs, 0, NULL, 0, offset,
656 bytenr, count);
657 break;
658 }
659 case BTRFS_TREE_BLOCK_REF_KEY:
660 ret = __add_prelim_ref(prefs, offset, NULL,
661 *info_level + 1, 0,
662 bytenr, 1);
663 break;
664 case BTRFS_EXTENT_DATA_REF_KEY: {
665 struct btrfs_extent_data_ref *dref;
666 int count;
667 u64 root;
668
669 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
670 count = btrfs_extent_data_ref_count(leaf, dref);
671 key.objectid = btrfs_extent_data_ref_objectid(leaf,
672 dref);
673 key.type = BTRFS_EXTENT_DATA_KEY;
674 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
675 root = btrfs_extent_data_ref_root(leaf, dref);
676 ret = __add_prelim_ref(prefs, root, &key, 0, 0,
677 bytenr, count);
678 break;
679 }
680 default:
681 WARN_ON(1);
682 }
683 BUG_ON(ret);
684 ptr += btrfs_extent_inline_ref_size(type);
685 }
686
687 return 0;
688}
689
690
691
692
693static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
694 struct btrfs_path *path, u64 bytenr,
695 int info_level, struct list_head *prefs)
696{
697 struct btrfs_root *extent_root = fs_info->extent_root;
698 int ret;
699 int slot;
700 struct extent_buffer *leaf;
701 struct btrfs_key key;
702
703 while (1) {
704 ret = btrfs_next_item(extent_root, path);
705 if (ret < 0)
706 break;
707 if (ret) {
708 ret = 0;
709 break;
710 }
711
712 slot = path->slots[0];
713 leaf = path->nodes[0];
714 btrfs_item_key_to_cpu(leaf, &key, slot);
715
716 if (key.objectid != bytenr)
717 break;
718 if (key.type < BTRFS_TREE_BLOCK_REF_KEY)
719 continue;
720 if (key.type > BTRFS_SHARED_DATA_REF_KEY)
721 break;
722
723 switch (key.type) {
724 case BTRFS_SHARED_BLOCK_REF_KEY:
725 ret = __add_prelim_ref(prefs, 0, NULL,
726 info_level + 1, key.offset,
727 bytenr, 1);
728 break;
729 case BTRFS_SHARED_DATA_REF_KEY: {
730 struct btrfs_shared_data_ref *sdref;
731 int count;
732
733 sdref = btrfs_item_ptr(leaf, slot,
734 struct btrfs_shared_data_ref);
735 count = btrfs_shared_data_ref_count(leaf, sdref);
736 ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset,
737 bytenr, count);
738 break;
739 }
740 case BTRFS_TREE_BLOCK_REF_KEY:
741 ret = __add_prelim_ref(prefs, key.offset, NULL,
742 info_level + 1, 0,
743 bytenr, 1);
744 break;
745 case BTRFS_EXTENT_DATA_REF_KEY: {
746 struct btrfs_extent_data_ref *dref;
747 int count;
748 u64 root;
749
750 dref = btrfs_item_ptr(leaf, slot,
751 struct btrfs_extent_data_ref);
752 count = btrfs_extent_data_ref_count(leaf, dref);
753 key.objectid = btrfs_extent_data_ref_objectid(leaf,
754 dref);
755 key.type = BTRFS_EXTENT_DATA_KEY;
756 key.offset = btrfs_extent_data_ref_offset(leaf, dref);
757 root = btrfs_extent_data_ref_root(leaf, dref);
758 ret = __add_prelim_ref(prefs, root, &key, 0, 0,
759 bytenr, count);
760 break;
761 }
762 default:
763 WARN_ON(1);
764 }
765 BUG_ON(ret);
766 }
767
768 return ret;
769}
770
771
772
773
774
775
776
777
778
779static int find_parent_nodes(struct btrfs_trans_handle *trans,
780 struct btrfs_fs_info *fs_info, u64 bytenr,
781 u64 time_seq, struct ulist *refs,
782 struct ulist *roots, const u64 *extent_item_pos)
783{
784 struct btrfs_key key;
785 struct btrfs_path *path;
786 struct btrfs_delayed_ref_root *delayed_refs = NULL;
787 struct btrfs_delayed_ref_head *head;
788 int info_level = 0;
789 int ret;
790 int search_commit_root = (trans == BTRFS_BACKREF_SEARCH_COMMIT_ROOT);
791 struct list_head prefs_delayed;
792 struct list_head prefs;
793 struct __prelim_ref *ref;
794
795 INIT_LIST_HEAD(&prefs);
796 INIT_LIST_HEAD(&prefs_delayed);
797
798 key.objectid = bytenr;
799 key.type = BTRFS_EXTENT_ITEM_KEY;
800 key.offset = (u64)-1;
801
802 path = btrfs_alloc_path();
803 if (!path)
804 return -ENOMEM;
805 path->search_commit_root = !!search_commit_root;
806
807
808
809
810
811
812again:
813 head = NULL;
814
815 ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
816 if (ret < 0)
817 goto out;
818 BUG_ON(ret == 0);
819
820 if (trans != BTRFS_BACKREF_SEARCH_COMMIT_ROOT) {
821
822
823
824
825 delayed_refs = &trans->transaction->delayed_refs;
826 spin_lock(&delayed_refs->lock);
827 head = btrfs_find_delayed_ref_head(trans, bytenr);
828 if (head) {
829 if (!mutex_trylock(&head->mutex)) {
830 atomic_inc(&head->node.refs);
831 spin_unlock(&delayed_refs->lock);
832
833 btrfs_release_path(path);
834
835
836
837
838
839 mutex_lock(&head->mutex);
840 mutex_unlock(&head->mutex);
841 btrfs_put_delayed_ref(&head->node);
842 goto again;
843 }
844 ret = __add_delayed_refs(head, time_seq,
845 &prefs_delayed);
846 mutex_unlock(&head->mutex);
847 if (ret) {
848 spin_unlock(&delayed_refs->lock);
849 goto out;
850 }
851 }
852 spin_unlock(&delayed_refs->lock);
853 }
854
855 if (path->slots[0]) {
856 struct extent_buffer *leaf;
857 int slot;
858
859 path->slots[0]--;
860 leaf = path->nodes[0];
861 slot = path->slots[0];
862 btrfs_item_key_to_cpu(leaf, &key, slot);
863 if (key.objectid == bytenr &&
864 key.type == BTRFS_EXTENT_ITEM_KEY) {
865 ret = __add_inline_refs(fs_info, path, bytenr,
866 &info_level, &prefs);
867 if (ret)
868 goto out;
869 ret = __add_keyed_refs(fs_info, path, bytenr,
870 info_level, &prefs);
871 if (ret)
872 goto out;
873 }
874 }
875 btrfs_release_path(path);
876
877 list_splice_init(&prefs_delayed, &prefs);
878
879 ret = __add_missing_keys(fs_info, &prefs);
880 if (ret)
881 goto out;
882
883 ret = __merge_refs(&prefs, 1);
884 if (ret)
885 goto out;
886
887 ret = __resolve_indirect_refs(fs_info, search_commit_root, time_seq,
888 &prefs, extent_item_pos);
889 if (ret)
890 goto out;
891
892 ret = __merge_refs(&prefs, 2);
893 if (ret)
894 goto out;
895
896 while (!list_empty(&prefs)) {
897 ref = list_first_entry(&prefs, struct __prelim_ref, list);
898 list_del(&ref->list);
899 WARN_ON(ref->count < 0);
900 if (ref->count && ref->root_id && ref->parent == 0) {
901
902 ret = ulist_add(roots, ref->root_id, 0, GFP_NOFS);
903 BUG_ON(ret < 0);
904 }
905 if (ref->count && ref->parent) {
906 struct extent_inode_elem *eie = NULL;
907 if (extent_item_pos && !ref->inode_list) {
908 u32 bsz;
909 struct extent_buffer *eb;
910 bsz = btrfs_level_size(fs_info->extent_root,
911 info_level);
912 eb = read_tree_block(fs_info->extent_root,
913 ref->parent, bsz, 0);
914 BUG_ON(!eb);
915 ret = find_extent_in_eb(eb, bytenr,
916 *extent_item_pos, &eie);
917 ref->inode_list = eie;
918 free_extent_buffer(eb);
919 }
920 ret = ulist_add_merge(refs, ref->parent,
921 (uintptr_t)ref->inode_list,
922 (u64 *)&eie, GFP_NOFS);
923 if (!ret && extent_item_pos) {
924
925
926
927
928 BUG_ON(!eie);
929 while (eie->next)
930 eie = eie->next;
931 eie->next = ref->inode_list;
932 }
933 BUG_ON(ret < 0);
934 }
935 kfree(ref);
936 }
937
938out:
939 btrfs_free_path(path);
940 while (!list_empty(&prefs)) {
941 ref = list_first_entry(&prefs, struct __prelim_ref, list);
942 list_del(&ref->list);
943 kfree(ref);
944 }
945 while (!list_empty(&prefs_delayed)) {
946 ref = list_first_entry(&prefs_delayed, struct __prelim_ref,
947 list);
948 list_del(&ref->list);
949 kfree(ref);
950 }
951
952 return ret;
953}
954
955static void free_leaf_list(struct ulist *blocks)
956{
957 struct ulist_node *node = NULL;
958 struct extent_inode_elem *eie;
959 struct extent_inode_elem *eie_next;
960 struct ulist_iterator uiter;
961
962 ULIST_ITER_INIT(&uiter);
963 while ((node = ulist_next(blocks, &uiter))) {
964 if (!node->aux)
965 continue;
966 eie = (struct extent_inode_elem *)(uintptr_t)node->aux;
967 for (; eie; eie = eie_next) {
968 eie_next = eie->next;
969 kfree(eie);
970 }
971 node->aux = 0;
972 }
973
974 ulist_free(blocks);
975}
976
977
978
979
980
981
982
983
984
985static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
986 struct btrfs_fs_info *fs_info, u64 bytenr,
987 u64 time_seq, struct ulist **leafs,
988 const u64 *extent_item_pos)
989{
990 struct ulist *tmp;
991 int ret;
992
993 tmp = ulist_alloc(GFP_NOFS);
994 if (!tmp)
995 return -ENOMEM;
996 *leafs = ulist_alloc(GFP_NOFS);
997 if (!*leafs) {
998 ulist_free(tmp);
999 return -ENOMEM;
1000 }
1001
1002 ret = find_parent_nodes(trans, fs_info, bytenr,
1003 time_seq, *leafs, tmp, extent_item_pos);
1004 ulist_free(tmp);
1005
1006 if (ret < 0 && ret != -ENOENT) {
1007 free_leaf_list(*leafs);
1008 return ret;
1009 }
1010
1011 return 0;
1012}
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
1028 struct btrfs_fs_info *fs_info, u64 bytenr,
1029 u64 time_seq, struct ulist **roots)
1030{
1031 struct ulist *tmp;
1032 struct ulist_node *node = NULL;
1033 struct ulist_iterator uiter;
1034 int ret;
1035
1036 tmp = ulist_alloc(GFP_NOFS);
1037 if (!tmp)
1038 return -ENOMEM;
1039 *roots = ulist_alloc(GFP_NOFS);
1040 if (!*roots) {
1041 ulist_free(tmp);
1042 return -ENOMEM;
1043 }
1044
1045 ULIST_ITER_INIT(&uiter);
1046 while (1) {
1047 ret = find_parent_nodes(trans, fs_info, bytenr,
1048 time_seq, tmp, *roots, NULL);
1049 if (ret < 0 && ret != -ENOENT) {
1050 ulist_free(tmp);
1051 ulist_free(*roots);
1052 return ret;
1053 }
1054 node = ulist_next(tmp, &uiter);
1055 if (!node)
1056 break;
1057 bytenr = node->val;
1058 }
1059
1060 ulist_free(tmp);
1061 return 0;
1062}
1063
1064
1065static int __inode_info(u64 inum, u64 ioff, u8 key_type,
1066 struct btrfs_root *fs_root, struct btrfs_path *path,
1067 struct btrfs_key *found_key)
1068{
1069 int ret;
1070 struct btrfs_key key;
1071 struct extent_buffer *eb;
1072
1073 key.type = key_type;
1074 key.objectid = inum;
1075 key.offset = ioff;
1076
1077 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
1078 if (ret < 0)
1079 return ret;
1080
1081 eb = path->nodes[0];
1082 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
1083 ret = btrfs_next_leaf(fs_root, path);
1084 if (ret)
1085 return ret;
1086 eb = path->nodes[0];
1087 }
1088
1089 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
1090 if (found_key->type != key.type || found_key->objectid != key.objectid)
1091 return 1;
1092
1093 return 0;
1094}
1095
1096
1097
1098
1099int inode_item_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
1100 struct btrfs_path *path)
1101{
1102 struct btrfs_key key;
1103 return __inode_info(inum, ioff, BTRFS_INODE_ITEM_KEY, fs_root, path,
1104 &key);
1105}
1106
1107static int inode_ref_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
1108 struct btrfs_path *path,
1109 struct btrfs_key *found_key)
1110{
1111 return __inode_info(inum, ioff, BTRFS_INODE_REF_KEY, fs_root, path,
1112 found_key);
1113}
1114
1115int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
1116 u64 start_off, struct btrfs_path *path,
1117 struct btrfs_inode_extref **ret_extref,
1118 u64 *found_off)
1119{
1120 int ret, slot;
1121 struct btrfs_key key;
1122 struct btrfs_key found_key;
1123 struct btrfs_inode_extref *extref;
1124 struct extent_buffer *leaf;
1125 unsigned long ptr;
1126
1127 key.objectid = inode_objectid;
1128 btrfs_set_key_type(&key, BTRFS_INODE_EXTREF_KEY);
1129 key.offset = start_off;
1130
1131 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1132 if (ret < 0)
1133 return ret;
1134
1135 while (1) {
1136 leaf = path->nodes[0];
1137 slot = path->slots[0];
1138 if (slot >= btrfs_header_nritems(leaf)) {
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 ret = btrfs_next_leaf(root, path);
1149 if (ret) {
1150 if (ret >= 1)
1151 ret = -ENOENT;
1152 break;
1153 }
1154 continue;
1155 }
1156
1157 btrfs_item_key_to_cpu(leaf, &found_key, slot);
1158
1159
1160
1161
1162
1163
1164
1165 ret = -ENOENT;
1166 if (found_key.objectid != inode_objectid)
1167 break;
1168 if (btrfs_key_type(&found_key) != BTRFS_INODE_EXTREF_KEY)
1169 break;
1170
1171 ret = 0;
1172 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1173 extref = (struct btrfs_inode_extref *)ptr;
1174 *ret_extref = extref;
1175 if (found_off)
1176 *found_off = found_key.offset;
1177 break;
1178 }
1179
1180 return ret;
1181}
1182
1183char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
1184 u32 name_len, unsigned long name_off,
1185 struct extent_buffer *eb_in, u64 parent,
1186 char *dest, u32 size)
1187{
1188 int slot;
1189 u64 next_inum;
1190 int ret;
1191 s64 bytes_left = ((s64)size) - 1;
1192 struct extent_buffer *eb = eb_in;
1193 struct btrfs_key found_key;
1194 int leave_spinning = path->leave_spinning;
1195 struct btrfs_inode_ref *iref;
1196
1197 if (bytes_left >= 0)
1198 dest[bytes_left] = '\0';
1199
1200 path->leave_spinning = 1;
1201 while (1) {
1202 bytes_left -= name_len;
1203 if (bytes_left >= 0)
1204 read_extent_buffer(eb, dest + bytes_left,
1205 name_off, name_len);
1206 if (eb != eb_in) {
1207 btrfs_tree_read_unlock_blocking(eb);
1208 free_extent_buffer(eb);
1209 }
1210 ret = inode_ref_info(parent, 0, fs_root, path, &found_key);
1211 if (ret > 0)
1212 ret = -ENOENT;
1213 if (ret)
1214 break;
1215
1216 next_inum = found_key.offset;
1217
1218
1219 if (parent == next_inum)
1220 break;
1221
1222 slot = path->slots[0];
1223 eb = path->nodes[0];
1224
1225 if (eb != eb_in) {
1226 atomic_inc(&eb->refs);
1227 btrfs_tree_read_lock(eb);
1228 btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1229 }
1230 btrfs_release_path(path);
1231 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1232
1233 name_len = btrfs_inode_ref_name_len(eb, iref);
1234 name_off = (unsigned long)(iref + 1);
1235
1236 parent = next_inum;
1237 --bytes_left;
1238 if (bytes_left >= 0)
1239 dest[bytes_left] = '/';
1240 }
1241
1242 btrfs_release_path(path);
1243 path->leave_spinning = leave_spinning;
1244
1245 if (ret)
1246 return ERR_PTR(ret);
1247
1248 return dest + bytes_left;
1249}
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265char *btrfs_iref_to_path(struct btrfs_root *fs_root,
1266 struct btrfs_path *path,
1267 struct btrfs_inode_ref *iref,
1268 struct extent_buffer *eb_in, u64 parent,
1269 char *dest, u32 size)
1270{
1271 return btrfs_ref_to_path(fs_root, path,
1272 btrfs_inode_ref_name_len(eb_in, iref),
1273 (unsigned long)(iref + 1),
1274 eb_in, parent, dest, size);
1275}
1276
1277
1278
1279
1280
1281
1282int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1283 struct btrfs_path *path, struct btrfs_key *found_key,
1284 u64 *flags_ret)
1285{
1286 int ret;
1287 u64 flags;
1288 u32 item_size;
1289 struct extent_buffer *eb;
1290 struct btrfs_extent_item *ei;
1291 struct btrfs_key key;
1292
1293 key.type = BTRFS_EXTENT_ITEM_KEY;
1294 key.objectid = logical;
1295 key.offset = (u64)-1;
1296
1297 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
1298 if (ret < 0)
1299 return ret;
1300 ret = btrfs_previous_item(fs_info->extent_root, path,
1301 0, BTRFS_EXTENT_ITEM_KEY);
1302 if (ret < 0)
1303 return ret;
1304
1305 btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1306 if (found_key->type != BTRFS_EXTENT_ITEM_KEY ||
1307 found_key->objectid > logical ||
1308 found_key->objectid + found_key->offset <= logical) {
1309 pr_debug("logical %llu is not within any extent\n",
1310 (unsigned long long)logical);
1311 return -ENOENT;
1312 }
1313
1314 eb = path->nodes[0];
1315 item_size = btrfs_item_size_nr(eb, path->slots[0]);
1316 BUG_ON(item_size < sizeof(*ei));
1317
1318 ei = btrfs_item_ptr(eb, path->slots[0], struct btrfs_extent_item);
1319 flags = btrfs_extent_flags(eb, ei);
1320
1321 pr_debug("logical %llu is at position %llu within the extent (%llu "
1322 "EXTENT_ITEM %llu) flags %#llx size %u\n",
1323 (unsigned long long)logical,
1324 (unsigned long long)(logical - found_key->objectid),
1325 (unsigned long long)found_key->objectid,
1326 (unsigned long long)found_key->offset,
1327 (unsigned long long)flags, item_size);
1328
1329 WARN_ON(!flags_ret);
1330 if (flags_ret) {
1331 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1332 *flags_ret = BTRFS_EXTENT_FLAG_TREE_BLOCK;
1333 else if (flags & BTRFS_EXTENT_FLAG_DATA)
1334 *flags_ret = BTRFS_EXTENT_FLAG_DATA;
1335 else
1336 BUG_ON(1);
1337 return 0;
1338 }
1339
1340 return -EIO;
1341}
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351static int __get_extent_inline_ref(unsigned long *ptr, struct extent_buffer *eb,
1352 struct btrfs_extent_item *ei, u32 item_size,
1353 struct btrfs_extent_inline_ref **out_eiref,
1354 int *out_type)
1355{
1356 unsigned long end;
1357 u64 flags;
1358 struct btrfs_tree_block_info *info;
1359
1360 if (!*ptr) {
1361
1362 flags = btrfs_extent_flags(eb, ei);
1363 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
1364 info = (struct btrfs_tree_block_info *)(ei + 1);
1365 *out_eiref =
1366 (struct btrfs_extent_inline_ref *)(info + 1);
1367 } else {
1368 *out_eiref = (struct btrfs_extent_inline_ref *)(ei + 1);
1369 }
1370 *ptr = (unsigned long)*out_eiref;
1371 if ((void *)*ptr >= (void *)ei + item_size)
1372 return -ENOENT;
1373 }
1374
1375 end = (unsigned long)ei + item_size;
1376 *out_eiref = (struct btrfs_extent_inline_ref *)*ptr;
1377 *out_type = btrfs_extent_inline_ref_type(eb, *out_eiref);
1378
1379 *ptr += btrfs_extent_inline_ref_size(*out_type);
1380 WARN_ON(*ptr > end);
1381 if (*ptr == end)
1382 return 1;
1383
1384 return 0;
1385}
1386
1387
1388
1389
1390
1391
1392
1393
1394int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
1395 struct btrfs_extent_item *ei, u32 item_size,
1396 u64 *out_root, u8 *out_level)
1397{
1398 int ret;
1399 int type;
1400 struct btrfs_tree_block_info *info;
1401 struct btrfs_extent_inline_ref *eiref;
1402
1403 if (*ptr == (unsigned long)-1)
1404 return 1;
1405
1406 while (1) {
1407 ret = __get_extent_inline_ref(ptr, eb, ei, item_size,
1408 &eiref, &type);
1409 if (ret < 0)
1410 return ret;
1411
1412 if (type == BTRFS_TREE_BLOCK_REF_KEY ||
1413 type == BTRFS_SHARED_BLOCK_REF_KEY)
1414 break;
1415
1416 if (ret == 1)
1417 return 1;
1418 }
1419
1420
1421 info = (struct btrfs_tree_block_info *)(ei + 1);
1422 *out_root = btrfs_extent_inline_ref_offset(eb, eiref);
1423 *out_level = btrfs_tree_block_level(eb, info);
1424
1425 if (ret == 1)
1426 *ptr = (unsigned long)-1;
1427
1428 return 0;
1429}
1430
1431static int iterate_leaf_refs(struct extent_inode_elem *inode_list,
1432 u64 root, u64 extent_item_objectid,
1433 iterate_extent_inodes_t *iterate, void *ctx)
1434{
1435 struct extent_inode_elem *eie;
1436 int ret = 0;
1437
1438 for (eie = inode_list; eie; eie = eie->next) {
1439 pr_debug("ref for %llu resolved, key (%llu EXTEND_DATA %llu), "
1440 "root %llu\n", extent_item_objectid,
1441 eie->inum, eie->offset, root);
1442 ret = iterate(eie->inum, eie->offset, root, ctx);
1443 if (ret) {
1444 pr_debug("stopping iteration for %llu due to ret=%d\n",
1445 extent_item_objectid, ret);
1446 break;
1447 }
1448 }
1449
1450 return ret;
1451}
1452
1453
1454
1455
1456
1457
1458int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
1459 u64 extent_item_objectid, u64 extent_item_pos,
1460 int search_commit_root,
1461 iterate_extent_inodes_t *iterate, void *ctx)
1462{
1463 int ret;
1464 struct list_head data_refs = LIST_HEAD_INIT(data_refs);
1465 struct list_head shared_refs = LIST_HEAD_INIT(shared_refs);
1466 struct btrfs_trans_handle *trans;
1467 struct ulist *refs = NULL;
1468 struct ulist *roots = NULL;
1469 struct ulist_node *ref_node = NULL;
1470 struct ulist_node *root_node = NULL;
1471 struct seq_list tree_mod_seq_elem = {};
1472 struct ulist_iterator ref_uiter;
1473 struct ulist_iterator root_uiter;
1474
1475 pr_debug("resolving all inodes for extent %llu\n",
1476 extent_item_objectid);
1477
1478 if (search_commit_root) {
1479 trans = BTRFS_BACKREF_SEARCH_COMMIT_ROOT;
1480 } else {
1481 trans = btrfs_join_transaction(fs_info->extent_root);
1482 if (IS_ERR(trans))
1483 return PTR_ERR(trans);
1484 btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1485 }
1486
1487 ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
1488 tree_mod_seq_elem.seq, &refs,
1489 &extent_item_pos);
1490 if (ret)
1491 goto out;
1492
1493 ULIST_ITER_INIT(&ref_uiter);
1494 while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
1495 ret = btrfs_find_all_roots(trans, fs_info, ref_node->val,
1496 tree_mod_seq_elem.seq, &roots);
1497 if (ret)
1498 break;
1499 ULIST_ITER_INIT(&root_uiter);
1500 while (!ret && (root_node = ulist_next(roots, &root_uiter))) {
1501 pr_debug("root %llu references leaf %llu, data list "
1502 "%#llx\n", root_node->val, ref_node->val,
1503 (long long)ref_node->aux);
1504 ret = iterate_leaf_refs((struct extent_inode_elem *)
1505 (uintptr_t)ref_node->aux,
1506 root_node->val,
1507 extent_item_objectid,
1508 iterate, ctx);
1509 }
1510 ulist_free(roots);
1511 roots = NULL;
1512 }
1513
1514 free_leaf_list(refs);
1515 ulist_free(roots);
1516out:
1517 if (!search_commit_root) {
1518 btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1519 btrfs_end_transaction(trans, fs_info->extent_root);
1520 }
1521
1522 return ret;
1523}
1524
1525int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info,
1526 struct btrfs_path *path,
1527 iterate_extent_inodes_t *iterate, void *ctx)
1528{
1529 int ret;
1530 u64 extent_item_pos;
1531 u64 flags = 0;
1532 struct btrfs_key found_key;
1533 int search_commit_root = path->search_commit_root;
1534
1535 ret = extent_from_logical(fs_info, logical, path, &found_key, &flags);
1536 btrfs_release_path(path);
1537 if (ret < 0)
1538 return ret;
1539 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1540 return -EINVAL;
1541
1542 extent_item_pos = logical - found_key.objectid;
1543 ret = iterate_extent_inodes(fs_info, found_key.objectid,
1544 extent_item_pos, search_commit_root,
1545 iterate, ctx);
1546
1547 return ret;
1548}
1549
1550typedef int (iterate_irefs_t)(u64 parent, u32 name_len, unsigned long name_off,
1551 struct extent_buffer *eb, void *ctx);
1552
1553static int iterate_inode_refs(u64 inum, struct btrfs_root *fs_root,
1554 struct btrfs_path *path,
1555 iterate_irefs_t *iterate, void *ctx)
1556{
1557 int ret = 0;
1558 int slot;
1559 u32 cur;
1560 u32 len;
1561 u32 name_len;
1562 u64 parent = 0;
1563 int found = 0;
1564 struct extent_buffer *eb;
1565 struct btrfs_item *item;
1566 struct btrfs_inode_ref *iref;
1567 struct btrfs_key found_key;
1568
1569 while (!ret) {
1570 path->leave_spinning = 1;
1571 ret = inode_ref_info(inum, parent ? parent+1 : 0, fs_root, path,
1572 &found_key);
1573 if (ret < 0)
1574 break;
1575 if (ret) {
1576 ret = found ? 0 : -ENOENT;
1577 break;
1578 }
1579 ++found;
1580
1581 parent = found_key.offset;
1582 slot = path->slots[0];
1583 eb = path->nodes[0];
1584
1585 atomic_inc(&eb->refs);
1586 btrfs_tree_read_lock(eb);
1587 btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1588 btrfs_release_path(path);
1589
1590 item = btrfs_item_nr(eb, slot);
1591 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1592
1593 for (cur = 0; cur < btrfs_item_size(eb, item); cur += len) {
1594 name_len = btrfs_inode_ref_name_len(eb, iref);
1595
1596 pr_debug("following ref at offset %u for inode %llu in "
1597 "tree %llu\n", cur,
1598 (unsigned long long)found_key.objectid,
1599 (unsigned long long)fs_root->objectid);
1600 ret = iterate(parent, name_len,
1601 (unsigned long)(iref + 1), eb, ctx);
1602 if (ret)
1603 break;
1604 len = sizeof(*iref) + name_len;
1605 iref = (struct btrfs_inode_ref *)((char *)iref + len);
1606 }
1607 btrfs_tree_read_unlock_blocking(eb);
1608 free_extent_buffer(eb);
1609 }
1610
1611 btrfs_release_path(path);
1612
1613 return ret;
1614}
1615
1616static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root,
1617 struct btrfs_path *path,
1618 iterate_irefs_t *iterate, void *ctx)
1619{
1620 int ret;
1621 int slot;
1622 u64 offset = 0;
1623 u64 parent;
1624 int found = 0;
1625 struct extent_buffer *eb;
1626 struct btrfs_inode_extref *extref;
1627 struct extent_buffer *leaf;
1628 u32 item_size;
1629 u32 cur_offset;
1630 unsigned long ptr;
1631
1632 while (1) {
1633 ret = btrfs_find_one_extref(fs_root, inum, offset, path, &extref,
1634 &offset);
1635 if (ret < 0)
1636 break;
1637 if (ret) {
1638 ret = found ? 0 : -ENOENT;
1639 break;
1640 }
1641 ++found;
1642
1643 slot = path->slots[0];
1644 eb = path->nodes[0];
1645
1646 atomic_inc(&eb->refs);
1647
1648 btrfs_tree_read_lock(eb);
1649 btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1650 btrfs_release_path(path);
1651
1652 leaf = path->nodes[0];
1653 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
1654 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1655 cur_offset = 0;
1656
1657 while (cur_offset < item_size) {
1658 u32 name_len;
1659
1660 extref = (struct btrfs_inode_extref *)(ptr + cur_offset);
1661 parent = btrfs_inode_extref_parent(eb, extref);
1662 name_len = btrfs_inode_extref_name_len(eb, extref);
1663 ret = iterate(parent, name_len,
1664 (unsigned long)&extref->name, eb, ctx);
1665 if (ret)
1666 break;
1667
1668 cur_offset += btrfs_inode_extref_name_len(leaf, extref);
1669 cur_offset += sizeof(*extref);
1670 }
1671 btrfs_tree_read_unlock_blocking(eb);
1672 free_extent_buffer(eb);
1673
1674 offset++;
1675 }
1676
1677 btrfs_release_path(path);
1678
1679 return ret;
1680}
1681
1682static int iterate_irefs(u64 inum, struct btrfs_root *fs_root,
1683 struct btrfs_path *path, iterate_irefs_t *iterate,
1684 void *ctx)
1685{
1686 int ret;
1687 int found_refs = 0;
1688
1689 ret = iterate_inode_refs(inum, fs_root, path, iterate, ctx);
1690 if (!ret)
1691 ++found_refs;
1692 else if (ret != -ENOENT)
1693 return ret;
1694
1695 ret = iterate_inode_extrefs(inum, fs_root, path, iterate, ctx);
1696 if (ret == -ENOENT && found_refs)
1697 return 0;
1698
1699 return ret;
1700}
1701
1702
1703
1704
1705
1706static int inode_to_path(u64 inum, u32 name_len, unsigned long name_off,
1707 struct extent_buffer *eb, void *ctx)
1708{
1709 struct inode_fs_paths *ipath = ctx;
1710 char *fspath;
1711 char *fspath_min;
1712 int i = ipath->fspath->elem_cnt;
1713 const int s_ptr = sizeof(char *);
1714 u32 bytes_left;
1715
1716 bytes_left = ipath->fspath->bytes_left > s_ptr ?
1717 ipath->fspath->bytes_left - s_ptr : 0;
1718
1719 fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr;
1720 fspath = btrfs_ref_to_path(ipath->fs_root, ipath->btrfs_path, name_len,
1721 name_off, eb, inum, fspath_min, bytes_left);
1722 if (IS_ERR(fspath))
1723 return PTR_ERR(fspath);
1724
1725 if (fspath > fspath_min) {
1726 ipath->fspath->val[i] = (u64)(unsigned long)fspath;
1727 ++ipath->fspath->elem_cnt;
1728 ipath->fspath->bytes_left = fspath - fspath_min;
1729 } else {
1730 ++ipath->fspath->elem_missed;
1731 ipath->fspath->bytes_missing += fspath_min - fspath;
1732 ipath->fspath->bytes_left = 0;
1733 }
1734
1735 return 0;
1736}
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748int paths_from_inode(u64 inum, struct inode_fs_paths *ipath)
1749{
1750 return iterate_irefs(inum, ipath->fs_root, ipath->btrfs_path,
1751 inode_to_path, ipath);
1752}
1753
1754struct btrfs_data_container *init_data_container(u32 total_bytes)
1755{
1756 struct btrfs_data_container *data;
1757 size_t alloc_bytes;
1758
1759 alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
1760 data = vmalloc(alloc_bytes);
1761 if (!data)
1762 return ERR_PTR(-ENOMEM);
1763
1764 if (total_bytes >= sizeof(*data)) {
1765 data->bytes_left = total_bytes - sizeof(*data);
1766 data->bytes_missing = 0;
1767 } else {
1768 data->bytes_missing = sizeof(*data) - total_bytes;
1769 data->bytes_left = 0;
1770 }
1771
1772 data->elem_cnt = 0;
1773 data->elem_missed = 0;
1774
1775 return data;
1776}
1777
1778
1779
1780
1781
1782
1783
1784struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
1785 struct btrfs_path *path)
1786{
1787 struct inode_fs_paths *ifp;
1788 struct btrfs_data_container *fspath;
1789
1790 fspath = init_data_container(total_bytes);
1791 if (IS_ERR(fspath))
1792 return (void *)fspath;
1793
1794 ifp = kmalloc(sizeof(*ifp), GFP_NOFS);
1795 if (!ifp) {
1796 kfree(fspath);
1797 return ERR_PTR(-ENOMEM);
1798 }
1799
1800 ifp->btrfs_path = path;
1801 ifp->fspath = fspath;
1802 ifp->fs_root = fs_root;
1803
1804 return ifp;
1805}
1806
1807void free_ipath(struct inode_fs_paths *ipath)
1808{
1809 if (!ipath)
1810 return;
1811 vfree(ipath->fspath);
1812 kfree(ipath);
1813}
1814