LCOV - code coverage report
Current view: top level - fs/btrfs - backref.c (source / functions) Hit Total Coverage
Test: btrfstest.info Lines: 549 698 78.7 %
Date: 2014-11-28 Functions: 31 36 86.1 %

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

Generated by: LCOV version 1.10