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