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