btrfs-progs: tests: Remove misleading BCP 78 boilerplate from SHA implementation
[platform/upstream/btrfs-progs.git] / backref.c
1 /*
2  * Copyright (C) 2011 STRATO.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public
6  * License v2 as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public
14  * License along with this program; if not, write to the
15  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16  * Boston, MA 021110-1307, USA.
17  */
18
19 #include "kerncompat.h"
20 #include "ctree.h"
21 #include "disk-io.h"
22 #include "backref.h"
23 #include "kernel-shared/ulist.h"
24 #include "transaction.h"
25 #include "internal.h"
26
27 #define pr_debug(...) do { } while (0)
28
29 struct extent_inode_elem {
30         u64 inum;
31         u64 offset;
32         struct extent_inode_elem *next;
33 };
34
35 static int check_extent_in_eb(struct btrfs_key *key, struct extent_buffer *eb,
36                                 struct btrfs_file_extent_item *fi,
37                                 u64 extent_item_pos,
38                                 struct extent_inode_elem **eie)
39 {
40         u64 offset = 0;
41         struct extent_inode_elem *e;
42
43         if (!btrfs_file_extent_compression(eb, fi) &&
44             !btrfs_file_extent_encryption(eb, fi) &&
45             !btrfs_file_extent_other_encoding(eb, fi)) {
46                 u64 data_offset;
47                 u64 data_len;
48
49                 data_offset = btrfs_file_extent_offset(eb, fi);
50                 data_len = btrfs_file_extent_num_bytes(eb, fi);
51
52                 if (extent_item_pos < data_offset ||
53                     extent_item_pos >= data_offset + data_len)
54                         return 1;
55                 offset = extent_item_pos - data_offset;
56         }
57
58         e = kmalloc(sizeof(*e), GFP_NOFS);
59         if (!e)
60                 return -ENOMEM;
61
62         e->next = *eie;
63         e->inum = key->objectid;
64         e->offset = key->offset + offset;
65         *eie = e;
66
67         return 0;
68 }
69
70 static void free_inode_elem_list(struct extent_inode_elem *eie)
71 {
72         struct extent_inode_elem *eie_next;
73
74         for (; eie; eie = eie_next) {
75                 eie_next = eie->next;
76                 kfree(eie);
77         }
78 }
79
80 static int find_extent_in_eb(struct extent_buffer *eb, u64 wanted_disk_byte,
81                                 u64 extent_item_pos,
82                                 struct extent_inode_elem **eie)
83 {
84         u64 disk_byte;
85         struct btrfs_key key;
86         struct btrfs_file_extent_item *fi;
87         int slot;
88         int nritems;
89         int extent_type;
90         int ret;
91
92         /*
93          * from the shared data ref, we only have the leaf but we need
94          * the key. thus, we must look into all items and see that we
95          * find one (some) with a reference to our extent item.
96          */
97         nritems = btrfs_header_nritems(eb);
98         for (slot = 0; slot < nritems; ++slot) {
99                 btrfs_item_key_to_cpu(eb, &key, slot);
100                 if (key.type != BTRFS_EXTENT_DATA_KEY)
101                         continue;
102                 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
103                 extent_type = btrfs_file_extent_type(eb, fi);
104                 if (extent_type == BTRFS_FILE_EXTENT_INLINE)
105                         continue;
106                 /* don't skip BTRFS_FILE_EXTENT_PREALLOC, we can handle that */
107                 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
108                 if (disk_byte != wanted_disk_byte)
109                         continue;
110
111                 ret = check_extent_in_eb(&key, eb, fi, extent_item_pos, eie);
112                 if (ret < 0)
113                         return ret;
114         }
115
116         return 0;
117 }
118
119 /*
120  * this structure records all encountered refs on the way up to the root
121  */
122 struct __prelim_ref {
123         struct list_head list;
124         u64 root_id;
125         struct btrfs_key key_for_search;
126         int level;
127         int count;
128         struct extent_inode_elem *inode_list;
129         u64 parent;
130         u64 wanted_disk_byte;
131 };
132
133 /*
134  * the rules for all callers of this function are:
135  * - obtaining the parent is the goal
136  * - if you add a key, you must know that it is a correct key
137  * - if you cannot add the parent or a correct key, then we will look into the
138  *   block later to set a correct key
139  *
140  * delayed refs
141  * ============
142  *        backref type | shared | indirect | shared | indirect
143  * information         |   tree |     tree |   data |     data
144  * --------------------+--------+----------+--------+----------
145  *      parent logical |    y   |     -    |    -   |     -
146  *      key to resolve |    -   |     y    |    y   |     y
147  *  tree block logical |    -   |     -    |    -   |     -
148  *  root for resolving |    y   |     y    |    y   |     y
149  *
150  * - column 1:       we've the parent -> done
151  * - column 2, 3, 4: we use the key to find the parent
152  *
153  * on disk refs (inline or keyed)
154  * ==============================
155  *        backref type | shared | indirect | shared | indirect
156  * information         |   tree |     tree |   data |     data
157  * --------------------+--------+----------+--------+----------
158  *      parent logical |    y   |     -    |    y   |     -
159  *      key to resolve |    -   |     -    |    -   |     y
160  *  tree block logical |    y   |     y    |    y   |     y
161  *  root for resolving |    -   |     y    |    y   |     y
162  *
163  * - column 1, 3: we've the parent -> done
164  * - column 2:    we take the first key from the block to find the parent
165  *                (see __add_missing_keys)
166  * - column 4:    we use the key to find the parent
167  *
168  * additional information that's available but not required to find the parent
169  * block might help in merging entries to gain some speed.
170  */
171
172 static int __add_prelim_ref(struct list_head *head, u64 root_id,
173                             struct btrfs_key *key, int level,
174                             u64 parent, u64 wanted_disk_byte, int count,
175                             gfp_t gfp_mask)
176 {
177         struct __prelim_ref *ref;
178
179         if (root_id == BTRFS_DATA_RELOC_TREE_OBJECTID)
180                 return 0;
181
182         ref = kmalloc(sizeof(*ref), gfp_mask);
183         if (!ref)
184                 return -ENOMEM;
185
186         ref->root_id = root_id;
187         if (key)
188                 ref->key_for_search = *key;
189         else
190                 memset(&ref->key_for_search, 0, sizeof(ref->key_for_search));
191
192         ref->inode_list = NULL;
193         ref->level = level;
194         ref->count = count;
195         ref->parent = parent;
196         ref->wanted_disk_byte = wanted_disk_byte;
197         list_add_tail(&ref->list, head);
198
199         return 0;
200 }
201
202 static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
203                            struct ulist *parents, struct __prelim_ref *ref,
204                            int level, u64 time_seq, const u64 *extent_item_pos,
205                            u64 total_refs)
206 {
207         int ret = 0;
208         int slot;
209         struct extent_buffer *eb;
210         struct btrfs_key key;
211         struct btrfs_key *key_for_search = &ref->key_for_search;
212         struct btrfs_file_extent_item *fi;
213         struct extent_inode_elem *eie = NULL, *old = NULL;
214         u64 disk_byte;
215         u64 wanted_disk_byte = ref->wanted_disk_byte;
216         u64 count = 0;
217
218         if (level != 0) {
219                 eb = path->nodes[level];
220                 ret = ulist_add(parents, eb->start, 0, GFP_NOFS);
221                 if (ret < 0)
222                         return ret;
223                 return 0;
224         }
225
226         /*
227          * We normally enter this function with the path already pointing to
228          * the first item to check. But sometimes, we may enter it with
229          * slot==nritems. In that case, go to the next leaf before we continue.
230          */
231         if (path->slots[0] >= btrfs_header_nritems(path->nodes[0]))
232                 ret = btrfs_next_leaf(root, path);
233
234         while (!ret && count < total_refs) {
235                 eb = path->nodes[0];
236                 slot = path->slots[0];
237
238                 btrfs_item_key_to_cpu(eb, &key, slot);
239
240                 if (key.objectid != key_for_search->objectid ||
241                     key.type != BTRFS_EXTENT_DATA_KEY)
242                         break;
243
244                 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
245                 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
246
247                 if (disk_byte == wanted_disk_byte) {
248                         eie = NULL;
249                         old = NULL;
250                         count++;
251                         if (extent_item_pos) {
252                                 ret = check_extent_in_eb(&key, eb, fi,
253                                                 *extent_item_pos,
254                                                 &eie);
255                                 if (ret < 0)
256                                         break;
257                         }
258                         if (ret > 0)
259                                 goto next;
260                         ret = ulist_add_merge_ptr(parents, eb->start,
261                                                   eie, (void **)&old, GFP_NOFS);
262                         if (ret < 0)
263                                 break;
264                         if (!ret && extent_item_pos) {
265                                 while (old->next)
266                                         old = old->next;
267                                 old->next = eie;
268                         }
269                         eie = NULL;
270                 }
271 next:
272                 ret = btrfs_next_item(root, path);
273         }
274
275         if (ret > 0)
276                 ret = 0;
277         else if (ret < 0)
278                 free_inode_elem_list(eie);
279         return ret;
280 }
281
282 /*
283  * resolve an indirect backref in the form (root_id, key, level)
284  * to a logical address
285  */
286 static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
287                                   struct btrfs_path *path, u64 time_seq,
288                                   struct __prelim_ref *ref,
289                                   struct ulist *parents,
290                                   const u64 *extent_item_pos, u64 total_refs)
291 {
292         struct btrfs_root *root;
293         struct btrfs_key root_key;
294         struct extent_buffer *eb;
295         int ret = 0;
296         int root_level;
297         int level = ref->level;
298
299         root_key.objectid = ref->root_id;
300         root_key.type = BTRFS_ROOT_ITEM_KEY;
301         root_key.offset = (u64)-1;
302
303         root = btrfs_read_fs_root(fs_info, &root_key);
304         if (IS_ERR(root)) {
305                 ret = PTR_ERR(root);
306                 goto out;
307         }
308
309         root_level = btrfs_root_level(&root->root_item);
310
311         if (root_level + 1 == level)
312                 goto out;
313
314         path->lowest_level = level;
315         ret = btrfs_search_slot(NULL, root, &ref->key_for_search, path, 0, 0);
316
317         pr_debug("search slot in root %llu (level %d, ref count %d) returned "
318                  "%d for key (%llu %u %llu)\n",
319                  ref->root_id, level, ref->count, ret,
320                  ref->key_for_search.objectid, ref->key_for_search.type,
321                  ref->key_for_search.offset);
322         if (ret < 0)
323                 goto out;
324
325         eb = path->nodes[level];
326         while (!eb) {
327                 if (!level) {
328                         ret = 1;
329                         WARN_ON(1);
330                         goto out;
331                 }
332                 level--;
333                 eb = path->nodes[level];
334         }
335
336         ret = add_all_parents(root, path, parents, ref, level, time_seq,
337                               extent_item_pos, total_refs);
338 out:
339         path->lowest_level = 0;
340         btrfs_release_path(path);
341         return ret;
342 }
343
344 /*
345  * resolve all indirect backrefs from the list
346  */
347 static int __resolve_indirect_refs(struct btrfs_fs_info *fs_info,
348                                    struct btrfs_path *path, u64 time_seq,
349                                    struct list_head *head,
350                                    const u64 *extent_item_pos, u64 total_refs)
351 {
352         int err;
353         int ret = 0;
354         struct __prelim_ref *ref;
355         struct __prelim_ref *ref_safe;
356         struct __prelim_ref *new_ref;
357         struct ulist *parents;
358         struct ulist_node *node;
359         struct ulist_iterator uiter;
360
361         parents = ulist_alloc(GFP_NOFS);
362         if (!parents)
363                 return -ENOMEM;
364
365         /*
366          * _safe allows us to insert directly after the current item without
367          * iterating over the newly inserted items.
368          * we're also allowed to re-assign ref during iteration.
369          */
370         list_for_each_entry_safe(ref, ref_safe, head, list) {
371                 if (ref->parent)        /* already direct */
372                         continue;
373                 if (ref->count == 0)
374                         continue;
375                 err = __resolve_indirect_ref(fs_info, path, time_seq, ref,
376                                              parents, extent_item_pos,
377                                              total_refs);
378                 /*
379                  * we can only tolerate ENOENT,otherwise,we should catch error
380                  * and return directly.
381                  */
382                 if (err == -ENOENT) {
383                         continue;
384                 } else if (err) {
385                         ret = err;
386                         goto out;
387                 }
388
389                 /* we put the first parent into the ref at hand */
390                 ULIST_ITER_INIT(&uiter);
391                 node = ulist_next(parents, &uiter);
392                 ref->parent = node ? node->val : 0;
393                 ref->inode_list = node ?
394                         (struct extent_inode_elem *)(uintptr_t)node->aux : NULL;
395
396                 /* additional parents require new refs being added here */
397                 while ((node = ulist_next(parents, &uiter))) {
398                         new_ref = kmalloc(sizeof(*new_ref), GFP_NOFS);
399                         if (!new_ref) {
400                                 ret = -ENOMEM;
401                                 goto out;
402                         }
403                         memcpy(new_ref, ref, sizeof(*ref));
404                         new_ref->parent = node->val;
405                         new_ref->inode_list = (struct extent_inode_elem *)
406                                                         (uintptr_t)node->aux;
407                         list_add(&new_ref->list, &ref->list);
408                 }
409                 ulist_reinit(parents);
410         }
411 out:
412         ulist_free(parents);
413         return ret;
414 }
415
416 static inline int ref_for_same_block(struct __prelim_ref *ref1,
417                                      struct __prelim_ref *ref2)
418 {
419         if (ref1->level != ref2->level)
420                 return 0;
421         if (ref1->root_id != ref2->root_id)
422                 return 0;
423         if (ref1->key_for_search.type != ref2->key_for_search.type)
424                 return 0;
425         if (ref1->key_for_search.objectid != ref2->key_for_search.objectid)
426                 return 0;
427         if (ref1->key_for_search.offset != ref2->key_for_search.offset)
428                 return 0;
429         if (ref1->parent != ref2->parent)
430                 return 0;
431
432         return 1;
433 }
434
435 /*
436  * read tree blocks and add keys where required.
437  */
438 static int __add_missing_keys(struct btrfs_fs_info *fs_info,
439                               struct list_head *head)
440 {
441         struct list_head *pos;
442         struct extent_buffer *eb;
443
444         list_for_each(pos, head) {
445                 struct __prelim_ref *ref;
446                 ref = list_entry(pos, struct __prelim_ref, list);
447
448                 if (ref->parent)
449                         continue;
450                 if (ref->key_for_search.type)
451                         continue;
452                 BUG_ON(!ref->wanted_disk_byte);
453                 eb = read_tree_block(fs_info, ref->wanted_disk_byte, 0);
454                 if (!extent_buffer_uptodate(eb)) {
455                         free_extent_buffer(eb);
456                         return -EIO;
457                 }
458                 if (btrfs_header_level(eb) == 0)
459                         btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
460                 else
461                         btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
462                 free_extent_buffer(eb);
463         }
464         return 0;
465 }
466
467 /*
468  * merge two lists of backrefs and adjust counts accordingly
469  *
470  * mode = 1: merge identical keys, if key is set
471  *    FIXME: if we add more keys in __add_prelim_ref, we can merge more here.
472  *           additionally, we could even add a key range for the blocks we
473  *           looked into to merge even more (-> replace unresolved refs by those
474  *           having a parent).
475  * mode = 2: merge identical parents
476  */
477 static void __merge_refs(struct list_head *head, int mode)
478 {
479         struct list_head *pos1;
480
481         list_for_each(pos1, head) {
482                 struct list_head *n2;
483                 struct list_head *pos2;
484                 struct __prelim_ref *ref1;
485
486                 ref1 = list_entry(pos1, struct __prelim_ref, list);
487
488                 for (pos2 = pos1->next, n2 = pos2->next; pos2 != head;
489                      pos2 = n2, n2 = pos2->next) {
490                         struct __prelim_ref *ref2;
491                         struct __prelim_ref *xchg;
492                         struct extent_inode_elem *eie;
493
494                         ref2 = list_entry(pos2, struct __prelim_ref, list);
495
496                         if (mode == 1) {
497                                 if (!ref_for_same_block(ref1, ref2))
498                                         continue;
499                                 if (!ref1->parent && ref2->parent) {
500                                         xchg = ref1;
501                                         ref1 = ref2;
502                                         ref2 = xchg;
503                                 }
504                         } else {
505                                 if (ref1->parent != ref2->parent)
506                                         continue;
507                         }
508
509                         eie = ref1->inode_list;
510                         while (eie && eie->next)
511                                 eie = eie->next;
512                         if (eie)
513                                 eie->next = ref2->inode_list;
514                         else
515                                 ref1->inode_list = ref2->inode_list;
516                         ref1->count += ref2->count;
517
518                         list_del(&ref2->list);
519                         kfree(ref2);
520                 }
521
522         }
523 }
524
525 /*
526  * add all inline backrefs for bytenr to the list
527  */
528 static int __add_inline_refs(struct btrfs_fs_info *fs_info,
529                              struct btrfs_path *path, u64 bytenr,
530                              int *info_level, struct list_head *prefs,
531                              u64 *total_refs)
532 {
533         int ret = 0;
534         int slot;
535         struct extent_buffer *leaf;
536         struct btrfs_key key;
537         struct btrfs_key found_key;
538         unsigned long ptr;
539         unsigned long end;
540         struct btrfs_extent_item *ei;
541         u64 flags;
542         u64 item_size;
543
544         /*
545          * enumerate all inline refs
546          */
547         leaf = path->nodes[0];
548         slot = path->slots[0];
549
550         item_size = btrfs_item_size_nr(leaf, slot);
551         BUG_ON(item_size < sizeof(*ei));
552
553         ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
554         flags = btrfs_extent_flags(leaf, ei);
555         *total_refs += btrfs_extent_refs(leaf, ei);
556         btrfs_item_key_to_cpu(leaf, &found_key, slot);
557
558         ptr = (unsigned long)(ei + 1);
559         end = (unsigned long)ei + item_size;
560
561         if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
562             flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
563                 struct btrfs_tree_block_info *info;
564
565                 info = (struct btrfs_tree_block_info *)ptr;
566                 *info_level = btrfs_tree_block_level(leaf, info);
567                 ptr += sizeof(struct btrfs_tree_block_info);
568                 BUG_ON(ptr > end);
569         } else if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
570                 *info_level = found_key.offset;
571         } else {
572                 BUG_ON(!(flags & BTRFS_EXTENT_FLAG_DATA));
573         }
574
575         while (ptr < end) {
576                 struct btrfs_extent_inline_ref *iref;
577                 u64 offset;
578                 int type;
579
580                 iref = (struct btrfs_extent_inline_ref *)ptr;
581                 type = btrfs_extent_inline_ref_type(leaf, iref);
582                 offset = btrfs_extent_inline_ref_offset(leaf, iref);
583
584                 switch (type) {
585                 case BTRFS_SHARED_BLOCK_REF_KEY:
586                         ret = __add_prelim_ref(prefs, 0, NULL,
587                                                 *info_level + 1, offset,
588                                                 bytenr, 1, GFP_NOFS);
589                         break;
590                 case BTRFS_SHARED_DATA_REF_KEY: {
591                         struct btrfs_shared_data_ref *sdref;
592                         int count;
593
594                         sdref = (struct btrfs_shared_data_ref *)(iref + 1);
595                         count = btrfs_shared_data_ref_count(leaf, sdref);
596                         ret = __add_prelim_ref(prefs, 0, NULL, 0, offset,
597                                                bytenr, count, GFP_NOFS);
598                         break;
599                 }
600                 case BTRFS_TREE_BLOCK_REF_KEY:
601                         ret = __add_prelim_ref(prefs, offset, NULL,
602                                                *info_level + 1, 0,
603                                                bytenr, 1, GFP_NOFS);
604                         break;
605                 case BTRFS_EXTENT_DATA_REF_KEY: {
606                         struct btrfs_extent_data_ref *dref;
607                         int count;
608                         u64 root;
609
610                         dref = (struct btrfs_extent_data_ref *)(&iref->offset);
611                         count = btrfs_extent_data_ref_count(leaf, dref);
612                         key.objectid = btrfs_extent_data_ref_objectid(leaf,
613                                                                       dref);
614                         key.type = BTRFS_EXTENT_DATA_KEY;
615                         key.offset = btrfs_extent_data_ref_offset(leaf, dref);
616                         root = btrfs_extent_data_ref_root(leaf, dref);
617                         ret = __add_prelim_ref(prefs, root, &key, 0, 0,
618                                                bytenr, count, GFP_NOFS);
619                         break;
620                 }
621                 default:
622                         WARN_ON(1);
623                 }
624                 if (ret)
625                         return ret;
626                 ptr += btrfs_extent_inline_ref_size(type);
627         }
628
629         return 0;
630 }
631
632 /*
633  * add all non-inline backrefs for bytenr to the list
634  */
635 static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
636                             struct btrfs_path *path, u64 bytenr,
637                             int info_level, struct list_head *prefs)
638 {
639         struct btrfs_root *extent_root = fs_info->extent_root;
640         int ret;
641         int slot;
642         struct extent_buffer *leaf;
643         struct btrfs_key key;
644
645         while (1) {
646                 ret = btrfs_next_item(extent_root, path);
647                 if (ret < 0)
648                         break;
649                 if (ret) {
650                         ret = 0;
651                         break;
652                 }
653
654                 slot = path->slots[0];
655                 leaf = path->nodes[0];
656                 btrfs_item_key_to_cpu(leaf, &key, slot);
657
658                 if (key.objectid != bytenr)
659                         break;
660                 if (key.type < BTRFS_TREE_BLOCK_REF_KEY)
661                         continue;
662                 if (key.type > BTRFS_SHARED_DATA_REF_KEY)
663                         break;
664
665                 switch (key.type) {
666                 case BTRFS_SHARED_BLOCK_REF_KEY:
667                         ret = __add_prelim_ref(prefs, 0, NULL,
668                                                 info_level + 1, key.offset,
669                                                 bytenr, 1, GFP_NOFS);
670                         break;
671                 case BTRFS_SHARED_DATA_REF_KEY: {
672                         struct btrfs_shared_data_ref *sdref;
673                         int count;
674
675                         sdref = btrfs_item_ptr(leaf, slot,
676                                               struct btrfs_shared_data_ref);
677                         count = btrfs_shared_data_ref_count(leaf, sdref);
678                         ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset,
679                                                 bytenr, count, GFP_NOFS);
680                         break;
681                 }
682                 case BTRFS_TREE_BLOCK_REF_KEY:
683                         ret = __add_prelim_ref(prefs, key.offset, NULL,
684                                                info_level + 1, 0,
685                                                bytenr, 1, GFP_NOFS);
686                         break;
687                 case BTRFS_EXTENT_DATA_REF_KEY: {
688                         struct btrfs_extent_data_ref *dref;
689                         int count;
690                         u64 root;
691
692                         dref = btrfs_item_ptr(leaf, slot,
693                                               struct btrfs_extent_data_ref);
694                         count = btrfs_extent_data_ref_count(leaf, dref);
695                         key.objectid = btrfs_extent_data_ref_objectid(leaf,
696                                                                       dref);
697                         key.type = BTRFS_EXTENT_DATA_KEY;
698                         key.offset = btrfs_extent_data_ref_offset(leaf, dref);
699                         root = btrfs_extent_data_ref_root(leaf, dref);
700                         ret = __add_prelim_ref(prefs, root, &key, 0, 0,
701                                                bytenr, count, GFP_NOFS);
702                         break;
703                 }
704                 default:
705                         WARN_ON(1);
706                 }
707                 if (ret)
708                         return ret;
709
710         }
711
712         return ret;
713 }
714
715 /*
716  * this adds all existing backrefs (inline backrefs, backrefs and delayed
717  * refs) for the given bytenr to the refs list, merges duplicates and resolves
718  * indirect refs to their parent bytenr.
719  * When roots are found, they're added to the roots list
720  *
721  * FIXME some caching might speed things up
722  */
723 static int find_parent_nodes(struct btrfs_trans_handle *trans,
724                              struct btrfs_fs_info *fs_info, u64 bytenr,
725                              u64 time_seq, struct ulist *refs,
726                              struct ulist *roots, const u64 *extent_item_pos)
727 {
728         struct btrfs_key key;
729         struct btrfs_path *path;
730         int info_level = 0;
731         int ret;
732         struct list_head prefs;
733         struct __prelim_ref *ref;
734         struct extent_inode_elem *eie = NULL;
735         u64 total_refs = 0;
736
737         INIT_LIST_HEAD(&prefs);
738
739         key.objectid = bytenr;
740         key.offset = (u64)-1;
741         if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
742                 key.type = BTRFS_METADATA_ITEM_KEY;
743         else
744                 key.type = BTRFS_EXTENT_ITEM_KEY;
745
746         path = btrfs_alloc_path();
747         if (!path)
748                 return -ENOMEM;
749
750         ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
751         if (ret < 0)
752                 goto out;
753         BUG_ON(ret == 0);
754
755         if (path->slots[0]) {
756                 struct extent_buffer *leaf;
757                 int slot;
758
759                 path->slots[0]--;
760                 leaf = path->nodes[0];
761                 slot = path->slots[0];
762                 btrfs_item_key_to_cpu(leaf, &key, slot);
763                 if (key.objectid == bytenr &&
764                     (key.type == BTRFS_EXTENT_ITEM_KEY ||
765                      key.type == BTRFS_METADATA_ITEM_KEY)) {
766                         ret = __add_inline_refs(fs_info, path, bytenr,
767                                                 &info_level, &prefs,
768                                                 &total_refs);
769                         if (ret)
770                                 goto out;
771                         ret = __add_keyed_refs(fs_info, path, bytenr,
772                                                info_level, &prefs);
773                         if (ret)
774                                 goto out;
775                 }
776         }
777         btrfs_release_path(path);
778
779         ret = __add_missing_keys(fs_info, &prefs);
780         if (ret)
781                 goto out;
782
783         __merge_refs(&prefs, 1);
784
785         ret = __resolve_indirect_refs(fs_info, path, time_seq, &prefs,
786                                       extent_item_pos, total_refs);
787         if (ret)
788                 goto out;
789
790         __merge_refs(&prefs, 2);
791
792         while (!list_empty(&prefs)) {
793                 ref = list_first_entry(&prefs, struct __prelim_ref, list);
794                 WARN_ON(ref->count < 0);
795                 if (roots && ref->count && ref->root_id && ref->parent == 0) {
796                         /* no parent == root of tree */
797                         ret = ulist_add(roots, ref->root_id, 0, GFP_NOFS);
798                         if (ret < 0)
799                                 goto out;
800                 }
801                 if (ref->count && ref->parent) {
802                         if (extent_item_pos && !ref->inode_list &&
803                             ref->level == 0) {
804                                 struct extent_buffer *eb;
805
806                                 eb = read_tree_block(fs_info, ref->parent, 0);
807                                 if (!extent_buffer_uptodate(eb)) {
808                                         free_extent_buffer(eb);
809                                         ret = -EIO;
810                                         goto out;
811                                 }
812                                 ret = find_extent_in_eb(eb, bytenr,
813                                                         *extent_item_pos, &eie);
814                                 free_extent_buffer(eb);
815                                 if (ret < 0)
816                                         goto out;
817                                 ref->inode_list = eie;
818                         }
819                         ret = ulist_add_merge_ptr(refs, ref->parent,
820                                                   ref->inode_list,
821                                                   (void **)&eie, GFP_NOFS);
822                         if (ret < 0)
823                                 goto out;
824                         if (!ret && extent_item_pos) {
825                                 /*
826                                  * we've recorded that parent, so we must extend
827                                  * its inode list here
828                                  */
829                                 BUG_ON(!eie);
830                                 while (eie->next)
831                                         eie = eie->next;
832                                 eie->next = ref->inode_list;
833                         }
834                         eie = NULL;
835                 }
836                 list_del(&ref->list);
837                 kfree(ref);
838         }
839
840 out:
841         btrfs_free_path(path);
842         while (!list_empty(&prefs)) {
843                 ref = list_first_entry(&prefs, struct __prelim_ref, list);
844                 list_del(&ref->list);
845                 kfree(ref);
846         }
847         if (ret < 0)
848                 free_inode_elem_list(eie);
849         return ret;
850 }
851
852 static void free_leaf_list(struct ulist *blocks)
853 {
854         struct ulist_node *node = NULL;
855         struct extent_inode_elem *eie;
856         struct ulist_iterator uiter;
857
858         ULIST_ITER_INIT(&uiter);
859         while ((node = ulist_next(blocks, &uiter))) {
860                 if (!node->aux)
861                         continue;
862                 eie = (struct extent_inode_elem *)(uintptr_t)node->aux;
863                 free_inode_elem_list(eie);
864                 node->aux = 0;
865         }
866
867         ulist_free(blocks);
868 }
869
870 /*
871  * Finds all leafs with a reference to the specified combination of bytenr and
872  * offset. key_list_head will point to a list of corresponding keys (caller must
873  * free each list element). The leafs will be stored in the leafs ulist, which
874  * must be freed with ulist_free.
875  *
876  * returns 0 on success, <0 on error
877  */
878 static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
879                                 struct btrfs_fs_info *fs_info, u64 bytenr,
880                                 u64 time_seq, struct ulist **leafs,
881                                 const u64 *extent_item_pos)
882 {
883         int ret;
884
885         *leafs = ulist_alloc(GFP_NOFS);
886         if (!*leafs)
887                 return -ENOMEM;
888
889         ret = find_parent_nodes(trans, fs_info, bytenr,
890                                 time_seq, *leafs, NULL, extent_item_pos);
891         if (ret < 0 && ret != -ENOENT) {
892                 free_leaf_list(*leafs);
893                 return ret;
894         }
895
896         return 0;
897 }
898
899 /*
900  * walk all backrefs for a given extent to find all roots that reference this
901  * extent. Walking a backref means finding all extents that reference this
902  * extent and in turn walk the backrefs of those, too. Naturally this is a
903  * recursive process, but here it is implemented in an iterative fashion: We
904  * find all referencing extents for the extent in question and put them on a
905  * list. In turn, we find all referencing extents for those, further appending
906  * to the list. The way we iterate the list allows adding more elements after
907  * the current while iterating. The process stops when we reach the end of the
908  * list. Found roots are added to the roots list.
909  *
910  * returns 0 on success, < 0 on error.
911  */
912 static int __btrfs_find_all_roots(struct btrfs_trans_handle *trans,
913                                   struct btrfs_fs_info *fs_info, u64 bytenr,
914                                   u64 time_seq, struct ulist **roots)
915 {
916         struct ulist *tmp;
917         struct ulist_node *node = NULL;
918         struct ulist_iterator uiter;
919         int ret;
920
921         tmp = ulist_alloc(GFP_NOFS);
922         if (!tmp)
923                 return -ENOMEM;
924         *roots = ulist_alloc(GFP_NOFS);
925         if (!*roots) {
926                 ulist_free(tmp);
927                 return -ENOMEM;
928         }
929
930         ULIST_ITER_INIT(&uiter);
931         while (1) {
932                 ret = find_parent_nodes(trans, fs_info, bytenr,
933                                         time_seq, tmp, *roots, NULL);
934                 if (ret < 0 && ret != -ENOENT) {
935                         ulist_free(tmp);
936                         ulist_free(*roots);
937                         return ret;
938                 }
939                 node = ulist_next(tmp, &uiter);
940                 if (!node)
941                         break;
942                 bytenr = node->val;
943                 cond_resched();
944         }
945
946         ulist_free(tmp);
947         return 0;
948 }
949
950 int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
951                          struct btrfs_fs_info *fs_info, u64 bytenr,
952                          u64 time_seq, struct ulist **roots)
953 {
954         return __btrfs_find_all_roots(trans, fs_info, bytenr, time_seq, roots);
955 }
956
957 /*
958  * this makes the path point to (inum INODE_ITEM ioff)
959  */
960 int inode_item_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
961                         struct btrfs_path *path)
962 {
963         struct btrfs_key key;
964         return btrfs_find_item(fs_root, path, inum, ioff,
965                         BTRFS_INODE_ITEM_KEY, &key);
966 }
967
968 static int inode_ref_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
969                                 struct btrfs_path *path,
970                                 struct btrfs_key *found_key)
971 {
972         return btrfs_find_item(fs_root, path, inum, ioff,
973                         BTRFS_INODE_REF_KEY, found_key);
974 }
975
976 int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
977                           u64 start_off, struct btrfs_path *path,
978                           struct btrfs_inode_extref **ret_extref,
979                           u64 *found_off)
980 {
981         int ret, slot;
982         struct btrfs_key key;
983         struct btrfs_key found_key;
984         struct btrfs_inode_extref *extref;
985         struct extent_buffer *leaf;
986         unsigned long ptr;
987
988         key.objectid = inode_objectid;
989         key.type = BTRFS_INODE_EXTREF_KEY;
990         key.offset = start_off;
991
992         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
993         if (ret < 0)
994                 return ret;
995
996         while (1) {
997                 leaf = path->nodes[0];
998                 slot = path->slots[0];
999                 if (slot >= btrfs_header_nritems(leaf)) {
1000                         /*
1001                          * If the item at offset is not found,
1002                          * btrfs_search_slot will point us to the slot
1003                          * where it should be inserted. In our case
1004                          * that will be the slot directly before the
1005                          * next INODE_REF_KEY_V2 item. In the case
1006                          * that we're pointing to the last slot in a
1007                          * leaf, we must move one leaf over.
1008                          */
1009                         ret = btrfs_next_leaf(root, path);
1010                         if (ret) {
1011                                 if (ret >= 1)
1012                                         ret = -ENOENT;
1013                                 break;
1014                         }
1015                         continue;
1016                 }
1017
1018                 btrfs_item_key_to_cpu(leaf, &found_key, slot);
1019
1020                 /*
1021                  * Check that we're still looking at an extended ref key for
1022                  * this particular objectid. If we have different
1023                  * objectid or type then there are no more to be found
1024                  * in the tree and we can exit.
1025                  */
1026                 ret = -ENOENT;
1027                 if (found_key.objectid != inode_objectid)
1028                         break;
1029                 if (found_key.type != BTRFS_INODE_EXTREF_KEY)
1030                         break;
1031
1032                 ret = 0;
1033                 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1034                 extref = (struct btrfs_inode_extref *)ptr;
1035                 *ret_extref = extref;
1036                 if (found_off)
1037                         *found_off = found_key.offset;
1038                 break;
1039         }
1040
1041         return ret;
1042 }
1043
1044 /*
1045  * this iterates to turn a name (from iref/extref) into a full filesystem path.
1046  * Elements of the path are separated by '/' and the path is guaranteed to be
1047  * 0-terminated. the path is only given within the current file system.
1048  * Therefore, it never starts with a '/'. the caller is responsible to provide
1049  * "size" bytes in "dest". the dest buffer will be filled backwards. finally,
1050  * the start point of the resulting string is returned. this pointer is within
1051  * dest, normally.
1052  * in case the path buffer would overflow, the pointer is decremented further
1053  * as if output was written to the buffer, though no more output is actually
1054  * generated. that way, the caller can determine how much space would be
1055  * required for the path to fit into the buffer. in that case, the returned
1056  * value will be smaller than dest. callers must check this!
1057  */
1058 char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
1059                         u32 name_len, unsigned long name_off,
1060                         struct extent_buffer *eb_in, u64 parent,
1061                         char *dest, u32 size)
1062 {
1063         int slot;
1064         u64 next_inum;
1065         int ret;
1066         s64 bytes_left = ((s64)size) - 1;
1067         struct extent_buffer *eb = eb_in;
1068         struct btrfs_key found_key;
1069         struct btrfs_inode_ref *iref;
1070
1071         if (bytes_left >= 0)
1072                 dest[bytes_left] = '\0';
1073
1074         while (1) {
1075                 bytes_left -= name_len;
1076                 if (bytes_left >= 0)
1077                         read_extent_buffer(eb, dest + bytes_left,
1078                                            name_off, name_len);
1079                 if (eb != eb_in)
1080                         free_extent_buffer(eb);
1081                 ret = inode_ref_info(parent, 0, fs_root, path, &found_key);
1082                 if (ret > 0)
1083                         ret = -ENOENT;
1084                 if (ret)
1085                         break;
1086
1087                 next_inum = found_key.offset;
1088
1089                 /* regular exit ahead */
1090                 if (parent == next_inum)
1091                         break;
1092
1093                 slot = path->slots[0];
1094                 eb = path->nodes[0];
1095                 /* make sure we can use eb after releasing the path */
1096                 if (eb != eb_in)
1097                         eb->refs++;
1098                 btrfs_release_path(path);
1099                 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1100
1101                 name_len = btrfs_inode_ref_name_len(eb, iref);
1102                 name_off = (unsigned long)(iref + 1);
1103
1104                 parent = next_inum;
1105                 --bytes_left;
1106                 if (bytes_left >= 0)
1107                         dest[bytes_left] = '/';
1108         }
1109
1110         btrfs_release_path(path);
1111
1112         if (ret)
1113                 return ERR_PTR(ret);
1114
1115         return dest + bytes_left;
1116 }
1117
1118 /*
1119  * this makes the path point to (logical EXTENT_ITEM *)
1120  * returns BTRFS_EXTENT_FLAG_DATA for data, BTRFS_EXTENT_FLAG_TREE_BLOCK for
1121  * tree blocks and <0 on error.
1122  */
1123 int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1124                         struct btrfs_path *path, struct btrfs_key *found_key,
1125                         u64 *flags_ret)
1126 {
1127         int ret;
1128         u64 flags;
1129         u64 size = 0;
1130         u32 item_size;
1131         struct extent_buffer *eb;
1132         struct btrfs_extent_item *ei;
1133         struct btrfs_key key;
1134
1135         if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1136                 key.type = BTRFS_METADATA_ITEM_KEY;
1137         else
1138                 key.type = BTRFS_EXTENT_ITEM_KEY;
1139         key.objectid = logical;
1140         key.offset = (u64)-1;
1141
1142         ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
1143         if (ret < 0)
1144                 return ret;
1145
1146         ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
1147         if (ret) {
1148                 if (ret > 0)
1149                         ret = -ENOENT;
1150                 return ret;
1151         }
1152         btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1153         if (found_key->type == BTRFS_METADATA_ITEM_KEY)
1154                 size = fs_info->nodesize;
1155         else if (found_key->type == BTRFS_EXTENT_ITEM_KEY)
1156                 size = found_key->offset;
1157
1158         if (found_key->objectid > logical ||
1159             found_key->objectid + size <= logical) {
1160                 pr_debug("logical %llu is not within any extent\n", logical);
1161                 return -ENOENT;
1162         }
1163
1164         eb = path->nodes[0];
1165         item_size = btrfs_item_size_nr(eb, path->slots[0]);
1166         BUG_ON(item_size < sizeof(*ei));
1167
1168         ei = btrfs_item_ptr(eb, path->slots[0], struct btrfs_extent_item);
1169         flags = btrfs_extent_flags(eb, ei);
1170
1171         pr_debug("logical %llu is at position %llu within the extent (%llu "
1172                  "EXTENT_ITEM %llu) flags %#llx size %u\n",
1173                  logical, logical - found_key->objectid, found_key->objectid,
1174                  found_key->offset, flags, item_size);
1175
1176         if (flags_ret) {
1177                 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1178                         *flags_ret = BTRFS_EXTENT_FLAG_TREE_BLOCK;
1179                 else if (flags & BTRFS_EXTENT_FLAG_DATA)
1180                         *flags_ret = BTRFS_EXTENT_FLAG_DATA;
1181                 else
1182                         BUG_ON(1);
1183                 return 0;
1184         } else {
1185                 WARN_ON(1);
1186                 return -EIO;
1187         }
1188 }
1189
1190 /*
1191  * helper function to iterate extent inline refs. ptr must point to a 0 value
1192  * for the first call and may be modified. it is used to track state.
1193  * if more refs exist, 0 is returned and the next call to
1194  * __get_extent_inline_ref must pass the modified ptr parameter to get the
1195  * next ref. after the last ref was processed, 1 is returned.
1196  * returns <0 on error
1197  */
1198 static int __get_extent_inline_ref(unsigned long *ptr, struct extent_buffer *eb,
1199                                    struct btrfs_key *key,
1200                                    struct btrfs_extent_item *ei, u32 item_size,
1201                                    struct btrfs_extent_inline_ref **out_eiref,
1202                                    int *out_type)
1203 {
1204         unsigned long end;
1205         u64 flags;
1206         struct btrfs_tree_block_info *info;
1207
1208         if (!*ptr) {
1209                 /* first call */
1210                 flags = btrfs_extent_flags(eb, ei);
1211                 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
1212                         if (key->type == BTRFS_METADATA_ITEM_KEY) {
1213                                 /* a skinny metadata extent */
1214                                 *out_eiref =
1215                                      (struct btrfs_extent_inline_ref *)(ei + 1);
1216                         } else {
1217                                 WARN_ON(key->type != BTRFS_EXTENT_ITEM_KEY);
1218                                 info = (struct btrfs_tree_block_info *)(ei + 1);
1219                                 *out_eiref =
1220                                    (struct btrfs_extent_inline_ref *)(info + 1);
1221                         }
1222                 } else {
1223                         *out_eiref = (struct btrfs_extent_inline_ref *)(ei + 1);
1224                 }
1225                 *ptr = (unsigned long)*out_eiref;
1226                 if ((unsigned long)(*ptr) >= (unsigned long)ei + item_size)
1227                         return -ENOENT;
1228         }
1229
1230         end = (unsigned long)ei + item_size;
1231         *out_eiref = (struct btrfs_extent_inline_ref *)(*ptr);
1232         *out_type = btrfs_extent_inline_ref_type(eb, *out_eiref);
1233
1234         *ptr += btrfs_extent_inline_ref_size(*out_type);
1235         WARN_ON(*ptr > end);
1236         if (*ptr == end)
1237                 return 1; /* last */
1238
1239         return 0;
1240 }
1241
1242 /*
1243  * reads the tree block backref for an extent. tree level and root are returned
1244  * through out_level and out_root. ptr must point to a 0 value for the first
1245  * call and may be modified (see __get_extent_inline_ref comment).
1246  * returns 0 if data was provided, 1 if there was no more data to provide or
1247  * <0 on error.
1248  */
1249 int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
1250                             struct btrfs_key *key, struct btrfs_extent_item *ei,
1251                             u32 item_size, u64 *out_root, u8 *out_level)
1252 {
1253         int ret;
1254         int type;
1255         struct btrfs_tree_block_info *info;
1256         struct btrfs_extent_inline_ref *eiref;
1257
1258         if (*ptr == (unsigned long)-1)
1259                 return 1;
1260
1261         while (1) {
1262                 ret = __get_extent_inline_ref(ptr, eb, key, ei, item_size,
1263                                               &eiref, &type);
1264                 if (ret < 0)
1265                         return ret;
1266
1267                 if (type == BTRFS_TREE_BLOCK_REF_KEY ||
1268                     type == BTRFS_SHARED_BLOCK_REF_KEY)
1269                         break;
1270
1271                 if (ret == 1)
1272                         return 1;
1273         }
1274
1275         /* we can treat both ref types equally here */
1276         info = (struct btrfs_tree_block_info *)(ei + 1);
1277         *out_root = btrfs_extent_inline_ref_offset(eb, eiref);
1278         *out_level = btrfs_tree_block_level(eb, info);
1279
1280         if (ret == 1)
1281                 *ptr = (unsigned long)-1;
1282
1283         return 0;
1284 }
1285
1286 static int iterate_leaf_refs(struct extent_inode_elem *inode_list,
1287                                 u64 root, u64 extent_item_objectid,
1288                                 iterate_extent_inodes_t *iterate, void *ctx)
1289 {
1290         struct extent_inode_elem *eie;
1291         int ret = 0;
1292
1293         for (eie = inode_list; eie; eie = eie->next) {
1294                 pr_debug("ref for %llu resolved, key (%llu EXTEND_DATA %llu), "
1295                          "root %llu\n", extent_item_objectid,
1296                          eie->inum, eie->offset, root);
1297                 ret = iterate(eie->inum, eie->offset, root, ctx);
1298                 if (ret) {
1299                         pr_debug("stopping iteration for %llu due to ret=%d\n",
1300                                  extent_item_objectid, ret);
1301                         break;
1302                 }
1303         }
1304
1305         return ret;
1306 }
1307
1308 /*
1309  * calls iterate() for every inode that references the extent identified by
1310  * the given parameters.
1311  * when the iterator function returns a non-zero value, iteration stops.
1312  */
1313 int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
1314                                 u64 extent_item_objectid, u64 extent_item_pos,
1315                                 int search_commit_root,
1316                                 iterate_extent_inodes_t *iterate, void *ctx)
1317 {
1318         int ret;
1319         struct btrfs_trans_handle *trans = NULL;
1320         struct ulist *refs = NULL;
1321         struct ulist *roots = NULL;
1322         struct ulist_node *ref_node = NULL;
1323         struct ulist_node *root_node = NULL;
1324         struct ulist_iterator ref_uiter;
1325         struct ulist_iterator root_uiter;
1326
1327         pr_debug("resolving all inodes for extent %llu\n",
1328                         extent_item_objectid);
1329
1330         ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
1331                                    0, &refs, &extent_item_pos);
1332         if (ret)
1333                 goto out;
1334
1335         ULIST_ITER_INIT(&ref_uiter);
1336         while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
1337                 ret = __btrfs_find_all_roots(trans, fs_info, ref_node->val,
1338                                              0, &roots);
1339                 if (ret)
1340                         break;
1341                 ULIST_ITER_INIT(&root_uiter);
1342                 while (!ret && (root_node = ulist_next(roots, &root_uiter))) {
1343                         pr_debug("root %llu references leaf %llu, data list "
1344                                  "%#llx\n", root_node->val, ref_node->val,
1345                                  ref_node->aux);
1346                         ret = iterate_leaf_refs((struct extent_inode_elem *)
1347                                                 (uintptr_t)ref_node->aux,
1348                                                 root_node->val,
1349                                                 extent_item_objectid,
1350                                                 iterate, ctx);
1351                 }
1352                 ulist_free(roots);
1353         }
1354
1355         free_leaf_list(refs);
1356 out:
1357         return ret;
1358 }
1359
1360 int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info,
1361                                 struct btrfs_path *path,
1362                                 iterate_extent_inodes_t *iterate, void *ctx)
1363 {
1364         int ret;
1365         u64 extent_item_pos;
1366         u64 flags = 0;
1367         struct btrfs_key found_key;
1368         int search_commit_root = 0;
1369
1370         ret = extent_from_logical(fs_info, logical, path, &found_key, &flags);
1371         btrfs_release_path(path);
1372         if (ret < 0)
1373                 return ret;
1374         if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1375                 return -EINVAL;
1376
1377         extent_item_pos = logical - found_key.objectid;
1378         ret = iterate_extent_inodes(fs_info, found_key.objectid,
1379                                         extent_item_pos, search_commit_root,
1380                                         iterate, ctx);
1381
1382         return ret;
1383 }
1384
1385 typedef int (iterate_irefs_t)(u64 parent, u32 name_len, unsigned long name_off,
1386                               struct extent_buffer *eb, void *ctx);
1387
1388 static int iterate_inode_refs(u64 inum, struct btrfs_root *fs_root,
1389                               struct btrfs_path *path,
1390                               iterate_irefs_t *iterate, void *ctx)
1391 {
1392         int ret = 0;
1393         int slot;
1394         u32 cur;
1395         u32 len;
1396         u32 name_len;
1397         u64 parent = 0;
1398         int found = 0;
1399         struct extent_buffer *eb;
1400         struct btrfs_item *item;
1401         struct btrfs_inode_ref *iref;
1402         struct btrfs_key found_key;
1403
1404         while (!ret) {
1405                 ret = inode_ref_info(inum, parent ? parent+1 : 0, fs_root, path,
1406                                      &found_key);
1407                 if (ret < 0)
1408                         break;
1409                 if (ret) {
1410                         ret = found ? 0 : -ENOENT;
1411                         break;
1412                 }
1413                 ++found;
1414
1415                 parent = found_key.offset;
1416                 slot = path->slots[0];
1417                 eb = btrfs_clone_extent_buffer(path->nodes[0]);
1418                 if (!eb) {
1419                         ret = -ENOMEM;
1420                         break;
1421                 }
1422                 extent_buffer_get(eb);
1423                 btrfs_release_path(path);
1424
1425                 item = btrfs_item_nr(slot);
1426                 iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1427
1428                 for (cur = 0; cur < btrfs_item_size(eb, item); cur += len) {
1429                         name_len = btrfs_inode_ref_name_len(eb, iref);
1430                         /* path must be released before calling iterate()! */
1431                         pr_debug("following ref at offset %u for inode %llu in "
1432                                  "tree %llu\n", cur, found_key.objectid,
1433                                  fs_root->objectid);
1434                         ret = iterate(parent, name_len,
1435                                       (unsigned long)(iref + 1), eb, ctx);
1436                         if (ret)
1437                                 break;
1438                         len = sizeof(*iref) + name_len;
1439                         iref = (struct btrfs_inode_ref *)((char *)iref + len);
1440                 }
1441                 free_extent_buffer(eb);
1442         }
1443
1444         btrfs_release_path(path);
1445
1446         return ret;
1447 }
1448
1449 static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root,
1450                                  struct btrfs_path *path,
1451                                  iterate_irefs_t *iterate, void *ctx)
1452 {
1453         int ret;
1454         int slot;
1455         u64 offset = 0;
1456         u64 parent;
1457         int found = 0;
1458         struct extent_buffer *eb;
1459         struct btrfs_inode_extref *extref;
1460         struct extent_buffer *leaf;
1461         u32 item_size;
1462         u32 cur_offset;
1463         unsigned long ptr;
1464
1465         while (1) {
1466                 ret = btrfs_find_one_extref(fs_root, inum, offset, path, &extref,
1467                                             &offset);
1468                 if (ret < 0)
1469                         break;
1470                 if (ret) {
1471                         ret = found ? 0 : -ENOENT;
1472                         break;
1473                 }
1474                 ++found;
1475
1476                 slot = path->slots[0];
1477                 eb = btrfs_clone_extent_buffer(path->nodes[0]);
1478                 if (!eb) {
1479                         ret = -ENOMEM;
1480                         break;
1481                 }
1482                 extent_buffer_get(eb);
1483
1484                 btrfs_release_path(path);
1485
1486                 leaf = path->nodes[0];
1487                 item_size = btrfs_item_size_nr(leaf, slot);
1488                 ptr = btrfs_item_ptr_offset(leaf, slot);
1489                 cur_offset = 0;
1490
1491                 while (cur_offset < item_size) {
1492                         u32 name_len;
1493
1494                         extref = (struct btrfs_inode_extref *)(ptr + cur_offset);
1495                         parent = btrfs_inode_extref_parent(eb, extref);
1496                         name_len = btrfs_inode_extref_name_len(eb, extref);
1497                         ret = iterate(parent, name_len,
1498                                       (unsigned long)&extref->name, eb, ctx);
1499                         if (ret)
1500                                 break;
1501
1502                         cur_offset += btrfs_inode_extref_name_len(leaf, extref);
1503                         cur_offset += sizeof(*extref);
1504                 }
1505                 free_extent_buffer(eb);
1506
1507                 offset++;
1508         }
1509
1510         btrfs_release_path(path);
1511
1512         return ret;
1513 }
1514
1515 static int iterate_irefs(u64 inum, struct btrfs_root *fs_root,
1516                          struct btrfs_path *path, iterate_irefs_t *iterate,
1517                          void *ctx)
1518 {
1519         int ret;
1520         int found_refs = 0;
1521
1522         ret = iterate_inode_refs(inum, fs_root, path, iterate, ctx);
1523         if (!ret)
1524                 ++found_refs;
1525         else if (ret != -ENOENT)
1526                 return ret;
1527
1528         ret = iterate_inode_extrefs(inum, fs_root, path, iterate, ctx);
1529         if (ret == -ENOENT && found_refs)
1530                 return 0;
1531
1532         return ret;
1533 }
1534
1535 /*
1536  * returns 0 if the path could be dumped (probably truncated)
1537  * returns <0 in case of an error
1538  */
1539 static int inode_to_path(u64 inum, u32 name_len, unsigned long name_off,
1540                          struct extent_buffer *eb, void *ctx)
1541 {
1542         struct inode_fs_paths *ipath = ctx;
1543         char *fspath;
1544         char *fspath_min;
1545         int i = ipath->fspath->elem_cnt;
1546         const int s_ptr = sizeof(char *);
1547         u32 bytes_left;
1548
1549         bytes_left = ipath->fspath->bytes_left > s_ptr ?
1550                                         ipath->fspath->bytes_left - s_ptr : 0;
1551
1552         fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr;
1553         fspath = btrfs_ref_to_path(ipath->fs_root, ipath->btrfs_path, name_len,
1554                                    name_off, eb, inum, fspath_min, bytes_left);
1555         if (IS_ERR(fspath))
1556                 return PTR_ERR(fspath);
1557
1558         if (fspath > fspath_min) {
1559                 ipath->fspath->val[i] = (u64)(unsigned long)fspath;
1560                 ++ipath->fspath->elem_cnt;
1561                 ipath->fspath->bytes_left = fspath - fspath_min;
1562         } else {
1563                 ++ipath->fspath->elem_missed;
1564                 ipath->fspath->bytes_missing += fspath_min - fspath;
1565                 ipath->fspath->bytes_left = 0;
1566         }
1567
1568         return 0;
1569 }
1570
1571 /*
1572  * this dumps all file system paths to the inode into the ipath struct, provided
1573  * is has been created large enough. each path is zero-terminated and accessed
1574  * from ipath->fspath->val[i].
1575  * when it returns, there are ipath->fspath->elem_cnt number of paths available
1576  * in ipath->fspath->val[]. When the allocated space wasn't sufficient, the
1577  * number of missed paths is recorded in ipath->fspath->elem_missed, otherwise,
1578  * it's zero. ipath->fspath->bytes_missing holds the number of bytes that would
1579  * have been needed to return all paths.
1580  */
1581 int paths_from_inode(u64 inum, struct inode_fs_paths *ipath)
1582 {
1583         return iterate_irefs(inum, ipath->fs_root, ipath->btrfs_path,
1584                              inode_to_path, ipath);
1585 }
1586
1587 struct btrfs_data_container *init_data_container(u32 total_bytes)
1588 {
1589         struct btrfs_data_container *data;
1590         size_t alloc_bytes;
1591
1592         alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
1593         data = vmalloc(alloc_bytes);
1594         if (!data)
1595                 return ERR_PTR(-ENOMEM);
1596
1597         if (total_bytes >= sizeof(*data)) {
1598                 data->bytes_left = total_bytes - sizeof(*data);
1599                 data->bytes_missing = 0;
1600         } else {
1601                 data->bytes_missing = sizeof(*data) - total_bytes;
1602                 data->bytes_left = 0;
1603         }
1604
1605         data->elem_cnt = 0;
1606         data->elem_missed = 0;
1607
1608         return data;
1609 }
1610
1611 /*
1612  * allocates space to return multiple file system paths for an inode.
1613  * total_bytes to allocate are passed, note that space usable for actual path
1614  * information will be total_bytes - sizeof(struct inode_fs_paths).
1615  * the returned pointer must be freed with free_ipath() in the end.
1616  */
1617 struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
1618                                         struct btrfs_path *path)
1619 {
1620         struct inode_fs_paths *ifp;
1621         struct btrfs_data_container *fspath;
1622
1623         fspath = init_data_container(total_bytes);
1624         if (IS_ERR(fspath))
1625                 return (void *)fspath;
1626
1627         ifp = kmalloc(sizeof(*ifp), GFP_NOFS);
1628         if (!ifp) {
1629                 kfree(fspath);
1630                 return ERR_PTR(-ENOMEM);
1631         }
1632
1633         ifp->btrfs_path = path;
1634         ifp->fspath = fspath;
1635         ifp->fs_root = fs_root;
1636
1637         return ifp;
1638 }
1639
1640 void free_ipath(struct inode_fs_paths *ipath)
1641 {
1642         if (!ipath)
1643                 return;
1644         vfree(ipath->fspath);
1645         kfree(ipath);
1646 }