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