LCOV - code coverage report
Current view: top level - fs/btrfs - relocation.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1891 0.0 %
Date: 2014-04-16 Functions: 0 79 0.0 %
Branches: 0 1522 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 2009 Oracle.  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/sched.h>
      20                 :            : #include <linux/pagemap.h>
      21                 :            : #include <linux/writeback.h>
      22                 :            : #include <linux/blkdev.h>
      23                 :            : #include <linux/rbtree.h>
      24                 :            : #include <linux/slab.h>
      25                 :            : #include "ctree.h"
      26                 :            : #include "disk-io.h"
      27                 :            : #include "transaction.h"
      28                 :            : #include "volumes.h"
      29                 :            : #include "locking.h"
      30                 :            : #include "btrfs_inode.h"
      31                 :            : #include "async-thread.h"
      32                 :            : #include "free-space-cache.h"
      33                 :            : #include "inode-map.h"
      34                 :            : 
      35                 :            : /*
      36                 :            :  * backref_node, mapping_node and tree_block start with this
      37                 :            :  */
      38                 :            : struct tree_entry {
      39                 :            :         struct rb_node rb_node;
      40                 :            :         u64 bytenr;
      41                 :            : };
      42                 :            : 
      43                 :            : /*
      44                 :            :  * present a tree block in the backref cache
      45                 :            :  */
      46                 :            : struct backref_node {
      47                 :            :         struct rb_node rb_node;
      48                 :            :         u64 bytenr;
      49                 :            : 
      50                 :            :         u64 new_bytenr;
      51                 :            :         /* objectid of tree block owner, can be not uptodate */
      52                 :            :         u64 owner;
      53                 :            :         /* link to pending, changed or detached list */
      54                 :            :         struct list_head list;
      55                 :            :         /* list of upper level blocks reference this block */
      56                 :            :         struct list_head upper;
      57                 :            :         /* list of child blocks in the cache */
      58                 :            :         struct list_head lower;
      59                 :            :         /* NULL if this node is not tree root */
      60                 :            :         struct btrfs_root *root;
      61                 :            :         /* extent buffer got by COW the block */
      62                 :            :         struct extent_buffer *eb;
      63                 :            :         /* level of tree block */
      64                 :            :         unsigned int level:8;
      65                 :            :         /* is the block in non-reference counted tree */
      66                 :            :         unsigned int cowonly:1;
      67                 :            :         /* 1 if no child node in the cache */
      68                 :            :         unsigned int lowest:1;
      69                 :            :         /* is the extent buffer locked */
      70                 :            :         unsigned int locked:1;
      71                 :            :         /* has the block been processed */
      72                 :            :         unsigned int processed:1;
      73                 :            :         /* have backrefs of this block been checked */
      74                 :            :         unsigned int checked:1;
      75                 :            :         /*
      76                 :            :          * 1 if corresponding block has been cowed but some upper
      77                 :            :          * level block pointers may not point to the new location
      78                 :            :          */
      79                 :            :         unsigned int pending:1;
      80                 :            :         /*
      81                 :            :          * 1 if the backref node isn't connected to any other
      82                 :            :          * backref node.
      83                 :            :          */
      84                 :            :         unsigned int detached:1;
      85                 :            : };
      86                 :            : 
      87                 :            : /*
      88                 :            :  * present a block pointer in the backref cache
      89                 :            :  */
      90                 :            : struct backref_edge {
      91                 :            :         struct list_head list[2];
      92                 :            :         struct backref_node *node[2];
      93                 :            : };
      94                 :            : 
      95                 :            : #define LOWER   0
      96                 :            : #define UPPER   1
      97                 :            : #define RELOCATION_RESERVED_NODES       256
      98                 :            : 
      99                 :            : struct backref_cache {
     100                 :            :         /* red black tree of all backref nodes in the cache */
     101                 :            :         struct rb_root rb_root;
     102                 :            :         /* for passing backref nodes to btrfs_reloc_cow_block */
     103                 :            :         struct backref_node *path[BTRFS_MAX_LEVEL];
     104                 :            :         /*
     105                 :            :          * list of blocks that have been cowed but some block
     106                 :            :          * pointers in upper level blocks may not reflect the
     107                 :            :          * new location
     108                 :            :          */
     109                 :            :         struct list_head pending[BTRFS_MAX_LEVEL];
     110                 :            :         /* list of backref nodes with no child node */
     111                 :            :         struct list_head leaves;
     112                 :            :         /* list of blocks that have been cowed in current transaction */
     113                 :            :         struct list_head changed;
     114                 :            :         /* list of detached backref node. */
     115                 :            :         struct list_head detached;
     116                 :            : 
     117                 :            :         u64 last_trans;
     118                 :            : 
     119                 :            :         int nr_nodes;
     120                 :            :         int nr_edges;
     121                 :            : };
     122                 :            : 
     123                 :            : /*
     124                 :            :  * map address of tree root to tree
     125                 :            :  */
     126                 :            : struct mapping_node {
     127                 :            :         struct rb_node rb_node;
     128                 :            :         u64 bytenr;
     129                 :            :         void *data;
     130                 :            : };
     131                 :            : 
     132                 :            : struct mapping_tree {
     133                 :            :         struct rb_root rb_root;
     134                 :            :         spinlock_t lock;
     135                 :            : };
     136                 :            : 
     137                 :            : /*
     138                 :            :  * present a tree block to process
     139                 :            :  */
     140                 :            : struct tree_block {
     141                 :            :         struct rb_node rb_node;
     142                 :            :         u64 bytenr;
     143                 :            :         struct btrfs_key key;
     144                 :            :         unsigned int level:8;
     145                 :            :         unsigned int key_ready:1;
     146                 :            : };
     147                 :            : 
     148                 :            : #define MAX_EXTENTS 128
     149                 :            : 
     150                 :            : struct file_extent_cluster {
     151                 :            :         u64 start;
     152                 :            :         u64 end;
     153                 :            :         u64 boundary[MAX_EXTENTS];
     154                 :            :         unsigned int nr;
     155                 :            : };
     156                 :            : 
     157                 :            : struct reloc_control {
     158                 :            :         /* block group to relocate */
     159                 :            :         struct btrfs_block_group_cache *block_group;
     160                 :            :         /* extent tree */
     161                 :            :         struct btrfs_root *extent_root;
     162                 :            :         /* inode for moving data */
     163                 :            :         struct inode *data_inode;
     164                 :            : 
     165                 :            :         struct btrfs_block_rsv *block_rsv;
     166                 :            : 
     167                 :            :         struct backref_cache backref_cache;
     168                 :            : 
     169                 :            :         struct file_extent_cluster cluster;
     170                 :            :         /* tree blocks have been processed */
     171                 :            :         struct extent_io_tree processed_blocks;
     172                 :            :         /* map start of tree root to corresponding reloc tree */
     173                 :            :         struct mapping_tree reloc_root_tree;
     174                 :            :         /* list of reloc trees */
     175                 :            :         struct list_head reloc_roots;
     176                 :            :         /* size of metadata reservation for merging reloc trees */
     177                 :            :         u64 merging_rsv_size;
     178                 :            :         /* size of relocated tree nodes */
     179                 :            :         u64 nodes_relocated;
     180                 :            :         /* reserved size for block group relocation*/
     181                 :            :         u64 reserved_bytes;
     182                 :            : 
     183                 :            :         u64 search_start;
     184                 :            :         u64 extents_found;
     185                 :            : 
     186                 :            :         unsigned int stage:8;
     187                 :            :         unsigned int create_reloc_tree:1;
     188                 :            :         unsigned int merge_reloc_tree:1;
     189                 :            :         unsigned int found_file_extent:1;
     190                 :            : };
     191                 :            : 
     192                 :            : /* stages of data relocation */
     193                 :            : #define MOVE_DATA_EXTENTS       0
     194                 :            : #define UPDATE_DATA_PTRS        1
     195                 :            : 
     196                 :            : static void remove_backref_node(struct backref_cache *cache,
     197                 :            :                                 struct backref_node *node);
     198                 :            : static void __mark_block_processed(struct reloc_control *rc,
     199                 :            :                                    struct backref_node *node);
     200                 :            : 
     201                 :            : static void mapping_tree_init(struct mapping_tree *tree)
     202                 :            : {
     203                 :          0 :         tree->rb_root = RB_ROOT;
     204                 :          0 :         spin_lock_init(&tree->lock);
     205                 :            : }
     206                 :            : 
     207                 :            : static void backref_cache_init(struct backref_cache *cache)
     208                 :            : {
     209                 :            :         int i;
     210                 :          0 :         cache->rb_root = RB_ROOT;
     211         [ #  # ]:          0 :         for (i = 0; i < BTRFS_MAX_LEVEL; i++)
     212                 :          0 :                 INIT_LIST_HEAD(&cache->pending[i]);
     213                 :          0 :         INIT_LIST_HEAD(&cache->changed);
     214                 :          0 :         INIT_LIST_HEAD(&cache->detached);
     215                 :          0 :         INIT_LIST_HEAD(&cache->leaves);
     216                 :            : }
     217                 :            : 
     218                 :          0 : static void backref_cache_cleanup(struct backref_cache *cache)
     219                 :            : {
     220                 :            :         struct backref_node *node;
     221                 :            :         int i;
     222                 :            : 
     223         [ #  # ]:          0 :         while (!list_empty(&cache->detached)) {
     224                 :          0 :                 node = list_entry(cache->detached.next,
     225                 :            :                                   struct backref_node, list);
     226                 :          0 :                 remove_backref_node(cache, node);
     227                 :            :         }
     228                 :            : 
     229         [ #  # ]:          0 :         while (!list_empty(&cache->leaves)) {
     230                 :          0 :                 node = list_entry(cache->leaves.next,
     231                 :            :                                   struct backref_node, lower);
     232                 :          0 :                 remove_backref_node(cache, node);
     233                 :            :         }
     234                 :            : 
     235                 :          0 :         cache->last_trans = 0;
     236                 :            : 
     237         [ #  # ]:          0 :         for (i = 0; i < BTRFS_MAX_LEVEL; i++)
     238         [ #  # ]:          0 :                 BUG_ON(!list_empty(&cache->pending[i]));
     239         [ #  # ]:          0 :         BUG_ON(!list_empty(&cache->changed));
     240         [ #  # ]:          0 :         BUG_ON(!list_empty(&cache->detached));
     241         [ #  # ]:          0 :         BUG_ON(!RB_EMPTY_ROOT(&cache->rb_root));
     242         [ #  # ]:          0 :         BUG_ON(cache->nr_nodes);
     243         [ #  # ]:          0 :         BUG_ON(cache->nr_edges);
     244                 :          0 : }
     245                 :            : 
     246                 :          0 : static struct backref_node *alloc_backref_node(struct backref_cache *cache)
     247                 :            : {
     248                 :            :         struct backref_node *node;
     249                 :            : 
     250                 :            :         node = kzalloc(sizeof(*node), GFP_NOFS);
     251         [ #  # ]:          0 :         if (node) {
     252                 :          0 :                 INIT_LIST_HEAD(&node->list);
     253                 :          0 :                 INIT_LIST_HEAD(&node->upper);
     254                 :          0 :                 INIT_LIST_HEAD(&node->lower);
     255                 :          0 :                 RB_CLEAR_NODE(&node->rb_node);
     256                 :          0 :                 cache->nr_nodes++;
     257                 :            :         }
     258                 :          0 :         return node;
     259                 :            : }
     260                 :            : 
     261                 :            : static void free_backref_node(struct backref_cache *cache,
     262                 :            :                               struct backref_node *node)
     263                 :            : {
     264   [ #  #  #  # ]:          0 :         if (node) {
         [ #  # ][ #  # ]
     265                 :          0 :                 cache->nr_nodes--;
     266                 :          0 :                 kfree(node);
     267                 :            :         }
     268                 :            : }
     269                 :            : 
     270                 :          0 : static struct backref_edge *alloc_backref_edge(struct backref_cache *cache)
     271                 :            : {
     272                 :            :         struct backref_edge *edge;
     273                 :            : 
     274                 :            :         edge = kzalloc(sizeof(*edge), GFP_NOFS);
     275         [ #  # ]:          0 :         if (edge)
     276                 :          0 :                 cache->nr_edges++;
     277                 :          0 :         return edge;
     278                 :            : }
     279                 :            : 
     280                 :            : static void free_backref_edge(struct backref_cache *cache,
     281                 :            :                               struct backref_edge *edge)
     282                 :            : {
     283 [ #  # ][ #  # ]:          0 :         if (edge) {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     284                 :          0 :                 cache->nr_edges--;
     285                 :          0 :                 kfree(edge);
     286                 :            :         }
     287                 :            : }
     288                 :            : 
     289                 :          0 : static struct rb_node *tree_insert(struct rb_root *root, u64 bytenr,
     290                 :            :                                    struct rb_node *node)
     291                 :            : {
     292                 :          0 :         struct rb_node **p = &root->rb_node;
     293                 :            :         struct rb_node *parent = NULL;
     294                 :            :         struct tree_entry *entry;
     295                 :            : 
     296         [ #  # ]:          0 :         while (*p) {
     297                 :            :                 parent = *p;
     298                 :            :                 entry = rb_entry(parent, struct tree_entry, rb_node);
     299                 :            : 
     300         [ #  # ]:          0 :                 if (bytenr < entry->bytenr)
     301                 :          0 :                         p = &(*p)->rb_left;
     302         [ #  # ]:          0 :                 else if (bytenr > entry->bytenr)
     303                 :          0 :                         p = &(*p)->rb_right;
     304                 :            :                 else
     305                 :            :                         return parent;
     306                 :            :         }
     307                 :            : 
     308                 :            :         rb_link_node(node, parent, p);
     309                 :          0 :         rb_insert_color(node, root);
     310                 :          0 :         return NULL;
     311                 :            : }
     312                 :            : 
     313                 :            : static struct rb_node *tree_search(struct rb_root *root, u64 bytenr)
     314                 :            : {
     315                 :          0 :         struct rb_node *n = root->rb_node;
     316                 :            :         struct tree_entry *entry;
     317                 :            : 
     318 [ #  # ][ #  # ]:          0 :         while (n) {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     319                 :            :                 entry = rb_entry(n, struct tree_entry, rb_node);
     320                 :            : 
     321 [ #  # ][ #  # ]:          0 :                 if (bytenr < entry->bytenr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     322                 :          0 :                         n = n->rb_left;
     323 [ #  # ][ #  # ]:          0 :                 else if (bytenr > entry->bytenr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     324                 :          0 :                         n = n->rb_right;
     325                 :            :                 else
     326                 :            :                         return n;
     327                 :            :         }
     328                 :            :         return NULL;
     329                 :            : }
     330                 :            : 
     331                 :          0 : static void backref_tree_panic(struct rb_node *rb_node, int errno, u64 bytenr)
     332                 :            : {
     333                 :            : 
     334                 :            :         struct btrfs_fs_info *fs_info = NULL;
     335                 :            :         struct backref_node *bnode = rb_entry(rb_node, struct backref_node,
     336                 :            :                                               rb_node);
     337         [ #  # ]:          0 :         if (bnode->root)
     338                 :          0 :                 fs_info = bnode->root->fs_info;
     339                 :          0 :         btrfs_panic(fs_info, errno, "Inconsistency in backref cache "
     340                 :            :                     "found at offset %llu\n", bytenr);
     341                 :            : }
     342                 :            : 
     343                 :            : /*
     344                 :            :  * walk up backref nodes until reach node presents tree root
     345                 :            :  */
     346                 :          0 : static struct backref_node *walk_up_backref(struct backref_node *node,
     347                 :            :                                             struct backref_edge *edges[],
     348                 :            :                                             int *index)
     349                 :            : {
     350                 :            :         struct backref_edge *edge;
     351                 :          0 :         int idx = *index;
     352                 :            : 
     353         [ #  # ]:          0 :         while (!list_empty(&node->upper)) {
     354                 :            :                 edge = list_entry(node->upper.next,
     355                 :            :                                   struct backref_edge, list[LOWER]);
     356                 :          0 :                 edges[idx++] = edge;
     357                 :          0 :                 node = edge->node[UPPER];
     358                 :            :         }
     359         [ #  # ]:          0 :         BUG_ON(node->detached);
     360                 :          0 :         *index = idx;
     361                 :          0 :         return node;
     362                 :            : }
     363                 :            : 
     364                 :            : /*
     365                 :            :  * walk down backref nodes to find start of next reference path
     366                 :            :  */
     367                 :            : static struct backref_node *walk_down_backref(struct backref_edge *edges[],
     368                 :            :                                               int *index)
     369                 :            : {
     370                 :            :         struct backref_edge *edge;
     371                 :            :         struct backref_node *lower;
     372                 :          0 :         int idx = *index;
     373                 :            : 
     374 [ #  # ][ #  # ]:          0 :         while (idx > 0) {
         [ #  # ][ #  # ]
     375                 :          0 :                 edge = edges[idx - 1];
     376                 :          0 :                 lower = edge->node[LOWER];
     377 [ #  # ][ #  # ]:          0 :                 if (list_is_last(&edge->list[LOWER], &lower->upper)) {
         [ #  # ][ #  # ]
     378                 :          0 :                         idx--;
     379                 :          0 :                         continue;
     380                 :            :                 }
     381                 :            :                 edge = list_entry(edge->list[LOWER].next,
     382                 :            :                                   struct backref_edge, list[LOWER]);
     383                 :          0 :                 edges[idx - 1] = edge;
     384                 :          0 :                 *index = idx;
     385                 :          0 :                 return edge->node[UPPER];
     386                 :            :         }
     387                 :          0 :         *index = 0;
     388                 :            :         return NULL;
     389                 :            : }
     390                 :            : 
     391                 :            : static void unlock_node_buffer(struct backref_node *node)
     392                 :            : {
     393 [ #  # ][ #  # ]:          0 :         if (node->locked) {
     394                 :          0 :                 btrfs_tree_unlock(node->eb);
     395                 :          0 :                 node->locked = 0;
     396                 :            :         }
     397                 :            : }
     398                 :            : 
     399                 :          0 : static void drop_node_buffer(struct backref_node *node)
     400                 :            : {
     401         [ #  # ]:          0 :         if (node->eb) {
     402                 :            :                 unlock_node_buffer(node);
     403                 :          0 :                 free_extent_buffer(node->eb);
     404                 :          0 :                 node->eb = NULL;
     405                 :            :         }
     406                 :          0 : }
     407                 :            : 
     408                 :          0 : static void drop_backref_node(struct backref_cache *tree,
     409                 :            :                               struct backref_node *node)
     410                 :            : {
     411         [ #  # ]:          0 :         BUG_ON(!list_empty(&node->upper));
     412                 :            : 
     413                 :          0 :         drop_node_buffer(node);
     414                 :            :         list_del(&node->list);
     415                 :            :         list_del(&node->lower);
     416         [ #  # ]:          0 :         if (!RB_EMPTY_NODE(&node->rb_node))
     417                 :          0 :                 rb_erase(&node->rb_node, &tree->rb_root);
     418                 :            :         free_backref_node(tree, node);
     419                 :          0 : }
     420                 :            : 
     421                 :            : /*
     422                 :            :  * remove a backref node from the backref cache
     423                 :            :  */
     424                 :          0 : static void remove_backref_node(struct backref_cache *cache,
     425                 :            :                                 struct backref_node *node)
     426                 :            : {
     427                 :            :         struct backref_node *upper;
     428                 :            :         struct backref_edge *edge;
     429                 :            : 
     430         [ #  # ]:          0 :         if (!node)
     431                 :          0 :                 return;
     432                 :            : 
     433         [ #  # ]:          0 :         BUG_ON(!node->lowest && !node->detached);
     434         [ #  # ]:          0 :         while (!list_empty(&node->upper)) {
     435                 :            :                 edge = list_entry(node->upper.next, struct backref_edge,
     436                 :            :                                   list[LOWER]);
     437                 :          0 :                 upper = edge->node[UPPER];
     438                 :            :                 list_del(&edge->list[LOWER]);
     439                 :            :                 list_del(&edge->list[UPPER]);
     440                 :            :                 free_backref_edge(cache, edge);
     441                 :            : 
     442         [ #  # ]:          0 :                 if (RB_EMPTY_NODE(&upper->rb_node)) {
     443         [ #  # ]:          0 :                         BUG_ON(!list_empty(&node->upper));
     444                 :          0 :                         drop_backref_node(cache, node);
     445                 :            :                         node = upper;
     446                 :          0 :                         node->lowest = 1;
     447                 :          0 :                         continue;
     448                 :            :                 }
     449                 :            :                 /*
     450                 :            :                  * add the node to leaf node list if no other
     451                 :            :                  * child block cached.
     452                 :            :                  */
     453         [ #  # ]:          0 :                 if (list_empty(&upper->lower)) {
     454                 :          0 :                         list_add_tail(&upper->lower, &cache->leaves);
     455                 :          0 :                         upper->lowest = 1;
     456                 :            :                 }
     457                 :            :         }
     458                 :            : 
     459                 :          0 :         drop_backref_node(cache, node);
     460                 :            : }
     461                 :            : 
     462                 :          0 : static void update_backref_node(struct backref_cache *cache,
     463                 :            :                                 struct backref_node *node, u64 bytenr)
     464                 :            : {
     465                 :            :         struct rb_node *rb_node;
     466                 :          0 :         rb_erase(&node->rb_node, &cache->rb_root);
     467                 :          0 :         node->bytenr = bytenr;
     468                 :          0 :         rb_node = tree_insert(&cache->rb_root, node->bytenr, &node->rb_node);
     469         [ #  # ]:          0 :         if (rb_node)
     470                 :          0 :                 backref_tree_panic(rb_node, -EEXIST, bytenr);
     471                 :          0 : }
     472                 :            : 
     473                 :            : /*
     474                 :            :  * update backref cache after a transaction commit
     475                 :            :  */
     476                 :          0 : static int update_backref_cache(struct btrfs_trans_handle *trans,
     477                 :            :                                 struct backref_cache *cache)
     478                 :            : {
     479                 :            :         struct backref_node *node;
     480                 :            :         int level = 0;
     481                 :            : 
     482         [ #  # ]:          0 :         if (cache->last_trans == 0) {
     483                 :          0 :                 cache->last_trans = trans->transid;
     484                 :            :                 return 0;
     485                 :            :         }
     486                 :            : 
     487         [ #  # ]:          0 :         if (cache->last_trans == trans->transid)
     488                 :            :                 return 0;
     489                 :            : 
     490                 :            :         /*
     491                 :            :          * detached nodes are used to avoid unnecessary backref
     492                 :            :          * lookup. transaction commit changes the extent tree.
     493                 :            :          * so the detached nodes are no longer useful.
     494                 :            :          */
     495         [ #  # ]:          0 :         while (!list_empty(&cache->detached)) {
     496                 :          0 :                 node = list_entry(cache->detached.next,
     497                 :            :                                   struct backref_node, list);
     498                 :          0 :                 remove_backref_node(cache, node);
     499                 :            :         }
     500                 :            : 
     501         [ #  # ]:          0 :         while (!list_empty(&cache->changed)) {
     502                 :          0 :                 node = list_entry(cache->changed.next,
     503                 :            :                                   struct backref_node, list);
     504                 :          0 :                 list_del_init(&node->list);
     505         [ #  # ]:          0 :                 BUG_ON(node->pending);
     506                 :          0 :                 update_backref_node(cache, node, node->new_bytenr);
     507                 :            :         }
     508                 :            : 
     509                 :            :         /*
     510                 :            :          * some nodes can be left in the pending list if there were
     511                 :            :          * errors during processing the pending nodes.
     512                 :            :          */
     513         [ #  # ]:          0 :         for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
     514         [ #  # ]:          0 :                 list_for_each_entry(node, &cache->pending[level], list) {
     515         [ #  # ]:          0 :                         BUG_ON(!node->pending);
     516         [ #  # ]:          0 :                         if (node->bytenr == node->new_bytenr)
     517                 :          0 :                                 continue;
     518                 :          0 :                         update_backref_node(cache, node, node->new_bytenr);
     519                 :            :                 }
     520                 :            :         }
     521                 :            : 
     522                 :          0 :         cache->last_trans = 0;
     523                 :            :         return 1;
     524                 :            : }
     525                 :            : 
     526                 :            : 
     527                 :            : static int should_ignore_root(struct btrfs_root *root)
     528                 :            : {
     529                 :            :         struct btrfs_root *reloc_root;
     530                 :            : 
     531 [ #  # ][ #  # ]:          0 :         if (!root->ref_cows)
                 [ #  # ]
     532                 :            :                 return 0;
     533                 :            : 
     534                 :          0 :         reloc_root = root->reloc_root;
     535 [ #  # ][ #  # ]:          0 :         if (!reloc_root)
                 [ #  # ]
     536                 :            :                 return 0;
     537                 :            : 
     538 [ #  # ][ #  # ]:          0 :         if (btrfs_root_last_snapshot(&reloc_root->root_item) ==
                 [ #  # ]
     539                 :          0 :             root->fs_info->running_transaction->transid - 1)
     540                 :            :                 return 0;
     541                 :            :         /*
     542                 :            :          * if there is reloc tree and it was created in previous
     543                 :            :          * transaction backref lookup can find the reloc tree,
     544                 :            :          * so backref node for the fs tree root is useless for
     545                 :            :          * relocation.
     546                 :            :          */
     547                 :            :         return 1;
     548                 :            : }
     549                 :            : /*
     550                 :            :  * find reloc tree by address of tree root
     551                 :            :  */
     552                 :          0 : static struct btrfs_root *find_reloc_root(struct reloc_control *rc,
     553                 :            :                                           u64 bytenr)
     554                 :            : {
     555                 :            :         struct rb_node *rb_node;
     556                 :            :         struct mapping_node *node;
     557                 :            :         struct btrfs_root *root = NULL;
     558                 :            : 
     559                 :            :         spin_lock(&rc->reloc_root_tree.lock);
     560                 :            :         rb_node = tree_search(&rc->reloc_root_tree.rb_root, bytenr);
     561         [ #  # ]:          0 :         if (rb_node) {
     562                 :            :                 node = rb_entry(rb_node, struct mapping_node, rb_node);
     563                 :          0 :                 root = (struct btrfs_root *)node->data;
     564                 :            :         }
     565                 :            :         spin_unlock(&rc->reloc_root_tree.lock);
     566                 :          0 :         return root;
     567                 :            : }
     568                 :            : 
     569                 :            : static int is_cowonly_root(u64 root_objectid)
     570                 :            : {
     571 [ #  # ][ #  # ]:          0 :         if (root_objectid == BTRFS_ROOT_TREE_OBJECTID ||
     572                 :            :             root_objectid == BTRFS_EXTENT_TREE_OBJECTID ||
     573                 :          0 :             root_objectid == BTRFS_CHUNK_TREE_OBJECTID ||
     574                 :          0 :             root_objectid == BTRFS_DEV_TREE_OBJECTID ||
     575                 :          0 :             root_objectid == BTRFS_TREE_LOG_OBJECTID ||
     576 [ #  # ][ #  # ]:          0 :             root_objectid == BTRFS_CSUM_TREE_OBJECTID ||
     577 [ #  # ][ #  # ]:          0 :             root_objectid == BTRFS_UUID_TREE_OBJECTID ||
     578                 :            :             root_objectid == BTRFS_QUOTA_TREE_OBJECTID)
     579                 :            :                 return 1;
     580                 :            :         return 0;
     581                 :            : }
     582                 :            : 
     583                 :          0 : static struct btrfs_root *read_fs_root(struct btrfs_fs_info *fs_info,
     584                 :            :                                         u64 root_objectid)
     585                 :            : {
     586                 :            :         struct btrfs_key key;
     587                 :            : 
     588                 :          0 :         key.objectid = root_objectid;
     589                 :          0 :         key.type = BTRFS_ROOT_ITEM_KEY;
     590         [ #  # ]:          0 :         if (is_cowonly_root(root_objectid))
     591                 :          0 :                 key.offset = 0;
     592                 :            :         else
     593                 :          0 :                 key.offset = (u64)-1;
     594                 :            : 
     595                 :          0 :         return btrfs_get_fs_root(fs_info, &key, false);
     596                 :            : }
     597                 :            : 
     598                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
     599                 :            : static noinline_for_stack
     600                 :          0 : struct btrfs_root *find_tree_root(struct reloc_control *rc,
     601                 :            :                                   struct extent_buffer *leaf,
     602                 :            :                                   struct btrfs_extent_ref_v0 *ref0)
     603                 :            : {
     604                 :            :         struct btrfs_root *root;
     605                 :            :         u64 root_objectid = btrfs_ref_root_v0(leaf, ref0);
     606                 :            :         u64 generation = btrfs_ref_generation_v0(leaf, ref0);
     607                 :            : 
     608         [ #  # ]:          0 :         BUG_ON(root_objectid == BTRFS_TREE_RELOC_OBJECTID);
     609                 :            : 
     610                 :          0 :         root = read_fs_root(rc->extent_root->fs_info, root_objectid);
     611         [ #  # ]:          0 :         BUG_ON(IS_ERR(root));
     612                 :            : 
     613 [ #  # ][ #  # ]:          0 :         if (root->ref_cows &&
     614                 :            :             generation != btrfs_root_generation(&root->root_item))
     615                 :            :                 return NULL;
     616                 :            : 
     617                 :            :         return root;
     618                 :            : }
     619                 :            : #endif
     620                 :            : 
     621                 :            : static noinline_for_stack
     622                 :          0 : int find_inline_backref(struct extent_buffer *leaf, int slot,
     623                 :            :                         unsigned long *ptr, unsigned long *end)
     624                 :            : {
     625                 :            :         struct btrfs_key key;
     626                 :            :         struct btrfs_extent_item *ei;
     627                 :            :         struct btrfs_tree_block_info *bi;
     628                 :            :         u32 item_size;
     629                 :            : 
     630                 :            :         btrfs_item_key_to_cpu(leaf, &key, slot);
     631                 :            : 
     632                 :            :         item_size = btrfs_item_size_nr(leaf, slot);
     633                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
     634         [ #  # ]:          0 :         if (item_size < sizeof(*ei)) {
     635         [ #  # ]:          0 :                 WARN_ON(item_size != sizeof(struct btrfs_extent_item_v0));
     636                 :            :                 return 1;
     637                 :            :         }
     638                 :            : #endif
     639                 :          0 :         ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
     640         [ #  # ]:          0 :         WARN_ON(!(btrfs_extent_flags(leaf, ei) &
     641                 :            :                   BTRFS_EXTENT_FLAG_TREE_BLOCK));
     642                 :            : 
     643 [ #  # ][ #  # ]:          0 :         if (key.type == BTRFS_EXTENT_ITEM_KEY &&
     644                 :            :             item_size <= sizeof(*ei) + sizeof(*bi)) {
     645         [ #  # ]:          0 :                 WARN_ON(item_size < sizeof(*ei) + sizeof(*bi));
     646                 :            :                 return 1;
     647                 :            :         }
     648 [ #  # ][ #  # ]:          0 :         if (key.type == BTRFS_METADATA_ITEM_KEY &&
     649                 :            :             item_size <= sizeof(*ei)) {
     650         [ #  # ]:          0 :                 WARN_ON(item_size < sizeof(*ei));
     651                 :            :                 return 1;
     652                 :            :         }
     653                 :            : 
     654         [ #  # ]:          0 :         if (key.type == BTRFS_EXTENT_ITEM_KEY) {
     655                 :            :                 bi = (struct btrfs_tree_block_info *)(ei + 1);
     656                 :          0 :                 *ptr = (unsigned long)(bi + 1);
     657                 :            :         } else {
     658                 :          0 :                 *ptr = (unsigned long)(ei + 1);
     659                 :            :         }
     660                 :          0 :         *end = (unsigned long)ei + item_size;
     661                 :          0 :         return 0;
     662                 :            : }
     663                 :            : 
     664                 :            : /*
     665                 :            :  * build backref tree for a given tree block. root of the backref tree
     666                 :            :  * corresponds the tree block, leaves of the backref tree correspond
     667                 :            :  * roots of b-trees that reference the tree block.
     668                 :            :  *
     669                 :            :  * the basic idea of this function is check backrefs of a given block
     670                 :            :  * to find upper level blocks that refernece the block, and then check
     671                 :            :  * bakcrefs of these upper level blocks recursively. the recursion stop
     672                 :            :  * when tree root is reached or backrefs for the block is cached.
     673                 :            :  *
     674                 :            :  * NOTE: if we find backrefs for a block are cached, we know backrefs
     675                 :            :  * for all upper level blocks that directly/indirectly reference the
     676                 :            :  * block are also cached.
     677                 :            :  */
     678                 :            : static noinline_for_stack
     679                 :          0 : struct backref_node *build_backref_tree(struct reloc_control *rc,
     680                 :            :                                         struct btrfs_key *node_key,
     681                 :            :                                         int level, u64 bytenr)
     682                 :            : {
     683                 :            :         struct backref_cache *cache = &rc->backref_cache;
     684                 :            :         struct btrfs_path *path1;
     685                 :            :         struct btrfs_path *path2;
     686                 :          0 :         struct extent_buffer *eb;
     687                 :            :         struct btrfs_root *root;
     688                 :            :         struct backref_node *cur;
     689                 :            :         struct backref_node *upper;
     690                 :            :         struct backref_node *lower;
     691                 :            :         struct backref_node *node = NULL;
     692                 :            :         struct backref_node *exist = NULL;
     693                 :            :         struct backref_edge *edge;
     694                 :            :         struct rb_node *rb_node;
     695                 :            :         struct btrfs_key key;
     696                 :            :         unsigned long end;
     697                 :            :         unsigned long ptr;
     698                 :          0 :         LIST_HEAD(list);
     699                 :          0 :         LIST_HEAD(useless);
     700                 :            :         int cowonly;
     701                 :            :         int ret;
     702                 :            :         int err = 0;
     703                 :            :         bool need_check = true;
     704                 :            : 
     705                 :          0 :         path1 = btrfs_alloc_path();
     706                 :          0 :         path2 = btrfs_alloc_path();
     707         [ #  # ]:          0 :         if (!path1 || !path2) {
     708                 :            :                 err = -ENOMEM;
     709                 :            :                 goto out;
     710                 :            :         }
     711                 :          0 :         path1->reada = 1;
     712                 :          0 :         path2->reada = 2;
     713                 :            : 
     714                 :          0 :         node = alloc_backref_node(cache);
     715         [ #  # ]:          0 :         if (!node) {
     716                 :            :                 err = -ENOMEM;
     717                 :            :                 goto out;
     718                 :            :         }
     719                 :            : 
     720                 :          0 :         node->bytenr = bytenr;
     721                 :          0 :         node->level = level;
     722                 :          0 :         node->lowest = 1;
     723                 :            :         cur = node;
     724                 :            : again:
     725                 :          0 :         end = 0;
     726                 :          0 :         ptr = 0;
     727                 :          0 :         key.objectid = cur->bytenr;
     728                 :          0 :         key.type = BTRFS_METADATA_ITEM_KEY;
     729                 :          0 :         key.offset = (u64)-1;
     730                 :            : 
     731                 :          0 :         path1->search_commit_root = 1;
     732                 :          0 :         path1->skip_locking = 1;
     733                 :          0 :         ret = btrfs_search_slot(NULL, rc->extent_root, &key, path1,
     734                 :            :                                 0, 0);
     735         [ #  # ]:          0 :         if (ret < 0) {
     736                 :            :                 err = ret;
     737                 :            :                 goto out;
     738                 :            :         }
     739 [ #  # ][ #  # ]:          0 :         BUG_ON(!ret || !path1->slots[0]);
     740                 :            : 
     741                 :          0 :         path1->slots[0]--;
     742                 :            : 
     743         [ #  # ]:          0 :         WARN_ON(cur->checked);
     744         [ #  # ]:          0 :         if (!list_empty(&cur->upper)) {
     745                 :            :                 /*
     746                 :            :                  * the backref was added previously when processing
     747                 :            :                  * backref of type BTRFS_TREE_BLOCK_REF_KEY
     748                 :            :                  */
     749         [ #  # ]:          0 :                 BUG_ON(!list_is_singular(&cur->upper));
     750                 :            :                 edge = list_entry(cur->upper.next, struct backref_edge,
     751                 :            :                                   list[LOWER]);
     752         [ #  # ]:          0 :                 BUG_ON(!list_empty(&edge->list[UPPER]));
     753                 :          0 :                 exist = edge->node[UPPER];
     754                 :            :                 /*
     755                 :            :                  * add the upper level block to pending list if we need
     756                 :            :                  * check its backrefs
     757                 :            :                  */
     758         [ #  # ]:          0 :                 if (!exist->checked)
     759                 :            :                         list_add_tail(&edge->list[UPPER], &list);
     760                 :            :         } else {
     761                 :            :                 exist = NULL;
     762                 :            :         }
     763                 :            : 
     764                 :            :         while (1) {
     765                 :          0 :                 cond_resched();
     766                 :          0 :                 eb = path1->nodes[0];
     767                 :            : 
     768         [ #  # ]:          0 :                 if (ptr >= end) {
     769         [ #  # ]:          0 :                         if (path1->slots[0] >= btrfs_header_nritems(eb)) {
     770                 :          0 :                                 ret = btrfs_next_leaf(rc->extent_root, path1);
     771         [ #  # ]:          0 :                                 if (ret < 0) {
     772                 :            :                                         err = ret;
     773                 :            :                                         goto out;
     774                 :            :                                 }
     775         [ #  # ]:          0 :                                 if (ret > 0)
     776                 :            :                                         break;
     777                 :          0 :                                 eb = path1->nodes[0];
     778                 :            :                         }
     779                 :            : 
     780                 :          0 :                         btrfs_item_key_to_cpu(eb, &key, path1->slots[0]);
     781         [ #  # ]:          0 :                         if (key.objectid != cur->bytenr) {
     782         [ #  # ]:          0 :                                 WARN_ON(exist);
     783                 :            :                                 break;
     784                 :            :                         }
     785                 :            : 
     786         [ #  # ]:          0 :                         if (key.type == BTRFS_EXTENT_ITEM_KEY ||
     787                 :            :                             key.type == BTRFS_METADATA_ITEM_KEY) {
     788                 :          0 :                                 ret = find_inline_backref(eb, path1->slots[0],
     789                 :            :                                                           &ptr, &end);
     790         [ #  # ]:          0 :                                 if (ret)
     791                 :            :                                         goto next;
     792                 :            :                         }
     793                 :            :                 }
     794                 :            : 
     795         [ #  # ]:          0 :                 if (ptr < end) {
     796                 :            :                         /* update key for inline back ref */
     797                 :            :                         struct btrfs_extent_inline_ref *iref;
     798                 :          0 :                         iref = (struct btrfs_extent_inline_ref *)ptr;
     799                 :          0 :                         key.type = btrfs_extent_inline_ref_type(eb, iref);
     800                 :          0 :                         key.offset = btrfs_extent_inline_ref_offset(eb, iref);
     801         [ #  # ]:          0 :                         WARN_ON(key.type != BTRFS_TREE_BLOCK_REF_KEY &&
     802                 :            :                                 key.type != BTRFS_SHARED_BLOCK_REF_KEY);
     803                 :            :                 }
     804                 :            : 
     805 [ #  # ][ #  # ]:          0 :                 if (exist &&
     806         [ #  # ]:          0 :                     ((key.type == BTRFS_TREE_BLOCK_REF_KEY &&
     807         [ #  # ]:          0 :                       exist->owner == key.offset) ||
     808         [ #  # ]:          0 :                      (key.type == BTRFS_SHARED_BLOCK_REF_KEY &&
     809                 :          0 :                       exist->bytenr == key.offset))) {
     810                 :            :                         exist = NULL;
     811                 :            :                         goto next;
     812                 :            :                 }
     813                 :            : 
     814                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
     815         [ #  # ]:          0 :                 if (key.type == BTRFS_SHARED_BLOCK_REF_KEY ||
     816                 :            :                     key.type == BTRFS_EXTENT_REF_V0_KEY) {
     817         [ #  # ]:          0 :                         if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
     818                 :            :                                 struct btrfs_extent_ref_v0 *ref0;
     819                 :          0 :                                 ref0 = btrfs_item_ptr(eb, path1->slots[0],
     820                 :            :                                                 struct btrfs_extent_ref_v0);
     821         [ #  # ]:          0 :                                 if (key.objectid == key.offset) {
     822                 :          0 :                                         root = find_tree_root(rc, eb, ref0);
     823 [ #  # ][ #  # ]:          0 :                                         if (root && !should_ignore_root(root))
     824                 :          0 :                                                 cur->root = root;
     825                 :            :                                         else
     826                 :          0 :                                                 list_add(&cur->list, &useless);
     827                 :            :                                         break;
     828                 :            :                                 }
     829         [ #  # ]:          0 :                                 if (is_cowonly_root(btrfs_ref_root_v0(eb,
     830                 :            :                                                                       ref0)))
     831                 :          0 :                                         cur->cowonly = 1;
     832                 :            :                         }
     833                 :            : #else
     834                 :            :                 BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
     835                 :            :                 if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
     836                 :            : #endif
     837         [ #  # ]:          0 :                         if (key.objectid == key.offset) {
     838                 :            :                                 /*
     839                 :            :                                  * only root blocks of reloc trees use
     840                 :            :                                  * backref of this type.
     841                 :            :                                  */
     842                 :          0 :                                 root = find_reloc_root(rc, cur->bytenr);
     843         [ #  # ]:          0 :                                 BUG_ON(!root);
     844                 :          0 :                                 cur->root = root;
     845                 :          0 :                                 break;
     846                 :            :                         }
     847                 :            : 
     848                 :          0 :                         edge = alloc_backref_edge(cache);
     849         [ #  # ]:          0 :                         if (!edge) {
     850                 :            :                                 err = -ENOMEM;
     851                 :            :                                 goto out;
     852                 :            :                         }
     853                 :          0 :                         rb_node = tree_search(&cache->rb_root, key.offset);
     854         [ #  # ]:          0 :                         if (!rb_node) {
     855                 :          0 :                                 upper = alloc_backref_node(cache);
     856         [ #  # ]:          0 :                                 if (!upper) {
     857                 :            :                                         free_backref_edge(cache, edge);
     858                 :            :                                         err = -ENOMEM;
     859                 :            :                                         goto out;
     860                 :            :                                 }
     861                 :          0 :                                 upper->bytenr = key.offset;
     862                 :          0 :                                 upper->level = cur->level + 1;
     863                 :            :                                 /*
     864                 :            :                                  *  backrefs for the upper level block isn't
     865                 :            :                                  *  cached, add the block to pending list
     866                 :            :                                  */
     867                 :          0 :                                 list_add_tail(&edge->list[UPPER], &list);
     868                 :            :                         } else {
     869                 :            :                                 upper = rb_entry(rb_node, struct backref_node,
     870                 :            :                                                  rb_node);
     871         [ #  # ]:          0 :                                 BUG_ON(!upper->checked);
     872                 :          0 :                                 INIT_LIST_HEAD(&edge->list[UPPER]);
     873                 :            :                         }
     874                 :          0 :                         list_add_tail(&edge->list[LOWER], &cur->upper);
     875                 :          0 :                         edge->node[LOWER] = cur;
     876                 :          0 :                         edge->node[UPPER] = upper;
     877                 :            : 
     878                 :          0 :                         goto next;
     879         [ #  # ]:          0 :                 } else if (key.type != BTRFS_TREE_BLOCK_REF_KEY) {
     880                 :            :                         goto next;
     881                 :            :                 }
     882                 :            : 
     883                 :            :                 /* key.type == BTRFS_TREE_BLOCK_REF_KEY */
     884                 :          0 :                 root = read_fs_root(rc->extent_root->fs_info, key.offset);
     885         [ #  # ]:          0 :                 if (IS_ERR(root)) {
     886                 :            :                         err = PTR_ERR(root);
     887                 :          0 :                         goto out;
     888                 :            :                 }
     889                 :            : 
     890         [ #  # ]:          0 :                 if (!root->ref_cows)
     891                 :          0 :                         cur->cowonly = 1;
     892                 :            : 
     893         [ #  # ]:          0 :                 if (btrfs_root_level(&root->root_item) == cur->level) {
     894                 :            :                         /* tree root */
     895         [ #  # ]:          0 :                         BUG_ON(btrfs_root_bytenr(&root->root_item) !=
     896                 :            :                                cur->bytenr);
     897         [ #  # ]:          0 :                         if (should_ignore_root(root))
     898                 :          0 :                                 list_add(&cur->list, &useless);
     899                 :            :                         else
     900                 :          0 :                                 cur->root = root;
     901                 :            :                         break;
     902                 :            :                 }
     903                 :            : 
     904                 :          0 :                 level = cur->level + 1;
     905                 :            : 
     906                 :            :                 /*
     907                 :            :                  * searching the tree to find upper level blocks
     908                 :            :                  * reference the block.
     909                 :            :                  */
     910                 :          0 :                 path2->search_commit_root = 1;
     911                 :          0 :                 path2->skip_locking = 1;
     912                 :          0 :                 path2->lowest_level = level;
     913                 :          0 :                 ret = btrfs_search_slot(NULL, root, node_key, path2, 0, 0);
     914                 :          0 :                 path2->lowest_level = 0;
     915         [ #  # ]:          0 :                 if (ret < 0) {
     916                 :            :                         err = ret;
     917                 :            :                         goto out;
     918                 :            :                 }
     919 [ #  # ][ #  # ]:          0 :                 if (ret > 0 && path2->slots[level] > 0)
     920                 :          0 :                         path2->slots[level]--;
     921                 :            : 
     922                 :          0 :                 eb = path2->nodes[level];
     923         [ #  # ]:          0 :                 WARN_ON(btrfs_node_blockptr(eb, path2->slots[level]) !=
     924                 :            :                         cur->bytenr);
     925                 :            : 
     926                 :            :                 lower = cur;
     927                 :            :                 need_check = true;
     928         [ #  # ]:          0 :                 for (; level < BTRFS_MAX_LEVEL; level++) {
     929         [ #  # ]:          0 :                         if (!path2->nodes[level]) {
     930         [ #  # ]:          0 :                                 BUG_ON(btrfs_root_bytenr(&root->root_item) !=
     931                 :            :                                        lower->bytenr);
     932         [ #  # ]:          0 :                                 if (should_ignore_root(root))
     933                 :          0 :                                         list_add(&lower->list, &useless);
     934                 :            :                                 else
     935                 :          0 :                                         lower->root = root;
     936                 :            :                                 break;
     937                 :            :                         }
     938                 :            : 
     939                 :          0 :                         edge = alloc_backref_edge(cache);
     940         [ #  # ]:          0 :                         if (!edge) {
     941                 :            :                                 err = -ENOMEM;
     942                 :            :                                 goto out;
     943                 :            :                         }
     944                 :            : 
     945                 :          0 :                         eb = path2->nodes[level];
     946                 :          0 :                         rb_node = tree_search(&cache->rb_root, eb->start);
     947         [ #  # ]:          0 :                         if (!rb_node) {
     948                 :          0 :                                 upper = alloc_backref_node(cache);
     949         [ #  # ]:          0 :                                 if (!upper) {
     950                 :            :                                         free_backref_edge(cache, edge);
     951                 :            :                                         err = -ENOMEM;
     952                 :            :                                         goto out;
     953                 :            :                                 }
     954                 :          0 :                                 upper->bytenr = eb->start;
     955                 :          0 :                                 upper->owner = btrfs_header_owner(eb);
     956                 :          0 :                                 upper->level = lower->level + 1;
     957         [ #  # ]:          0 :                                 if (!root->ref_cows)
     958                 :          0 :                                         upper->cowonly = 1;
     959                 :            : 
     960                 :            :                                 /*
     961                 :            :                                  * if we know the block isn't shared
     962                 :            :                                  * we can void checking its backrefs.
     963                 :            :                                  */
     964         [ #  # ]:          0 :                                 if (btrfs_block_can_be_shared(root, eb))
     965                 :          0 :                                         upper->checked = 0;
     966                 :            :                                 else
     967                 :          0 :                                         upper->checked = 1;
     968                 :            : 
     969                 :            :                                 /*
     970                 :            :                                  * add the block to pending list if we
     971                 :            :                                  * need check its backrefs, we only do this once
     972                 :            :                                  * while walking up a tree as we will catch
     973                 :            :                                  * anything else later on.
     974                 :            :                                  */
     975 [ #  # ][ #  # ]:          0 :                                 if (!upper->checked && need_check) {
     976                 :            :                                         need_check = false;
     977                 :          0 :                                         list_add_tail(&edge->list[UPPER],
     978                 :            :                                                       &list);
     979                 :            :                                 } else
     980                 :          0 :                                         INIT_LIST_HEAD(&edge->list[UPPER]);
     981                 :            :                         } else {
     982                 :            :                                 upper = rb_entry(rb_node, struct backref_node,
     983                 :            :                                                  rb_node);
     984         [ #  # ]:          0 :                                 BUG_ON(!upper->checked);
     985                 :          0 :                                 INIT_LIST_HEAD(&edge->list[UPPER]);
     986         [ #  # ]:          0 :                                 if (!upper->owner)
     987                 :          0 :                                         upper->owner = btrfs_header_owner(eb);
     988                 :            :                         }
     989                 :          0 :                         list_add_tail(&edge->list[LOWER], &lower->upper);
     990                 :          0 :                         edge->node[LOWER] = lower;
     991                 :          0 :                         edge->node[UPPER] = upper;
     992                 :            : 
     993         [ #  # ]:          0 :                         if (rb_node)
     994                 :            :                                 break;
     995                 :            :                         lower = upper;
     996                 :            :                         upper = NULL;
     997                 :            :                 }
     998                 :          0 :                 btrfs_release_path(path2);
     999                 :            : next:
    1000         [ #  # ]:          0 :                 if (ptr < end) {
    1001                 :          0 :                         ptr += btrfs_extent_inline_ref_size(key.type);
    1002         [ #  # ]:          0 :                         if (ptr >= end) {
    1003         [ #  # ]:          0 :                                 WARN_ON(ptr > end);
    1004                 :          0 :                                 ptr = 0;
    1005                 :          0 :                                 end = 0;
    1006                 :            :                         }
    1007                 :            :                 }
    1008         [ #  # ]:          0 :                 if (ptr >= end)
    1009                 :          0 :                         path1->slots[0]++;
    1010                 :            :         }
    1011                 :          0 :         btrfs_release_path(path1);
    1012                 :            : 
    1013                 :          0 :         cur->checked = 1;
    1014         [ #  # ]:          0 :         WARN_ON(exist);
    1015                 :            : 
    1016                 :            :         /* the pending list isn't empty, take the first block to process */
    1017         [ #  # ]:          0 :         if (!list_empty(&list)) {
    1018                 :            :                 edge = list_entry(list.next, struct backref_edge, list[UPPER]);
    1019                 :          0 :                 list_del_init(&edge->list[UPPER]);
    1020                 :          0 :                 cur = edge->node[UPPER];
    1021                 :          0 :                 goto again;
    1022                 :            :         }
    1023                 :            : 
    1024                 :            :         /*
    1025                 :            :          * everything goes well, connect backref nodes and insert backref nodes
    1026                 :            :          * into the cache.
    1027                 :            :          */
    1028         [ #  # ]:          0 :         BUG_ON(!node->checked);
    1029                 :          0 :         cowonly = node->cowonly;
    1030         [ #  # ]:          0 :         if (!cowonly) {
    1031                 :          0 :                 rb_node = tree_insert(&cache->rb_root, node->bytenr,
    1032                 :            :                                       &node->rb_node);
    1033         [ #  # ]:          0 :                 if (rb_node)
    1034                 :          0 :                         backref_tree_panic(rb_node, -EEXIST, node->bytenr);
    1035                 :          0 :                 list_add_tail(&node->lower, &cache->leaves);
    1036                 :            :         }
    1037                 :            : 
    1038         [ #  # ]:          0 :         list_for_each_entry(edge, &node->upper, list[LOWER])
    1039                 :          0 :                 list_add_tail(&edge->list[UPPER], &list);
    1040                 :            : 
    1041         [ #  # ]:          0 :         while (!list_empty(&list)) {
    1042                 :          0 :                 edge = list_entry(list.next, struct backref_edge, list[UPPER]);
    1043                 :          0 :                 list_del_init(&edge->list[UPPER]);
    1044                 :          0 :                 upper = edge->node[UPPER];
    1045         [ #  # ]:          0 :                 if (upper->detached) {
    1046                 :            :                         list_del(&edge->list[LOWER]);
    1047                 :          0 :                         lower = edge->node[LOWER];
    1048                 :            :                         free_backref_edge(cache, edge);
    1049         [ #  # ]:          0 :                         if (list_empty(&lower->upper))
    1050                 :          0 :                                 list_add(&lower->list, &useless);
    1051                 :          0 :                         continue;
    1052                 :            :                 }
    1053                 :            : 
    1054         [ #  # ]:          0 :                 if (!RB_EMPTY_NODE(&upper->rb_node)) {
    1055         [ #  # ]:          0 :                         if (upper->lowest) {
    1056                 :          0 :                                 list_del_init(&upper->lower);
    1057                 :          0 :                                 upper->lowest = 0;
    1058                 :            :                         }
    1059                 :            : 
    1060                 :          0 :                         list_add_tail(&edge->list[UPPER], &upper->lower);
    1061                 :          0 :                         continue;
    1062                 :            :                 }
    1063                 :            : 
    1064         [ #  # ]:          0 :                 BUG_ON(!upper->checked);
    1065         [ #  # ]:          0 :                 BUG_ON(cowonly != upper->cowonly);
    1066         [ #  # ]:          0 :                 if (!cowonly) {
    1067                 :          0 :                         rb_node = tree_insert(&cache->rb_root, upper->bytenr,
    1068                 :            :                                               &upper->rb_node);
    1069         [ #  # ]:          0 :                         if (rb_node)
    1070                 :          0 :                                 backref_tree_panic(rb_node, -EEXIST,
    1071                 :            :                                                    upper->bytenr);
    1072                 :            :                 }
    1073                 :            : 
    1074                 :          0 :                 list_add_tail(&edge->list[UPPER], &upper->lower);
    1075                 :            : 
    1076         [ #  # ]:          0 :                 list_for_each_entry(edge, &upper->upper, list[LOWER])
    1077                 :          0 :                         list_add_tail(&edge->list[UPPER], &list);
    1078                 :            :         }
    1079                 :            :         /*
    1080                 :            :          * process useless backref nodes. backref nodes for tree leaves
    1081                 :            :          * are deleted from the cache. backref nodes for upper level
    1082                 :            :          * tree blocks are left in the cache to avoid unnecessary backref
    1083                 :            :          * lookup.
    1084                 :            :          */
    1085         [ #  # ]:          0 :         while (!list_empty(&useless)) {
    1086                 :          0 :                 upper = list_entry(useless.next, struct backref_node, list);
    1087                 :          0 :                 list_del_init(&upper->list);
    1088         [ #  # ]:          0 :                 BUG_ON(!list_empty(&upper->upper));
    1089         [ #  # ]:          0 :                 if (upper == node)
    1090                 :            :                         node = NULL;
    1091         [ #  # ]:          0 :                 if (upper->lowest) {
    1092                 :          0 :                         list_del_init(&upper->lower);
    1093                 :          0 :                         upper->lowest = 0;
    1094                 :            :                 }
    1095         [ #  # ]:          0 :                 while (!list_empty(&upper->lower)) {
    1096                 :          0 :                         edge = list_entry(upper->lower.next,
    1097                 :            :                                           struct backref_edge, list[UPPER]);
    1098                 :            :                         list_del(&edge->list[UPPER]);
    1099                 :            :                         list_del(&edge->list[LOWER]);
    1100                 :          0 :                         lower = edge->node[LOWER];
    1101                 :            :                         free_backref_edge(cache, edge);
    1102                 :            : 
    1103         [ #  # ]:          0 :                         if (list_empty(&lower->upper))
    1104                 :          0 :                                 list_add(&lower->list, &useless);
    1105                 :            :                 }
    1106                 :          0 :                 __mark_block_processed(rc, upper);
    1107         [ #  # ]:          0 :                 if (upper->level > 0) {
    1108                 :          0 :                         list_add(&upper->list, &cache->detached);
    1109                 :          0 :                         upper->detached = 1;
    1110                 :            :                 } else {
    1111                 :          0 :                         rb_erase(&upper->rb_node, &cache->rb_root);
    1112                 :            :                         free_backref_node(cache, upper);
    1113                 :            :                 }
    1114                 :            :         }
    1115                 :            : out:
    1116                 :          0 :         btrfs_free_path(path1);
    1117                 :          0 :         btrfs_free_path(path2);
    1118         [ #  # ]:          0 :         if (err) {
    1119         [ #  # ]:          0 :                 while (!list_empty(&useless)) {
    1120                 :            :                         lower = list_entry(useless.next,
    1121                 :            :                                            struct backref_node, upper);
    1122                 :          0 :                         list_del_init(&lower->upper);
    1123                 :            :                 }
    1124                 :            :                 upper = node;
    1125                 :            :                 INIT_LIST_HEAD(&list);
    1126         [ #  # ]:          0 :                 while (upper) {
    1127         [ #  # ]:          0 :                         if (RB_EMPTY_NODE(&upper->rb_node)) {
    1128                 :          0 :                                 list_splice_tail(&upper->upper, &list);
    1129                 :            :                                 free_backref_node(cache, upper);
    1130                 :            :                         }
    1131                 :            : 
    1132         [ #  # ]:          0 :                         if (list_empty(&list))
    1133                 :            :                                 break;
    1134                 :            : 
    1135                 :            :                         edge = list_entry(list.next, struct backref_edge,
    1136                 :            :                                           list[LOWER]);
    1137                 :            :                         list_del(&edge->list[LOWER]);
    1138                 :          0 :                         upper = edge->node[UPPER];
    1139                 :            :                         free_backref_edge(cache, edge);
    1140                 :            :                 }
    1141                 :          0 :                 return ERR_PTR(err);
    1142                 :            :         }
    1143 [ #  # ][ #  # ]:          0 :         BUG_ON(node && node->detached);
    1144                 :            :         return node;
    1145                 :            : }
    1146                 :            : 
    1147                 :            : /*
    1148                 :            :  * helper to add backref node for the newly created snapshot.
    1149                 :            :  * the backref node is created by cloning backref node that
    1150                 :            :  * corresponds to root of source tree
    1151                 :            :  */
    1152                 :          0 : static int clone_backref_node(struct btrfs_trans_handle *trans,
    1153                 :            :                               struct reloc_control *rc,
    1154                 :            :                               struct btrfs_root *src,
    1155                 :            :                               struct btrfs_root *dest)
    1156                 :            : {
    1157                 :          0 :         struct btrfs_root *reloc_root = src->reloc_root;
    1158                 :          0 :         struct backref_cache *cache = &rc->backref_cache;
    1159                 :            :         struct backref_node *node = NULL;
    1160                 :            :         struct backref_node *new_node;
    1161                 :            :         struct backref_edge *edge;
    1162                 :            :         struct backref_edge *new_edge;
    1163                 :            :         struct rb_node *rb_node;
    1164                 :            : 
    1165         [ #  # ]:          0 :         if (cache->last_trans > 0)
    1166                 :          0 :                 update_backref_cache(trans, cache);
    1167                 :            : 
    1168                 :          0 :         rb_node = tree_search(&cache->rb_root, src->commit_root->start);
    1169         [ #  # ]:          0 :         if (rb_node) {
    1170                 :            :                 node = rb_entry(rb_node, struct backref_node, rb_node);
    1171         [ #  # ]:          0 :                 if (node->detached)
    1172                 :            :                         node = NULL;
    1173                 :            :                 else
    1174         [ #  # ]:          0 :                         BUG_ON(node->new_bytenr != reloc_root->node->start);
    1175                 :            :         }
    1176                 :            : 
    1177         [ #  # ]:          0 :         if (!node) {
    1178                 :          0 :                 rb_node = tree_search(&cache->rb_root,
    1179                 :          0 :                                       reloc_root->commit_root->start);
    1180         [ #  # ]:          0 :                 if (rb_node) {
    1181                 :            :                         node = rb_entry(rb_node, struct backref_node,
    1182                 :            :                                         rb_node);
    1183         [ #  # ]:          0 :                         BUG_ON(node->detached);
    1184                 :            :                 }
    1185                 :            :         }
    1186                 :            : 
    1187         [ #  # ]:          0 :         if (!node)
    1188                 :            :                 return 0;
    1189                 :            : 
    1190                 :          0 :         new_node = alloc_backref_node(cache);
    1191         [ #  # ]:          0 :         if (!new_node)
    1192                 :            :                 return -ENOMEM;
    1193                 :            : 
    1194                 :          0 :         new_node->bytenr = dest->node->start;
    1195                 :          0 :         new_node->level = node->level;
    1196                 :          0 :         new_node->lowest = node->lowest;
    1197                 :          0 :         new_node->checked = 1;
    1198                 :          0 :         new_node->root = dest;
    1199                 :            : 
    1200         [ #  # ]:          0 :         if (!node->lowest) {
    1201         [ #  # ]:          0 :                 list_for_each_entry(edge, &node->lower, list[UPPER]) {
    1202                 :          0 :                         new_edge = alloc_backref_edge(cache);
    1203         [ #  # ]:          0 :                         if (!new_edge)
    1204                 :            :                                 goto fail;
    1205                 :            : 
    1206                 :          0 :                         new_edge->node[UPPER] = new_node;
    1207                 :          0 :                         new_edge->node[LOWER] = edge->node[LOWER];
    1208                 :          0 :                         list_add_tail(&new_edge->list[UPPER],
    1209                 :            :                                       &new_node->lower);
    1210                 :            :                 }
    1211                 :            :         } else {
    1212                 :          0 :                 list_add_tail(&new_node->lower, &cache->leaves);
    1213                 :            :         }
    1214                 :            : 
    1215                 :          0 :         rb_node = tree_insert(&cache->rb_root, new_node->bytenr,
    1216                 :            :                               &new_node->rb_node);
    1217         [ #  # ]:          0 :         if (rb_node)
    1218                 :          0 :                 backref_tree_panic(rb_node, -EEXIST, new_node->bytenr);
    1219                 :            : 
    1220         [ #  # ]:          0 :         if (!new_node->lowest) {
    1221         [ #  # ]:          0 :                 list_for_each_entry(new_edge, &new_node->lower, list[UPPER]) {
    1222                 :          0 :                         list_add_tail(&new_edge->list[LOWER],
    1223                 :          0 :                                       &new_edge->node[LOWER]->upper);
    1224                 :            :                 }
    1225                 :            :         }
    1226                 :            :         return 0;
    1227                 :            : fail:
    1228         [ #  # ]:          0 :         while (!list_empty(&new_node->lower)) {
    1229                 :          0 :                 new_edge = list_entry(new_node->lower.next,
    1230                 :            :                                       struct backref_edge, list[UPPER]);
    1231                 :            :                 list_del(&new_edge->list[UPPER]);
    1232                 :            :                 free_backref_edge(cache, new_edge);
    1233                 :            :         }
    1234                 :            :         free_backref_node(cache, new_node);
    1235                 :            :         return -ENOMEM;
    1236                 :            : }
    1237                 :            : 
    1238                 :            : /*
    1239                 :            :  * helper to add 'address of tree root -> reloc tree' mapping
    1240                 :            :  */
    1241                 :          0 : static int __must_check __add_reloc_root(struct btrfs_root *root)
    1242                 :            : {
    1243                 :            :         struct rb_node *rb_node;
    1244                 :            :         struct mapping_node *node;
    1245                 :          0 :         struct reloc_control *rc = root->fs_info->reloc_ctl;
    1246                 :            : 
    1247                 :            :         node = kmalloc(sizeof(*node), GFP_NOFS);
    1248         [ #  # ]:          0 :         if (!node)
    1249                 :            :                 return -ENOMEM;
    1250                 :            : 
    1251                 :          0 :         node->bytenr = root->node->start;
    1252                 :          0 :         node->data = root;
    1253                 :            : 
    1254                 :            :         spin_lock(&rc->reloc_root_tree.lock);
    1255                 :          0 :         rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
    1256                 :            :                               node->bytenr, &node->rb_node);
    1257                 :            :         spin_unlock(&rc->reloc_root_tree.lock);
    1258         [ #  # ]:          0 :         if (rb_node) {
    1259                 :          0 :                 btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found "
    1260                 :            :                             "for start=%llu while inserting into relocation "
    1261                 :            :                             "tree\n", node->bytenr);
    1262                 :            :                 kfree(node);
    1263                 :            :                 return -EEXIST;
    1264                 :            :         }
    1265                 :            : 
    1266                 :          0 :         list_add_tail(&root->root_list, &rc->reloc_roots);
    1267                 :          0 :         return 0;
    1268                 :            : }
    1269                 :            : 
    1270                 :            : /*
    1271                 :            :  * helper to delete the 'address of tree root -> reloc tree'
    1272                 :            :  * mapping
    1273                 :            :  */
    1274                 :          0 : static void __del_reloc_root(struct btrfs_root *root)
    1275                 :            : {
    1276                 :            :         struct rb_node *rb_node;
    1277                 :            :         struct mapping_node *node = NULL;
    1278                 :          0 :         struct reloc_control *rc = root->fs_info->reloc_ctl;
    1279                 :            : 
    1280                 :            :         spin_lock(&rc->reloc_root_tree.lock);
    1281                 :          0 :         rb_node = tree_search(&rc->reloc_root_tree.rb_root,
    1282                 :          0 :                               root->node->start);
    1283         [ #  # ]:          0 :         if (rb_node) {
    1284                 :            :                 node = rb_entry(rb_node, struct mapping_node, rb_node);
    1285                 :          0 :                 rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root);
    1286                 :            :         }
    1287                 :            :         spin_unlock(&rc->reloc_root_tree.lock);
    1288                 :            : 
    1289         [ #  # ]:          0 :         if (!node)
    1290                 :          0 :                 return;
    1291         [ #  # ]:          0 :         BUG_ON((struct btrfs_root *)node->data != root);
    1292                 :            : 
    1293                 :          0 :         spin_lock(&root->fs_info->trans_lock);
    1294                 :          0 :         list_del_init(&root->root_list);
    1295                 :          0 :         spin_unlock(&root->fs_info->trans_lock);
    1296                 :          0 :         kfree(node);
    1297                 :            : }
    1298                 :            : 
    1299                 :            : /*
    1300                 :            :  * helper to update the 'address of tree root -> reloc tree'
    1301                 :            :  * mapping
    1302                 :            :  */
    1303                 :          0 : static int __update_reloc_root(struct btrfs_root *root, u64 new_bytenr)
    1304                 :            : {
    1305                 :            :         struct rb_node *rb_node;
    1306                 :            :         struct mapping_node *node = NULL;
    1307                 :          0 :         struct reloc_control *rc = root->fs_info->reloc_ctl;
    1308                 :            : 
    1309                 :            :         spin_lock(&rc->reloc_root_tree.lock);
    1310                 :          0 :         rb_node = tree_search(&rc->reloc_root_tree.rb_root,
    1311                 :          0 :                               root->node->start);
    1312         [ #  # ]:          0 :         if (rb_node) {
    1313                 :            :                 node = rb_entry(rb_node, struct mapping_node, rb_node);
    1314                 :          0 :                 rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root);
    1315                 :            :         }
    1316                 :            :         spin_unlock(&rc->reloc_root_tree.lock);
    1317                 :            : 
    1318         [ #  # ]:          0 :         if (!node)
    1319                 :            :                 return 0;
    1320         [ #  # ]:          0 :         BUG_ON((struct btrfs_root *)node->data != root);
    1321                 :            : 
    1322                 :            :         spin_lock(&rc->reloc_root_tree.lock);
    1323                 :          0 :         node->bytenr = new_bytenr;
    1324                 :          0 :         rb_node = tree_insert(&rc->reloc_root_tree.rb_root,
    1325                 :            :                               node->bytenr, &node->rb_node);
    1326                 :            :         spin_unlock(&rc->reloc_root_tree.lock);
    1327         [ #  # ]:          0 :         if (rb_node)
    1328                 :          0 :                 backref_tree_panic(rb_node, -EEXIST, node->bytenr);
    1329                 :            :         return 0;
    1330                 :            : }
    1331                 :            : 
    1332                 :          0 : static struct btrfs_root *create_reloc_root(struct btrfs_trans_handle *trans,
    1333                 :            :                                         struct btrfs_root *root, u64 objectid)
    1334                 :            : {
    1335                 :            :         struct btrfs_root *reloc_root;
    1336                 :            :         struct extent_buffer *eb;
    1337                 :            :         struct btrfs_root_item *root_item;
    1338                 :            :         struct btrfs_key root_key;
    1339                 :            :         u64 last_snap = 0;
    1340                 :            :         int ret;
    1341                 :            : 
    1342                 :            :         root_item = kmalloc(sizeof(*root_item), GFP_NOFS);
    1343         [ #  # ]:          0 :         BUG_ON(!root_item);
    1344                 :            : 
    1345                 :          0 :         root_key.objectid = BTRFS_TREE_RELOC_OBJECTID;
    1346                 :          0 :         root_key.type = BTRFS_ROOT_ITEM_KEY;
    1347                 :          0 :         root_key.offset = objectid;
    1348                 :            : 
    1349         [ #  # ]:          0 :         if (root->root_key.objectid == objectid) {
    1350                 :            :                 /* called by btrfs_init_reloc_root */
    1351                 :          0 :                 ret = btrfs_copy_root(trans, root, root->commit_root, &eb,
    1352                 :            :                                       BTRFS_TREE_RELOC_OBJECTID);
    1353         [ #  # ]:          0 :                 BUG_ON(ret);
    1354                 :            : 
    1355                 :            :                 last_snap = btrfs_root_last_snapshot(&root->root_item);
    1356                 :          0 :                 btrfs_set_root_last_snapshot(&root->root_item,
    1357                 :          0 :                                              trans->transid - 1);
    1358                 :            :         } else {
    1359                 :            :                 /*
    1360                 :            :                  * called by btrfs_reloc_post_snapshot_hook.
    1361                 :            :                  * the source tree is a reloc tree, all tree blocks
    1362                 :            :                  * modified after it was created have RELOC flag
    1363                 :            :                  * set in their headers. so it's OK to not update
    1364                 :            :                  * the 'last_snapshot'.
    1365                 :            :                  */
    1366                 :          0 :                 ret = btrfs_copy_root(trans, root, root->node, &eb,
    1367                 :            :                                       BTRFS_TREE_RELOC_OBJECTID);
    1368         [ #  # ]:          0 :                 BUG_ON(ret);
    1369                 :            :         }
    1370                 :            : 
    1371                 :          0 :         memcpy(root_item, &root->root_item, sizeof(*root_item));
    1372                 :          0 :         btrfs_set_root_bytenr(root_item, eb->start);
    1373                 :            :         btrfs_set_root_level(root_item, btrfs_header_level(eb));
    1374                 :          0 :         btrfs_set_root_generation(root_item, trans->transid);
    1375                 :            : 
    1376         [ #  # ]:          0 :         if (root->root_key.objectid == objectid) {
    1377                 :            :                 btrfs_set_root_refs(root_item, 0);
    1378                 :          0 :                 memset(&root_item->drop_progress, 0,
    1379                 :            :                        sizeof(struct btrfs_disk_key));
    1380                 :          0 :                 root_item->drop_level = 0;
    1381                 :            :                 /*
    1382                 :            :                  * abuse rtransid, it is safe because it is impossible to
    1383                 :            :                  * receive data into a relocation tree.
    1384                 :            :                  */
    1385                 :            :                 btrfs_set_root_rtransid(root_item, last_snap);
    1386                 :          0 :                 btrfs_set_root_otransid(root_item, trans->transid);
    1387                 :            :         }
    1388                 :            : 
    1389                 :          0 :         btrfs_tree_unlock(eb);
    1390                 :          0 :         free_extent_buffer(eb);
    1391                 :            : 
    1392                 :          0 :         ret = btrfs_insert_root(trans, root->fs_info->tree_root,
    1393                 :            :                                 &root_key, root_item);
    1394         [ #  # ]:          0 :         BUG_ON(ret);
    1395                 :          0 :         kfree(root_item);
    1396                 :            : 
    1397                 :          0 :         reloc_root = btrfs_read_fs_root(root->fs_info->tree_root, &root_key);
    1398         [ #  # ]:          0 :         BUG_ON(IS_ERR(reloc_root));
    1399                 :          0 :         reloc_root->last_trans = trans->transid;
    1400                 :          0 :         return reloc_root;
    1401                 :            : }
    1402                 :            : 
    1403                 :            : /*
    1404                 :            :  * create reloc tree for a given fs tree. reloc tree is just a
    1405                 :            :  * snapshot of the fs tree with special root objectid.
    1406                 :            :  */
    1407                 :          0 : int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,
    1408                 :            :                           struct btrfs_root *root)
    1409                 :            : {
    1410                 :            :         struct btrfs_root *reloc_root;
    1411                 :          0 :         struct reloc_control *rc = root->fs_info->reloc_ctl;
    1412                 :            :         struct btrfs_block_rsv *rsv;
    1413                 :            :         int clear_rsv = 0;
    1414                 :            :         int ret;
    1415                 :            : 
    1416         [ #  # ]:          0 :         if (root->reloc_root) {
    1417                 :            :                 reloc_root = root->reloc_root;
    1418                 :          0 :                 reloc_root->last_trans = trans->transid;
    1419                 :          0 :                 return 0;
    1420                 :            :         }
    1421                 :            : 
    1422 [ #  # ][ #  # ]:          0 :         if (!rc || !rc->create_reloc_tree ||
                 [ #  # ]
    1423                 :          0 :             root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
    1424                 :            :                 return 0;
    1425                 :            : 
    1426         [ #  # ]:          0 :         if (!trans->reloc_reserved) {
    1427                 :          0 :                 rsv = trans->block_rsv;
    1428                 :          0 :                 trans->block_rsv = rc->block_rsv;
    1429                 :            :                 clear_rsv = 1;
    1430                 :            :         }
    1431                 :          0 :         reloc_root = create_reloc_root(trans, root, root->root_key.objectid);
    1432         [ #  # ]:          0 :         if (clear_rsv)
    1433                 :          0 :                 trans->block_rsv = rsv;
    1434                 :            : 
    1435                 :          0 :         ret = __add_reloc_root(reloc_root);
    1436         [ #  # ]:          0 :         BUG_ON(ret < 0);
    1437                 :          0 :         root->reloc_root = reloc_root;
    1438                 :          0 :         return 0;
    1439                 :            : }
    1440                 :            : 
    1441                 :            : /*
    1442                 :            :  * update root item of reloc tree
    1443                 :            :  */
    1444                 :          0 : int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
    1445                 :            :                             struct btrfs_root *root)
    1446                 :            : {
    1447                 :            :         struct btrfs_root *reloc_root;
    1448                 :            :         struct btrfs_root_item *root_item;
    1449                 :            :         int ret;
    1450                 :            : 
    1451         [ #  # ]:          0 :         if (!root->reloc_root)
    1452                 :            :                 goto out;
    1453                 :            : 
    1454                 :            :         reloc_root = root->reloc_root;
    1455                 :          0 :         root_item = &reloc_root->root_item;
    1456                 :            : 
    1457 [ #  # ][ #  # ]:          0 :         if (root->fs_info->reloc_ctl->merge_reloc_tree &&
    1458                 :            :             btrfs_root_refs(root_item) == 0) {
    1459                 :          0 :                 root->reloc_root = NULL;
    1460                 :          0 :                 __del_reloc_root(reloc_root);
    1461                 :            :         }
    1462                 :            : 
    1463         [ #  # ]:          0 :         if (reloc_root->commit_root != reloc_root->node) {
    1464                 :          0 :                 btrfs_set_root_node(root_item, reloc_root->node);
    1465                 :          0 :                 free_extent_buffer(reloc_root->commit_root);
    1466                 :          0 :                 reloc_root->commit_root = btrfs_root_node(reloc_root);
    1467                 :            :         }
    1468                 :            : 
    1469                 :          0 :         ret = btrfs_update_root(trans, root->fs_info->tree_root,
    1470                 :            :                                 &reloc_root->root_key, root_item);
    1471         [ #  # ]:          0 :         BUG_ON(ret);
    1472                 :            : 
    1473                 :            : out:
    1474                 :          0 :         return 0;
    1475                 :            : }
    1476                 :            : 
    1477                 :            : /*
    1478                 :            :  * helper to find first cached inode with inode number >= objectid
    1479                 :            :  * in a subvolume
    1480                 :            :  */
    1481                 :          0 : static struct inode *find_next_inode(struct btrfs_root *root, u64 objectid)
    1482                 :            : {
    1483                 :            :         struct rb_node *node;
    1484                 :            :         struct rb_node *prev;
    1485                 :            :         struct btrfs_inode *entry;
    1486                 :            :         struct inode *inode;
    1487                 :            : 
    1488                 :            :         spin_lock(&root->inode_lock);
    1489                 :            : again:
    1490                 :          0 :         node = root->inode_tree.rb_node;
    1491                 :            :         prev = NULL;
    1492         [ #  # ]:          0 :         while (node) {
    1493                 :            :                 prev = node;
    1494                 :            :                 entry = rb_entry(node, struct btrfs_inode, rb_node);
    1495                 :            : 
    1496         [ #  # ]:          0 :                 if (objectid < btrfs_ino(&entry->vfs_inode))
    1497                 :          0 :                         node = node->rb_left;
    1498         [ #  # ]:          0 :                 else if (objectid > btrfs_ino(&entry->vfs_inode))
    1499                 :          0 :                         node = node->rb_right;
    1500                 :            :                 else
    1501                 :            :                         break;
    1502                 :            :         }
    1503         [ #  # ]:          0 :         if (!node) {
    1504         [ #  # ]:          0 :                 while (prev) {
    1505                 :            :                         entry = rb_entry(prev, struct btrfs_inode, rb_node);
    1506         [ #  # ]:          0 :                         if (objectid <= btrfs_ino(&entry->vfs_inode)) {
    1507                 :            :                                 node = prev;
    1508                 :            :                                 break;
    1509                 :            :                         }
    1510                 :          0 :                         prev = rb_next(prev);
    1511                 :            :                 }
    1512                 :            :         }
    1513         [ #  # ]:          0 :         while (node) {
    1514                 :            :                 entry = rb_entry(node, struct btrfs_inode, rb_node);
    1515                 :          0 :                 inode = igrab(&entry->vfs_inode);
    1516         [ #  # ]:          0 :                 if (inode) {
    1517                 :            :                         spin_unlock(&root->inode_lock);
    1518                 :          0 :                         return inode;
    1519                 :            :                 }
    1520                 :            : 
    1521                 :          0 :                 objectid = btrfs_ino(&entry->vfs_inode) + 1;
    1522         [ #  # ]:          0 :                 if (cond_resched_lock(&root->inode_lock))
    1523                 :            :                         goto again;
    1524                 :            : 
    1525                 :          0 :                 node = rb_next(node);
    1526                 :            :         }
    1527                 :            :         spin_unlock(&root->inode_lock);
    1528                 :          0 :         return NULL;
    1529                 :            : }
    1530                 :            : 
    1531                 :            : static int in_block_group(u64 bytenr,
    1532                 :            :                           struct btrfs_block_group_cache *block_group)
    1533                 :            : {
    1534 [ #  # ][ #  # ]:          0 :         if (bytenr >= block_group->key.objectid &&
         [ #  # ][ #  # ]
    1535                 :          0 :             bytenr < block_group->key.objectid + block_group->key.offset)
    1536                 :            :                 return 1;
    1537                 :            :         return 0;
    1538                 :            : }
    1539                 :            : 
    1540                 :            : /*
    1541                 :            :  * get new location of data
    1542                 :            :  */
    1543                 :          0 : static int get_new_location(struct inode *reloc_inode, u64 *new_bytenr,
    1544                 :            :                             u64 bytenr, u64 num_bytes)
    1545                 :            : {
    1546                 :          0 :         struct btrfs_root *root = BTRFS_I(reloc_inode)->root;
    1547                 :            :         struct btrfs_path *path;
    1548                 :            :         struct btrfs_file_extent_item *fi;
    1549                 :            :         struct extent_buffer *leaf;
    1550                 :            :         int ret;
    1551                 :            : 
    1552                 :          0 :         path = btrfs_alloc_path();
    1553         [ #  # ]:          0 :         if (!path)
    1554                 :            :                 return -ENOMEM;
    1555                 :            : 
    1556                 :          0 :         bytenr -= BTRFS_I(reloc_inode)->index_cnt;
    1557                 :          0 :         ret = btrfs_lookup_file_extent(NULL, root, path, btrfs_ino(reloc_inode),
    1558                 :            :                                        bytenr, 0);
    1559         [ #  # ]:          0 :         if (ret < 0)
    1560                 :            :                 goto out;
    1561         [ #  # ]:          0 :         if (ret > 0) {
    1562                 :            :                 ret = -ENOENT;
    1563                 :            :                 goto out;
    1564                 :            :         }
    1565                 :            : 
    1566                 :          0 :         leaf = path->nodes[0];
    1567                 :          0 :         fi = btrfs_item_ptr(leaf, path->slots[0],
    1568                 :            :                             struct btrfs_file_extent_item);
    1569                 :            : 
    1570   [ #  #  #  # ]:          0 :         BUG_ON(btrfs_file_extent_offset(leaf, fi) ||
           [ #  #  #  # ]
           [ #  #  #  # ]
    1571                 :            :                btrfs_file_extent_compression(leaf, fi) ||
    1572                 :            :                btrfs_file_extent_encryption(leaf, fi) ||
    1573                 :            :                btrfs_file_extent_other_encoding(leaf, fi));
    1574                 :            : 
    1575         [ #  # ]:          0 :         if (num_bytes != btrfs_file_extent_disk_num_bytes(leaf, fi)) {
    1576                 :            :                 ret = -EINVAL;
    1577                 :            :                 goto out;
    1578                 :            :         }
    1579                 :            : 
    1580                 :          0 :         *new_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
    1581                 :            :         ret = 0;
    1582                 :            : out:
    1583                 :          0 :         btrfs_free_path(path);
    1584                 :          0 :         return ret;
    1585                 :            : }
    1586                 :            : 
    1587                 :            : /*
    1588                 :            :  * update file extent items in the tree leaf to point to
    1589                 :            :  * the new locations.
    1590                 :            :  */
    1591                 :            : static noinline_for_stack
    1592                 :          0 : int replace_file_extents(struct btrfs_trans_handle *trans,
    1593                 :            :                          struct reloc_control *rc,
    1594                 :            :                          struct btrfs_root *root,
    1595                 :          0 :                          struct extent_buffer *leaf)
    1596                 :            : {
    1597                 :            :         struct btrfs_key key;
    1598                 :            :         struct btrfs_file_extent_item *fi;
    1599                 :            :         struct inode *inode = NULL;
    1600                 :            :         u64 parent;
    1601                 :            :         u64 bytenr;
    1602                 :          0 :         u64 new_bytenr = 0;
    1603                 :            :         u64 num_bytes;
    1604                 :            :         u64 end;
    1605                 :            :         u32 nritems;
    1606                 :            :         u32 i;
    1607                 :            :         int ret = 0;
    1608                 :            :         int first = 1;
    1609                 :            :         int dirty = 0;
    1610                 :            : 
    1611         [ #  # ]:          0 :         if (rc->stage != UPDATE_DATA_PTRS)
    1612                 :            :                 return 0;
    1613                 :            : 
    1614                 :            :         /* reloc trees always use full backref */
    1615         [ #  # ]:          0 :         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
    1616                 :          0 :                 parent = leaf->start;
    1617                 :            :         else
    1618                 :            :                 parent = 0;
    1619                 :            : 
    1620                 :            :         nritems = btrfs_header_nritems(leaf);
    1621         [ #  # ]:          0 :         for (i = 0; i < nritems; i++) {
    1622                 :          0 :                 cond_resched();
    1623                 :            :                 btrfs_item_key_to_cpu(leaf, &key, i);
    1624         [ #  # ]:          0 :                 if (key.type != BTRFS_EXTENT_DATA_KEY)
    1625                 :          0 :                         continue;
    1626                 :          0 :                 fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item);
    1627         [ #  # ]:          0 :                 if (btrfs_file_extent_type(leaf, fi) ==
    1628                 :            :                     BTRFS_FILE_EXTENT_INLINE)
    1629                 :          0 :                         continue;
    1630                 :            :                 bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
    1631                 :            :                 num_bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
    1632         [ #  # ]:          0 :                 if (bytenr == 0)
    1633                 :          0 :                         continue;
    1634         [ #  # ]:          0 :                 if (!in_block_group(bytenr, rc->block_group))
    1635                 :          0 :                         continue;
    1636                 :            : 
    1637                 :            :                 /*
    1638                 :            :                  * if we are modifying block in fs tree, wait for readpage
    1639                 :            :                  * to complete and drop the extent cache
    1640                 :            :                  */
    1641         [ #  # ]:          0 :                 if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
    1642         [ #  # ]:          0 :                         if (first) {
    1643                 :          0 :                                 inode = find_next_inode(root, key.objectid);
    1644                 :            :                                 first = 0;
    1645 [ #  # ][ #  # ]:          0 :                         } else if (inode && btrfs_ino(inode) < key.objectid) {
    1646                 :          0 :                                 btrfs_add_delayed_iput(inode);
    1647                 :          0 :                                 inode = find_next_inode(root, key.objectid);
    1648                 :            :                         }
    1649 [ #  # ][ #  # ]:          0 :                         if (inode && btrfs_ino(inode) == key.objectid) {
    1650                 :          0 :                                 end = key.offset +
    1651                 :            :                                       btrfs_file_extent_num_bytes(leaf, fi);
    1652         [ #  # ]:          0 :                                 WARN_ON(!IS_ALIGNED(key.offset,
    1653                 :            :                                                     root->sectorsize));
    1654         [ #  # ]:          0 :                                 WARN_ON(!IS_ALIGNED(end, root->sectorsize));
    1655                 :          0 :                                 end--;
    1656                 :          0 :                                 ret = try_lock_extent(&BTRFS_I(inode)->io_tree,
    1657                 :            :                                                       key.offset, end);
    1658         [ #  # ]:          0 :                                 if (!ret)
    1659                 :          0 :                                         continue;
    1660                 :            : 
    1661                 :          0 :                                 btrfs_drop_extent_cache(inode, key.offset, end,
    1662                 :            :                                                         1);
    1663                 :          0 :                                 unlock_extent(&BTRFS_I(inode)->io_tree,
    1664                 :            :                                               key.offset, end);
    1665                 :            :                         }
    1666                 :            :                 }
    1667                 :            : 
    1668                 :          0 :                 ret = get_new_location(rc->data_inode, &new_bytenr,
    1669                 :            :                                        bytenr, num_bytes);
    1670         [ #  # ]:          0 :                 if (ret) {
    1671                 :            :                         /*
    1672                 :            :                          * Don't have to abort since we've not changed anything
    1673                 :            :                          * in the file extent yet.
    1674                 :            :                          */
    1675                 :            :                         break;
    1676                 :            :                 }
    1677                 :            : 
    1678                 :          0 :                 btrfs_set_file_extent_disk_bytenr(leaf, fi, new_bytenr);
    1679                 :            :                 dirty = 1;
    1680                 :            : 
    1681                 :          0 :                 key.offset -= btrfs_file_extent_offset(leaf, fi);
    1682                 :          0 :                 ret = btrfs_inc_extent_ref(trans, root, new_bytenr,
    1683                 :            :                                            num_bytes, parent,
    1684                 :            :                                            btrfs_header_owner(leaf),
    1685                 :            :                                            key.objectid, key.offset, 1);
    1686         [ #  # ]:          0 :                 if (ret) {
    1687                 :          0 :                         btrfs_abort_transaction(trans, root, ret);
    1688                 :          0 :                         break;
    1689                 :            :                 }
    1690                 :            : 
    1691                 :          0 :                 ret = btrfs_free_extent(trans, root, bytenr, num_bytes,
    1692                 :            :                                         parent, btrfs_header_owner(leaf),
    1693                 :            :                                         key.objectid, key.offset, 1);
    1694         [ #  # ]:          0 :                 if (ret) {
    1695                 :          0 :                         btrfs_abort_transaction(trans, root, ret);
    1696                 :          0 :                         break;
    1697                 :            :                 }
    1698                 :            :         }
    1699         [ #  # ]:          0 :         if (dirty)
    1700                 :          0 :                 btrfs_mark_buffer_dirty(leaf);
    1701         [ #  # ]:          0 :         if (inode)
    1702                 :          0 :                 btrfs_add_delayed_iput(inode);
    1703                 :          0 :         return ret;
    1704                 :            : }
    1705                 :            : 
    1706                 :            : static noinline_for_stack
    1707                 :          0 : int memcmp_node_keys(struct extent_buffer *eb, int slot,
    1708                 :            :                      struct btrfs_path *path, int level)
    1709                 :            : {
    1710                 :            :         struct btrfs_disk_key key1;
    1711                 :            :         struct btrfs_disk_key key2;
    1712                 :          0 :         btrfs_node_key(eb, &key1, slot);
    1713                 :          0 :         btrfs_node_key(path->nodes[level], &key2, path->slots[level]);
    1714                 :          0 :         return memcmp(&key1, &key2, sizeof(key1));
    1715                 :            : }
    1716                 :            : 
    1717                 :            : /*
    1718                 :            :  * try to replace tree blocks in fs tree with the new blocks
    1719                 :            :  * in reloc tree. tree blocks haven't been modified since the
    1720                 :            :  * reloc tree was create can be replaced.
    1721                 :            :  *
    1722                 :            :  * if a block was replaced, level of the block + 1 is returned.
    1723                 :            :  * if no block got replaced, 0 is returned. if there are other
    1724                 :            :  * errors, a negative error number is returned.
    1725                 :            :  */
    1726                 :            : static noinline_for_stack
    1727                 :          0 : int replace_path(struct btrfs_trans_handle *trans,
    1728                 :          0 :                  struct btrfs_root *dest, struct btrfs_root *src,
    1729                 :            :                  struct btrfs_path *path, struct btrfs_key *next_key,
    1730                 :            :                  int lowest_level, int max_level)
    1731                 :            : {
    1732                 :            :         struct extent_buffer *eb;
    1733                 :          0 :         struct extent_buffer *parent;
    1734                 :            :         struct btrfs_key key;
    1735                 :            :         u64 old_bytenr;
    1736                 :            :         u64 new_bytenr;
    1737                 :            :         u64 old_ptr_gen;
    1738                 :            :         u64 new_ptr_gen;
    1739                 :            :         u64 last_snapshot;
    1740                 :            :         u32 blocksize;
    1741                 :            :         int cow = 0;
    1742                 :            :         int level;
    1743                 :            :         int ret;
    1744                 :            :         int slot;
    1745                 :            : 
    1746         [ #  # ]:          0 :         BUG_ON(src->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID);
    1747         [ #  # ]:          0 :         BUG_ON(dest->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID);
    1748                 :            : 
    1749                 :            :         last_snapshot = btrfs_root_last_snapshot(&src->root_item);
    1750                 :            : again:
    1751                 :          0 :         slot = path->slots[lowest_level];
    1752                 :          0 :         btrfs_node_key_to_cpu(path->nodes[lowest_level], &key, slot);
    1753                 :            : 
    1754                 :          0 :         eb = btrfs_lock_root_node(dest);
    1755                 :          0 :         btrfs_set_lock_blocking(eb);
    1756                 :          0 :         level = btrfs_header_level(eb);
    1757                 :            : 
    1758         [ #  # ]:          0 :         if (level < lowest_level) {
    1759                 :          0 :                 btrfs_tree_unlock(eb);
    1760                 :          0 :                 free_extent_buffer(eb);
    1761                 :          0 :                 return 0;
    1762                 :            :         }
    1763                 :            : 
    1764         [ #  # ]:          0 :         if (cow) {
    1765                 :          0 :                 ret = btrfs_cow_block(trans, dest, eb, NULL, 0, &eb);
    1766         [ #  # ]:          0 :                 BUG_ON(ret);
    1767                 :            :         }
    1768                 :          0 :         btrfs_set_lock_blocking(eb);
    1769                 :            : 
    1770         [ #  # ]:          0 :         if (next_key) {
    1771                 :          0 :                 next_key->objectid = (u64)-1;
    1772                 :          0 :                 next_key->type = (u8)-1;
    1773                 :          0 :                 next_key->offset = (u64)-1;
    1774                 :            :         }
    1775                 :            : 
    1776                 :          0 :         parent = eb;
    1777                 :            :         while (1) {
    1778                 :          0 :                 level = btrfs_header_level(parent);
    1779         [ #  # ]:          0 :                 BUG_ON(level < lowest_level);
    1780                 :            : 
    1781                 :          0 :                 ret = btrfs_bin_search(parent, &key, level, &slot);
    1782 [ #  # ][ #  # ]:          0 :                 if (ret && slot > 0)
    1783                 :          0 :                         slot--;
    1784                 :            : 
    1785   [ #  #  #  # ]:          0 :                 if (next_key && slot + 1 < btrfs_header_nritems(parent))
    1786                 :          0 :                         btrfs_node_key_to_cpu(parent, next_key, slot + 1);
    1787                 :            : 
    1788                 :          0 :                 old_bytenr = btrfs_node_blockptr(parent, slot);
    1789                 :            :                 blocksize = btrfs_level_size(dest, level - 1);
    1790                 :          0 :                 old_ptr_gen = btrfs_node_ptr_generation(parent, slot);
    1791                 :            : 
    1792         [ #  # ]:          0 :                 if (level <= max_level) {
    1793                 :          0 :                         eb = path->nodes[level];
    1794                 :          0 :                         new_bytenr = btrfs_node_blockptr(eb,
    1795                 :            :                                                         path->slots[level]);
    1796                 :          0 :                         new_ptr_gen = btrfs_node_ptr_generation(eb,
    1797                 :            :                                                         path->slots[level]);
    1798                 :            :                 } else {
    1799                 :            :                         new_bytenr = 0;
    1800                 :            :                         new_ptr_gen = 0;
    1801                 :            :                 }
    1802                 :            : 
    1803 [ #  # ][ #  # ]:          0 :                 if (WARN_ON(new_bytenr > 0 && new_bytenr == old_bytenr)) {
    1804                 :            :                         ret = level;
    1805                 :            :                         break;
    1806                 :            :                 }
    1807                 :            : 
    1808   [ #  #  #  # ]:          0 :                 if (new_bytenr == 0 || old_ptr_gen > last_snapshot ||
    1809                 :          0 :                     memcmp_node_keys(parent, slot, path, level)) {
    1810         [ #  # ]:          0 :                         if (level <= lowest_level) {
    1811                 :            :                                 ret = 0;
    1812                 :            :                                 break;
    1813                 :            :                         }
    1814                 :            : 
    1815                 :          0 :                         eb = read_tree_block(dest, old_bytenr, blocksize,
    1816                 :            :                                              old_ptr_gen);
    1817 [ #  # ][ #  # ]:          0 :                         if (!eb || !extent_buffer_uptodate(eb)) {
    1818         [ #  # ]:          0 :                                 ret = (!eb) ? -ENOMEM : -EIO;
    1819                 :          0 :                                 free_extent_buffer(eb);
    1820                 :          0 :                                 break;
    1821                 :            :                         }
    1822                 :          0 :                         btrfs_tree_lock(eb);
    1823         [ #  # ]:          0 :                         if (cow) {
    1824                 :          0 :                                 ret = btrfs_cow_block(trans, dest, eb, parent,
    1825                 :            :                                                       slot, &eb);
    1826         [ #  # ]:          0 :                                 BUG_ON(ret);
    1827                 :            :                         }
    1828                 :          0 :                         btrfs_set_lock_blocking(eb);
    1829                 :            : 
    1830                 :          0 :                         btrfs_tree_unlock(parent);
    1831                 :          0 :                         free_extent_buffer(parent);
    1832                 :            : 
    1833                 :          0 :                         parent = eb;
    1834                 :          0 :                         continue;
    1835                 :            :                 }
    1836                 :            : 
    1837         [ #  # ]:          0 :                 if (!cow) {
    1838                 :          0 :                         btrfs_tree_unlock(parent);
    1839                 :          0 :                         free_extent_buffer(parent);
    1840                 :            :                         cow = 1;
    1841                 :          0 :                         goto again;
    1842                 :            :                 }
    1843                 :            : 
    1844                 :          0 :                 btrfs_node_key_to_cpu(path->nodes[level], &key,
    1845                 :            :                                       path->slots[level]);
    1846                 :          0 :                 btrfs_release_path(path);
    1847                 :            : 
    1848                 :          0 :                 path->lowest_level = level;
    1849                 :          0 :                 ret = btrfs_search_slot(trans, src, &key, path, 0, 1);
    1850                 :          0 :                 path->lowest_level = 0;
    1851         [ #  # ]:          0 :                 BUG_ON(ret);
    1852                 :            : 
    1853                 :            :                 /*
    1854                 :            :                  * swap blocks in fs tree and reloc tree.
    1855                 :            :                  */
    1856                 :          0 :                 btrfs_set_node_blockptr(parent, slot, new_bytenr);
    1857                 :          0 :                 btrfs_set_node_ptr_generation(parent, slot, new_ptr_gen);
    1858                 :          0 :                 btrfs_mark_buffer_dirty(parent);
    1859                 :            : 
    1860                 :          0 :                 btrfs_set_node_blockptr(path->nodes[level],
    1861                 :            :                                         path->slots[level], old_bytenr);
    1862                 :          0 :                 btrfs_set_node_ptr_generation(path->nodes[level],
    1863                 :            :                                               path->slots[level], old_ptr_gen);
    1864                 :          0 :                 btrfs_mark_buffer_dirty(path->nodes[level]);
    1865                 :            : 
    1866                 :          0 :                 ret = btrfs_inc_extent_ref(trans, src, old_bytenr, blocksize,
    1867                 :          0 :                                         path->nodes[level]->start,
    1868                 :          0 :                                         src->root_key.objectid, level - 1, 0,
    1869                 :            :                                         1);
    1870         [ #  # ]:          0 :                 BUG_ON(ret);
    1871                 :          0 :                 ret = btrfs_inc_extent_ref(trans, dest, new_bytenr, blocksize,
    1872                 :            :                                         0, dest->root_key.objectid, level - 1,
    1873                 :            :                                         0, 1);
    1874         [ #  # ]:          0 :                 BUG_ON(ret);
    1875                 :            : 
    1876                 :          0 :                 ret = btrfs_free_extent(trans, src, new_bytenr, blocksize,
    1877                 :          0 :                                         path->nodes[level]->start,
    1878                 :            :                                         src->root_key.objectid, level - 1, 0,
    1879                 :            :                                         1);
    1880         [ #  # ]:          0 :                 BUG_ON(ret);
    1881                 :            : 
    1882                 :          0 :                 ret = btrfs_free_extent(trans, dest, old_bytenr, blocksize,
    1883                 :            :                                         0, dest->root_key.objectid, level - 1,
    1884                 :            :                                         0, 1);
    1885         [ #  # ]:          0 :                 BUG_ON(ret);
    1886                 :            : 
    1887                 :          0 :                 btrfs_unlock_up_safe(path, 0);
    1888                 :            : 
    1889                 :            :                 ret = level;
    1890                 :          0 :                 break;
    1891                 :          0 :         }
    1892                 :          0 :         btrfs_tree_unlock(parent);
    1893                 :          0 :         free_extent_buffer(parent);
    1894                 :          0 :         return ret;
    1895                 :            : }
    1896                 :            : 
    1897                 :            : /*
    1898                 :            :  * helper to find next relocated block in reloc tree
    1899                 :            :  */
    1900                 :            : static noinline_for_stack
    1901                 :          0 : int walk_up_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
    1902                 :            :                        int *level)
    1903                 :            : {
    1904                 :          0 :         struct extent_buffer *eb;
    1905                 :            :         int i;
    1906                 :            :         u64 last_snapshot;
    1907                 :            :         u32 nritems;
    1908                 :            : 
    1909                 :            :         last_snapshot = btrfs_root_last_snapshot(&root->root_item);
    1910                 :            : 
    1911         [ #  # ]:          0 :         for (i = 0; i < *level; i++) {
    1912                 :          0 :                 free_extent_buffer(path->nodes[i]);
    1913                 :          0 :                 path->nodes[i] = NULL;
    1914                 :            :         }
    1915                 :            : 
    1916 [ #  # ][ #  # ]:          0 :         for (i = *level; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) {
    1917                 :            :                 eb = path->nodes[i];
    1918                 :            :                 nritems = btrfs_header_nritems(eb);
    1919         [ #  # ]:          0 :                 while (path->slots[i] + 1 < nritems) {
    1920                 :          0 :                         path->slots[i]++;
    1921         [ #  # ]:          0 :                         if (btrfs_node_ptr_generation(eb, path->slots[i]) <=
    1922                 :            :                             last_snapshot)
    1923                 :          0 :                                 continue;
    1924                 :            : 
    1925                 :          0 :                         *level = i;
    1926                 :          0 :                         return 0;
    1927                 :            :                 }
    1928                 :          0 :                 free_extent_buffer(path->nodes[i]);
    1929                 :          0 :                 path->nodes[i] = NULL;
    1930                 :            :         }
    1931                 :            :         return 1;
    1932                 :            : }
    1933                 :            : 
    1934                 :            : /*
    1935                 :            :  * walk down reloc tree to find relocated block of lowest level
    1936                 :            :  */
    1937                 :            : static noinline_for_stack
    1938                 :          0 : int walk_down_reloc_tree(struct btrfs_root *root, struct btrfs_path *path,
    1939                 :            :                          int *level)
    1940                 :            : {
    1941                 :          0 :         struct extent_buffer *eb = NULL;
    1942                 :            :         int i;
    1943                 :            :         u64 bytenr;
    1944                 :            :         u64 ptr_gen = 0;
    1945                 :            :         u64 last_snapshot;
    1946                 :            :         u32 blocksize;
    1947                 :            :         u32 nritems;
    1948                 :            : 
    1949                 :            :         last_snapshot = btrfs_root_last_snapshot(&root->root_item);
    1950                 :            : 
    1951         [ #  # ]:          0 :         for (i = *level; i > 0; i--) {
    1952                 :          0 :                 eb = path->nodes[i];
    1953                 :            :                 nritems = btrfs_header_nritems(eb);
    1954         [ #  # ]:          0 :                 while (path->slots[i] < nritems) {
    1955                 :            :                         ptr_gen = btrfs_node_ptr_generation(eb, path->slots[i]);
    1956         [ #  # ]:          0 :                         if (ptr_gen > last_snapshot)
    1957                 :            :                                 break;
    1958                 :          0 :                         path->slots[i]++;
    1959                 :            :                 }
    1960         [ #  # ]:          0 :                 if (path->slots[i] >= nritems) {
    1961         [ #  # ]:          0 :                         if (i == *level)
    1962                 :            :                                 break;
    1963                 :          0 :                         *level = i + 1;
    1964                 :          0 :                         return 0;
    1965                 :            :                 }
    1966         [ #  # ]:          0 :                 if (i == 1) {
    1967                 :          0 :                         *level = i;
    1968                 :          0 :                         return 0;
    1969                 :            :                 }
    1970                 :            : 
    1971                 :            :                 bytenr = btrfs_node_blockptr(eb, path->slots[i]);
    1972                 :            :                 blocksize = btrfs_level_size(root, i - 1);
    1973                 :          0 :                 eb = read_tree_block(root, bytenr, blocksize, ptr_gen);
    1974 [ #  # ][ #  # ]:          0 :                 if (!eb || !extent_buffer_uptodate(eb)) {
    1975                 :          0 :                         free_extent_buffer(eb);
    1976                 :          0 :                         return -EIO;
    1977                 :            :                 }
    1978         [ #  # ]:          0 :                 BUG_ON(btrfs_header_level(eb) != i - 1);
    1979                 :          0 :                 path->nodes[i - 1] = eb;
    1980                 :          0 :                 path->slots[i - 1] = 0;
    1981                 :            :         }
    1982                 :            :         return 1;
    1983                 :            : }
    1984                 :            : 
    1985                 :            : /*
    1986                 :            :  * invalidate extent cache for file extents whose key in range of
    1987                 :            :  * [min_key, max_key)
    1988                 :            :  */
    1989                 :          0 : static int invalidate_extent_cache(struct btrfs_root *root,
    1990                 :            :                                    struct btrfs_key *min_key,
    1991                 :            :                                    struct btrfs_key *max_key)
    1992                 :            : {
    1993                 :            :         struct inode *inode = NULL;
    1994                 :            :         u64 objectid;
    1995                 :            :         u64 start, end;
    1996                 :            :         u64 ino;
    1997                 :            : 
    1998                 :          0 :         objectid = min_key->objectid;
    1999                 :            :         while (1) {
    2000                 :          0 :                 cond_resched();
    2001                 :          0 :                 iput(inode);
    2002                 :            : 
    2003         [ #  # ]:          0 :                 if (objectid > max_key->objectid)
    2004                 :            :                         break;
    2005                 :            : 
    2006                 :          0 :                 inode = find_next_inode(root, objectid);
    2007         [ #  # ]:          0 :                 if (!inode)
    2008                 :            :                         break;
    2009                 :            :                 ino = btrfs_ino(inode);
    2010                 :            : 
    2011         [ #  # ]:          0 :                 if (ino > max_key->objectid) {
    2012                 :          0 :                         iput(inode);
    2013                 :          0 :                         break;
    2014                 :            :                 }
    2015                 :            : 
    2016                 :          0 :                 objectid = ino + 1;
    2017         [ #  # ]:          0 :                 if (!S_ISREG(inode->i_mode))
    2018                 :          0 :                         continue;
    2019                 :            : 
    2020         [ #  # ]:          0 :                 if (unlikely(min_key->objectid == ino)) {
    2021         [ #  # ]:          0 :                         if (min_key->type > BTRFS_EXTENT_DATA_KEY)
    2022                 :          0 :                                 continue;
    2023         [ #  # ]:          0 :                         if (min_key->type < BTRFS_EXTENT_DATA_KEY)
    2024                 :            :                                 start = 0;
    2025                 :            :                         else {
    2026                 :          0 :                                 start = min_key->offset;
    2027         [ #  # ]:          0 :                                 WARN_ON(!IS_ALIGNED(start, root->sectorsize));
    2028                 :            :                         }
    2029                 :            :                 } else {
    2030                 :            :                         start = 0;
    2031                 :            :                 }
    2032                 :            : 
    2033         [ #  # ]:          0 :                 if (unlikely(max_key->objectid == ino)) {
    2034         [ #  # ]:          0 :                         if (max_key->type < BTRFS_EXTENT_DATA_KEY)
    2035                 :          0 :                                 continue;
    2036         [ #  # ]:          0 :                         if (max_key->type > BTRFS_EXTENT_DATA_KEY) {
    2037                 :            :                                 end = (u64)-1;
    2038                 :            :                         } else {
    2039         [ #  # ]:          0 :                                 if (max_key->offset == 0)
    2040                 :          0 :                                         continue;
    2041                 :            :                                 end = max_key->offset;
    2042         [ #  # ]:          0 :                                 WARN_ON(!IS_ALIGNED(end, root->sectorsize));
    2043                 :          0 :                                 end--;
    2044                 :            :                         }
    2045                 :            :                 } else {
    2046                 :            :                         end = (u64)-1;
    2047                 :            :                 }
    2048                 :            : 
    2049                 :            :                 /* the lock_extent waits for readpage to complete */
    2050                 :          0 :                 lock_extent(&BTRFS_I(inode)->io_tree, start, end);
    2051                 :          0 :                 btrfs_drop_extent_cache(inode, start, end, 1);
    2052                 :          0 :                 unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
    2053                 :            :         }
    2054                 :          0 :         return 0;
    2055                 :            : }
    2056                 :            : 
    2057                 :          0 : static int find_next_key(struct btrfs_path *path, int level,
    2058                 :            :                          struct btrfs_key *key)
    2059                 :            : 
    2060                 :            : {
    2061         [ #  # ]:          0 :         while (level < BTRFS_MAX_LEVEL) {
    2062         [ #  # ]:          0 :                 if (!path->nodes[level])
    2063                 :            :                         break;
    2064         [ #  # ]:          0 :                 if (path->slots[level] + 1 <
    2065                 :            :                     btrfs_header_nritems(path->nodes[level])) {
    2066                 :          0 :                         btrfs_node_key_to_cpu(path->nodes[level], key,
    2067                 :          0 :                                               path->slots[level] + 1);
    2068                 :          0 :                         return 0;
    2069                 :            :                 }
    2070                 :          0 :                 level++;
    2071                 :            :         }
    2072                 :            :         return 1;
    2073                 :            : }
    2074                 :            : 
    2075                 :            : /*
    2076                 :            :  * merge the relocated tree blocks in reloc tree with corresponding
    2077                 :            :  * fs tree.
    2078                 :            :  */
    2079                 :          0 : static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
    2080                 :            :                                                struct btrfs_root *root)
    2081                 :            : {
    2082                 :          0 :         LIST_HEAD(inode_list);
    2083                 :            :         struct btrfs_key key;
    2084                 :            :         struct btrfs_key next_key;
    2085                 :            :         struct btrfs_trans_handle *trans = NULL;
    2086                 :            :         struct btrfs_root *reloc_root;
    2087                 :          0 :         struct btrfs_root_item *root_item;
    2088                 :            :         struct btrfs_path *path;
    2089                 :            :         struct extent_buffer *leaf;
    2090                 :            :         int level;
    2091                 :            :         int max_level;
    2092                 :            :         int replaced = 0;
    2093                 :            :         int ret;
    2094                 :            :         int err = 0;
    2095                 :            :         u32 min_reserved;
    2096                 :            : 
    2097                 :          0 :         path = btrfs_alloc_path();
    2098         [ #  # ]:          0 :         if (!path)
    2099                 :            :                 return -ENOMEM;
    2100                 :          0 :         path->reada = 1;
    2101                 :            : 
    2102                 :          0 :         reloc_root = root->reloc_root;
    2103                 :            :         root_item = &reloc_root->root_item;
    2104                 :            : 
    2105         [ #  # ]:          0 :         if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
    2106                 :          0 :                 level = btrfs_root_level(root_item);
    2107                 :          0 :                 extent_buffer_get(reloc_root->node);
    2108                 :          0 :                 path->nodes[level] = reloc_root->node;
    2109                 :          0 :                 path->slots[level] = 0;
    2110                 :            :         } else {
    2111                 :            :                 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
    2112                 :            : 
    2113                 :          0 :                 level = root_item->drop_level;
    2114         [ #  # ]:          0 :                 BUG_ON(level == 0);
    2115                 :          0 :                 path->lowest_level = level;
    2116                 :          0 :                 ret = btrfs_search_slot(NULL, reloc_root, &key, path, 0, 0);
    2117                 :          0 :                 path->lowest_level = 0;
    2118         [ #  # ]:          0 :                 if (ret < 0) {
    2119                 :          0 :                         btrfs_free_path(path);
    2120                 :          0 :                         return ret;
    2121                 :            :                 }
    2122                 :            : 
    2123                 :          0 :                 btrfs_node_key_to_cpu(path->nodes[level], &next_key,
    2124                 :            :                                       path->slots[level]);
    2125         [ #  # ]:          0 :                 WARN_ON(memcmp(&key, &next_key, sizeof(key)));
    2126                 :            : 
    2127                 :          0 :                 btrfs_unlock_up_safe(path, 0);
    2128                 :            :         }
    2129                 :            : 
    2130                 :          0 :         min_reserved = root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
    2131                 :          0 :         memset(&next_key, 0, sizeof(next_key));
    2132                 :            : 
    2133                 :            :         while (1) {
    2134                 :          0 :                 ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved,
    2135                 :            :                                              BTRFS_RESERVE_FLUSH_ALL);
    2136         [ #  # ]:          0 :                 if (ret) {
    2137                 :            :                         err = ret;
    2138                 :            :                         goto out;
    2139                 :            :                 }
    2140                 :          0 :                 trans = btrfs_start_transaction(root, 0);
    2141         [ #  # ]:          0 :                 if (IS_ERR(trans)) {
    2142                 :            :                         err = PTR_ERR(trans);
    2143                 :            :                         trans = NULL;
    2144                 :          0 :                         goto out;
    2145                 :            :                 }
    2146                 :          0 :                 trans->block_rsv = rc->block_rsv;
    2147                 :            : 
    2148                 :            :                 replaced = 0;
    2149                 :          0 :                 max_level = level;
    2150                 :            : 
    2151                 :          0 :                 ret = walk_down_reloc_tree(reloc_root, path, &level);
    2152         [ #  # ]:          0 :                 if (ret < 0) {
    2153                 :            :                         err = ret;
    2154                 :            :                         goto out;
    2155                 :            :                 }
    2156         [ #  # ]:          0 :                 if (ret > 0)
    2157                 :            :                         break;
    2158                 :            : 
    2159   [ #  #  #  # ]:          0 :                 if (!find_next_key(path, level, &key) &&
    2160                 :          0 :                     btrfs_comp_cpu_keys(&next_key, &key) >= 0) {
    2161                 :            :                         ret = 0;
    2162                 :            :                 } else {
    2163                 :          0 :                         ret = replace_path(trans, root, reloc_root, path,
    2164                 :            :                                            &next_key, level, max_level);
    2165                 :            :                 }
    2166         [ #  # ]:          0 :                 if (ret < 0) {
    2167                 :            :                         err = ret;
    2168                 :            :                         goto out;
    2169                 :            :                 }
    2170                 :            : 
    2171         [ #  # ]:          0 :                 if (ret > 0) {
    2172                 :          0 :                         level = ret;
    2173                 :          0 :                         btrfs_node_key_to_cpu(path->nodes[level], &key,
    2174                 :            :                                               path->slots[level]);
    2175                 :            :                         replaced = 1;
    2176                 :            :                 }
    2177                 :            : 
    2178                 :          0 :                 ret = walk_up_reloc_tree(reloc_root, path, &level);
    2179         [ #  # ]:          0 :                 if (ret > 0)
    2180                 :            :                         break;
    2181                 :            : 
    2182         [ #  # ]:          0 :                 BUG_ON(level == 0);
    2183                 :            :                 /*
    2184                 :            :                  * save the merging progress in the drop_progress.
    2185                 :            :                  * this is OK since root refs == 1 in this case.
    2186                 :            :                  */
    2187                 :          0 :                 btrfs_node_key(path->nodes[level], &root_item->drop_progress,
    2188                 :            :                                path->slots[level]);
    2189                 :          0 :                 root_item->drop_level = level;
    2190                 :            : 
    2191                 :          0 :                 btrfs_end_transaction_throttle(trans, root);
    2192                 :            :                 trans = NULL;
    2193                 :            : 
    2194                 :          0 :                 btrfs_btree_balance_dirty(root);
    2195                 :            : 
    2196 [ #  # ][ #  # ]:          0 :                 if (replaced && rc->stage == UPDATE_DATA_PTRS)
    2197                 :          0 :                         invalidate_extent_cache(root, &key, &next_key);
    2198                 :            :         }
    2199                 :            : 
    2200                 :            :         /*
    2201                 :            :          * handle the case only one block in the fs tree need to be
    2202                 :            :          * relocated and the block is tree root.
    2203                 :            :          */
    2204                 :          0 :         leaf = btrfs_lock_root_node(root);
    2205                 :          0 :         ret = btrfs_cow_block(trans, root, leaf, NULL, 0, &leaf);
    2206                 :          0 :         btrfs_tree_unlock(leaf);
    2207                 :          0 :         free_extent_buffer(leaf);
    2208         [ #  # ]:          0 :         if (ret < 0)
    2209                 :            :                 err = ret;
    2210                 :            : out:
    2211                 :          0 :         btrfs_free_path(path);
    2212                 :            : 
    2213         [ #  # ]:          0 :         if (err == 0) {
    2214                 :          0 :                 memset(&root_item->drop_progress, 0,
    2215                 :            :                        sizeof(root_item->drop_progress));
    2216                 :          0 :                 root_item->drop_level = 0;
    2217                 :            :                 btrfs_set_root_refs(root_item, 0);
    2218                 :          0 :                 btrfs_update_reloc_root(trans, root);
    2219                 :            :         }
    2220                 :            : 
    2221         [ #  # ]:          0 :         if (trans)
    2222                 :          0 :                 btrfs_end_transaction_throttle(trans, root);
    2223                 :            : 
    2224                 :          0 :         btrfs_btree_balance_dirty(root);
    2225                 :            : 
    2226 [ #  # ][ #  # ]:          0 :         if (replaced && rc->stage == UPDATE_DATA_PTRS)
    2227                 :          0 :                 invalidate_extent_cache(root, &key, &next_key);
    2228                 :            : 
    2229                 :          0 :         return err;
    2230                 :            : }
    2231                 :            : 
    2232                 :            : static noinline_for_stack
    2233                 :          0 : int prepare_to_merge(struct reloc_control *rc, int err)
    2234                 :            : {
    2235                 :          0 :         struct btrfs_root *root = rc->extent_root;
    2236                 :            :         struct btrfs_root *reloc_root;
    2237                 :            :         struct btrfs_trans_handle *trans;
    2238                 :          0 :         LIST_HEAD(reloc_roots);
    2239                 :            :         u64 num_bytes = 0;
    2240                 :            :         int ret;
    2241                 :            : 
    2242                 :          0 :         mutex_lock(&root->fs_info->reloc_mutex);
    2243                 :          0 :         rc->merging_rsv_size += root->nodesize * (BTRFS_MAX_LEVEL - 1) * 2;
    2244                 :          0 :         rc->merging_rsv_size += rc->nodes_relocated * 2;
    2245                 :          0 :         mutex_unlock(&root->fs_info->reloc_mutex);
    2246                 :            : 
    2247                 :            : again:
    2248         [ #  # ]:          0 :         if (!err) {
    2249                 :          0 :                 num_bytes = rc->merging_rsv_size;
    2250                 :          0 :                 ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes,
    2251                 :            :                                           BTRFS_RESERVE_FLUSH_ALL);
    2252         [ #  # ]:          0 :                 if (ret)
    2253                 :            :                         err = ret;
    2254                 :            :         }
    2255                 :            : 
    2256                 :          0 :         trans = btrfs_join_transaction(rc->extent_root);
    2257         [ #  # ]:          0 :         if (IS_ERR(trans)) {
    2258         [ #  # ]:          0 :                 if (!err)
    2259                 :          0 :                         btrfs_block_rsv_release(rc->extent_root,
    2260                 :            :                                                 rc->block_rsv, num_bytes);
    2261                 :          0 :                 return PTR_ERR(trans);
    2262                 :            :         }
    2263                 :            : 
    2264         [ #  # ]:          0 :         if (!err) {
    2265         [ #  # ]:          0 :                 if (num_bytes != rc->merging_rsv_size) {
    2266                 :          0 :                         btrfs_end_transaction(trans, rc->extent_root);
    2267                 :          0 :                         btrfs_block_rsv_release(rc->extent_root,
    2268                 :            :                                                 rc->block_rsv, num_bytes);
    2269                 :          0 :                         goto again;
    2270                 :            :                 }
    2271                 :            :         }
    2272                 :            : 
    2273                 :          0 :         rc->merge_reloc_tree = 1;
    2274                 :            : 
    2275         [ #  # ]:          0 :         while (!list_empty(&rc->reloc_roots)) {
    2276                 :          0 :                 reloc_root = list_entry(rc->reloc_roots.next,
    2277                 :            :                                         struct btrfs_root, root_list);
    2278                 :          0 :                 list_del_init(&reloc_root->root_list);
    2279                 :            : 
    2280                 :          0 :                 root = read_fs_root(reloc_root->fs_info,
    2281                 :            :                                     reloc_root->root_key.offset);
    2282         [ #  # ]:          0 :                 BUG_ON(IS_ERR(root));
    2283         [ #  # ]:          0 :                 BUG_ON(root->reloc_root != reloc_root);
    2284                 :            : 
    2285                 :            :                 /*
    2286                 :            :                  * set reference count to 1, so btrfs_recover_relocation
    2287                 :            :                  * knows it should resumes merging
    2288                 :            :                  */
    2289         [ #  # ]:          0 :                 if (!err)
    2290                 :            :                         btrfs_set_root_refs(&reloc_root->root_item, 1);
    2291                 :          0 :                 btrfs_update_reloc_root(trans, root);
    2292                 :            : 
    2293                 :            :                 list_add(&reloc_root->root_list, &reloc_roots);
    2294                 :            :         }
    2295                 :            : 
    2296                 :            :         list_splice(&reloc_roots, &rc->reloc_roots);
    2297                 :            : 
    2298         [ #  # ]:          0 :         if (!err)
    2299                 :          0 :                 btrfs_commit_transaction(trans, rc->extent_root);
    2300                 :            :         else
    2301                 :          0 :                 btrfs_end_transaction(trans, rc->extent_root);
    2302                 :          0 :         return err;
    2303                 :            : }
    2304                 :            : 
    2305                 :            : static noinline_for_stack
    2306                 :          0 : void free_reloc_roots(struct list_head *list)
    2307                 :            : {
    2308                 :            :         struct btrfs_root *reloc_root;
    2309                 :            : 
    2310         [ #  # ]:          0 :         while (!list_empty(list)) {
    2311                 :          0 :                 reloc_root = list_entry(list->next, struct btrfs_root,
    2312                 :            :                                         root_list);
    2313                 :          0 :                 __del_reloc_root(reloc_root);
    2314                 :            :         }
    2315                 :          0 : }
    2316                 :            : 
    2317                 :            : static noinline_for_stack
    2318                 :          0 : int merge_reloc_roots(struct reloc_control *rc)
    2319                 :            : {
    2320                 :            :         struct btrfs_trans_handle *trans;
    2321                 :            :         struct btrfs_root *root;
    2322                 :            :         struct btrfs_root *reloc_root;
    2323                 :            :         u64 last_snap;
    2324                 :            :         u64 otransid;
    2325                 :            :         u64 objectid;
    2326                 :          0 :         LIST_HEAD(reloc_roots);
    2327                 :            :         int found = 0;
    2328                 :            :         int ret = 0;
    2329                 :            : again:
    2330                 :          0 :         root = rc->extent_root;
    2331                 :            : 
    2332                 :            :         /*
    2333                 :            :          * this serializes us with btrfs_record_root_in_transaction,
    2334                 :            :          * we have to make sure nobody is in the middle of
    2335                 :            :          * adding their roots to the list while we are
    2336                 :            :          * doing this splice
    2337                 :            :          */
    2338                 :          0 :         mutex_lock(&root->fs_info->reloc_mutex);
    2339                 :          0 :         list_splice_init(&rc->reloc_roots, &reloc_roots);
    2340                 :          0 :         mutex_unlock(&root->fs_info->reloc_mutex);
    2341                 :            : 
    2342         [ #  # ]:          0 :         while (!list_empty(&reloc_roots)) {
    2343                 :            :                 found = 1;
    2344                 :          0 :                 reloc_root = list_entry(reloc_roots.next,
    2345                 :            :                                         struct btrfs_root, root_list);
    2346                 :            : 
    2347         [ #  # ]:          0 :                 if (btrfs_root_refs(&reloc_root->root_item) > 0) {
    2348                 :          0 :                         root = read_fs_root(reloc_root->fs_info,
    2349                 :            :                                             reloc_root->root_key.offset);
    2350         [ #  # ]:          0 :                         BUG_ON(IS_ERR(root));
    2351         [ #  # ]:          0 :                         BUG_ON(root->reloc_root != reloc_root);
    2352                 :            : 
    2353                 :          0 :                         ret = merge_reloc_root(rc, root);
    2354         [ #  # ]:          0 :                         if (ret) {
    2355         [ #  # ]:          0 :                                 if (list_empty(&reloc_root->root_list))
    2356                 :            :                                         list_add_tail(&reloc_root->root_list,
    2357                 :            :                                                       &reloc_roots);
    2358                 :            :                                 goto out;
    2359                 :            :                         }
    2360                 :            :                 } else {
    2361                 :          0 :                         list_del_init(&reloc_root->root_list);
    2362                 :            :                 }
    2363                 :            : 
    2364                 :            :                 /*
    2365                 :            :                  * we keep the old last snapshod transid in rtranid when we
    2366                 :            :                  * created the relocation tree.
    2367                 :            :                  */
    2368                 :            :                 last_snap = btrfs_root_rtransid(&reloc_root->root_item);
    2369                 :            :                 otransid = btrfs_root_otransid(&reloc_root->root_item);
    2370                 :          0 :                 objectid = reloc_root->root_key.offset;
    2371                 :            : 
    2372                 :          0 :                 ret = btrfs_drop_snapshot(reloc_root, rc->block_rsv, 0, 1);
    2373         [ #  # ]:          0 :                 if (ret < 0) {
    2374         [ #  # ]:          0 :                         if (list_empty(&reloc_root->root_list))
    2375                 :            :                                 list_add_tail(&reloc_root->root_list,
    2376                 :            :                                               &reloc_roots);
    2377                 :            :                         goto out;
    2378         [ #  # ]:          0 :                 } else if (!ret) {
    2379                 :            :                         /*
    2380                 :            :                          * recover the last snapshot tranid to avoid
    2381                 :            :                          * the space balance break NOCOW.
    2382                 :            :                          */
    2383                 :          0 :                         root = read_fs_root(rc->extent_root->fs_info,
    2384                 :            :                                             objectid);
    2385         [ #  # ]:          0 :                         if (IS_ERR(root))
    2386                 :          0 :                                 continue;
    2387                 :            : 
    2388                 :          0 :                         trans = btrfs_join_transaction(root);
    2389         [ #  # ]:          0 :                         BUG_ON(IS_ERR(trans));
    2390                 :            : 
    2391                 :            :                         /* Check if the fs/file tree was snapshoted or not. */
    2392         [ #  # ]:          0 :                         if (btrfs_root_last_snapshot(&root->root_item) ==
    2393                 :          0 :                             otransid - 1)
    2394                 :            :                                 btrfs_set_root_last_snapshot(&root->root_item,
    2395                 :            :                                                              last_snap);
    2396                 :            :                                 
    2397                 :          0 :                         btrfs_end_transaction(trans, root);
    2398                 :            :                 }
    2399                 :            :         }
    2400                 :            : 
    2401         [ #  # ]:          0 :         if (found) {
    2402                 :            :                 found = 0;
    2403                 :            :                 goto again;
    2404                 :            :         }
    2405                 :            : out:
    2406         [ #  # ]:          0 :         if (ret) {
    2407         [ #  # ]:          0 :                 btrfs_std_error(root->fs_info, ret);
    2408         [ #  # ]:          0 :                 if (!list_empty(&reloc_roots))
    2409                 :          0 :                         free_reloc_roots(&reloc_roots);
    2410                 :            : 
    2411                 :            :                 /* new reloc root may be added */
    2412                 :          0 :                 mutex_lock(&root->fs_info->reloc_mutex);
    2413                 :            :                 list_splice_init(&rc->reloc_roots, &reloc_roots);
    2414                 :          0 :                 mutex_unlock(&root->fs_info->reloc_mutex);
    2415         [ #  # ]:          0 :                 if (!list_empty(&reloc_roots))
    2416                 :          0 :                         free_reloc_roots(&reloc_roots);
    2417                 :            :         }
    2418                 :            : 
    2419         [ #  # ]:          0 :         BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root));
    2420                 :          0 :         return ret;
    2421                 :            : }
    2422                 :            : 
    2423                 :          0 : static void free_block_list(struct rb_root *blocks)
    2424                 :            : {
    2425                 :            :         struct tree_block *block;
    2426                 :            :         struct rb_node *rb_node;
    2427         [ #  # ]:          0 :         while ((rb_node = rb_first(blocks))) {
    2428                 :            :                 block = rb_entry(rb_node, struct tree_block, rb_node);
    2429                 :          0 :                 rb_erase(rb_node, blocks);
    2430                 :          0 :                 kfree(block);
    2431                 :            :         }
    2432                 :          0 : }
    2433                 :            : 
    2434                 :          0 : static int record_reloc_root_in_trans(struct btrfs_trans_handle *trans,
    2435                 :            :                                       struct btrfs_root *reloc_root)
    2436                 :            : {
    2437                 :            :         struct btrfs_root *root;
    2438                 :            : 
    2439         [ #  # ]:          0 :         if (reloc_root->last_trans == trans->transid)
    2440                 :            :                 return 0;
    2441                 :            : 
    2442                 :          0 :         root = read_fs_root(reloc_root->fs_info, reloc_root->root_key.offset);
    2443         [ #  # ]:          0 :         BUG_ON(IS_ERR(root));
    2444         [ #  # ]:          0 :         BUG_ON(root->reloc_root != reloc_root);
    2445                 :            : 
    2446                 :          0 :         return btrfs_record_root_in_trans(trans, root);
    2447                 :            : }
    2448                 :            : 
    2449                 :            : static noinline_for_stack
    2450                 :          0 : struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
    2451                 :            :                                      struct reloc_control *rc,
    2452                 :            :                                      struct backref_node *node,
    2453                 :            :                                      struct backref_edge *edges[])
    2454                 :            : {
    2455                 :            :         struct backref_node *next;
    2456                 :            :         struct btrfs_root *root;
    2457                 :          0 :         int index = 0;
    2458                 :            : 
    2459                 :            :         next = node;
    2460                 :            :         while (1) {
    2461                 :          0 :                 cond_resched();
    2462                 :          0 :                 next = walk_up_backref(next, edges, &index);
    2463                 :          0 :                 root = next->root;
    2464         [ #  # ]:          0 :                 BUG_ON(!root);
    2465         [ #  # ]:          0 :                 BUG_ON(!root->ref_cows);
    2466                 :            : 
    2467         [ #  # ]:          0 :                 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
    2468                 :          0 :                         record_reloc_root_in_trans(trans, root);
    2469                 :          0 :                         break;
    2470                 :            :                 }
    2471                 :            : 
    2472                 :          0 :                 btrfs_record_root_in_trans(trans, root);
    2473                 :          0 :                 root = root->reloc_root;
    2474                 :            : 
    2475         [ #  # ]:          0 :                 if (next->new_bytenr != root->node->start) {
    2476         [ #  # ]:          0 :                         BUG_ON(next->new_bytenr);
    2477         [ #  # ]:          0 :                         BUG_ON(!list_empty(&next->list));
    2478                 :          0 :                         next->new_bytenr = root->node->start;
    2479                 :          0 :                         next->root = root;
    2480                 :          0 :                         list_add_tail(&next->list,
    2481                 :            :                                       &rc->backref_cache.changed);
    2482                 :          0 :                         __mark_block_processed(rc, next);
    2483                 :          0 :                         break;
    2484                 :            :                 }
    2485                 :            : 
    2486                 :          0 :                 WARN_ON(1);
    2487                 :            :                 root = NULL;
    2488                 :            :                 next = walk_down_backref(edges, &index);
    2489 [ #  # ][ #  # ]:          0 :                 if (!next || next->level <= node->level)
    2490                 :            :                         break;
    2491                 :            :         }
    2492         [ #  # ]:          0 :         if (!root)
    2493                 :            :                 return NULL;
    2494                 :            : 
    2495                 :            :         next = node;
    2496                 :            :         /* setup backref node path for btrfs_reloc_cow_block */
    2497                 :            :         while (1) {
    2498                 :          0 :                 rc->backref_cache.path[next->level] = next;
    2499         [ #  # ]:          0 :                 if (--index < 0)
    2500                 :            :                         break;
    2501                 :          0 :                 next = edges[index]->node[UPPER];
    2502                 :          0 :         }
    2503                 :            :         return root;
    2504                 :            : }
    2505                 :            : 
    2506                 :            : /*
    2507                 :            :  * select a tree root for relocation. return NULL if the block
    2508                 :            :  * is reference counted. we should use do_relocation() in this
    2509                 :            :  * case. return a tree root pointer if the block isn't reference
    2510                 :            :  * counted. return -ENOENT if the block is root of reloc tree.
    2511                 :            :  */
    2512                 :            : static noinline_for_stack
    2513                 :          0 : struct btrfs_root *select_one_root(struct btrfs_trans_handle *trans,
    2514                 :            :                                    struct backref_node *node)
    2515                 :            : {
    2516                 :            :         struct backref_node *next;
    2517                 :            :         struct btrfs_root *root;
    2518                 :            :         struct btrfs_root *fs_root = NULL;
    2519                 :            :         struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
    2520                 :          0 :         int index = 0;
    2521                 :            : 
    2522                 :            :         next = node;
    2523                 :            :         while (1) {
    2524                 :          0 :                 cond_resched();
    2525                 :          0 :                 next = walk_up_backref(next, edges, &index);
    2526                 :          0 :                 root = next->root;
    2527         [ #  # ]:          0 :                 BUG_ON(!root);
    2528                 :            : 
    2529                 :            :                 /* no other choice for non-references counted tree */
    2530         [ #  # ]:          0 :                 if (!root->ref_cows)
    2531                 :            :                         return root;
    2532                 :            : 
    2533         [ #  # ]:          0 :                 if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID)
    2534                 :            :                         fs_root = root;
    2535                 :            : 
    2536         [ #  # ]:          0 :                 if (next != node)
    2537                 :            :                         return NULL;
    2538                 :            : 
    2539                 :            :                 next = walk_down_backref(edges, &index);
    2540 [ #  # ][ #  # ]:          0 :                 if (!next || next->level <= node->level)
    2541                 :            :                         break;
    2542                 :            :         }
    2543                 :            : 
    2544         [ #  # ]:          0 :         if (!fs_root)
    2545                 :            :                 return ERR_PTR(-ENOENT);
    2546                 :            :         return fs_root;
    2547                 :            : }
    2548                 :            : 
    2549                 :            : static noinline_for_stack
    2550                 :          0 : u64 calcu_metadata_size(struct reloc_control *rc,
    2551                 :            :                         struct backref_node *node, int reserve)
    2552                 :            : {
    2553                 :            :         struct backref_node *next = node;
    2554                 :            :         struct backref_edge *edge;
    2555                 :            :         struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
    2556                 :            :         u64 num_bytes = 0;
    2557                 :            :         int index = 0;
    2558                 :            : 
    2559 [ #  # ][ #  # ]:          0 :         BUG_ON(reserve && node->processed);
    2560                 :            : 
    2561         [ #  # ]:          0 :         while (next) {
    2562                 :          0 :                 cond_resched();
    2563                 :            :                 while (1) {
    2564 [ #  # ][ #  # ]:          0 :                         if (next->processed && (reserve || next != node))
    2565                 :            :                                 break;
    2566                 :            : 
    2567                 :          0 :                         num_bytes += btrfs_level_size(rc->extent_root,
    2568                 :          0 :                                                       next->level);
    2569                 :            : 
    2570         [ #  # ]:          0 :                         if (list_empty(&next->upper))
    2571                 :            :                                 break;
    2572                 :            : 
    2573                 :            :                         edge = list_entry(next->upper.next,
    2574                 :            :                                           struct backref_edge, list[LOWER]);
    2575                 :          0 :                         edges[index++] = edge;
    2576                 :          0 :                         next = edge->node[UPPER];
    2577                 :            :                 }
    2578                 :            :                 next = walk_down_backref(edges, &index);
    2579                 :            :         }
    2580                 :          0 :         return num_bytes;
    2581                 :            : }
    2582                 :            : 
    2583                 :          0 : static int reserve_metadata_space(struct btrfs_trans_handle *trans,
    2584                 :            :                                   struct reloc_control *rc,
    2585                 :            :                                   struct backref_node *node)
    2586                 :            : {
    2587                 :          0 :         struct btrfs_root *root = rc->extent_root;
    2588                 :            :         u64 num_bytes;
    2589                 :            :         int ret;
    2590                 :            :         u64 tmp;
    2591                 :            : 
    2592                 :          0 :         num_bytes = calcu_metadata_size(rc, node, 1) * 2;
    2593                 :            : 
    2594                 :          0 :         trans->block_rsv = rc->block_rsv;
    2595                 :          0 :         rc->reserved_bytes += num_bytes;
    2596                 :          0 :         ret = btrfs_block_rsv_refill(root, rc->block_rsv, num_bytes,
    2597                 :            :                                 BTRFS_RESERVE_FLUSH_ALL);
    2598         [ #  # ]:          0 :         if (ret) {
    2599         [ #  # ]:          0 :                 if (ret == -EAGAIN) {
    2600                 :          0 :                         tmp = rc->extent_root->nodesize *
    2601                 :            :                                 RELOCATION_RESERVED_NODES;
    2602         [ #  # ]:          0 :                         while (tmp <= rc->reserved_bytes)
    2603                 :          0 :                                 tmp <<= 1;
    2604                 :            :                         /*
    2605                 :            :                          * only one thread can access block_rsv at this point,
    2606                 :            :                          * so we don't need hold lock to protect block_rsv.
    2607                 :            :                          * we expand more reservation size here to allow enough
    2608                 :            :                          * space for relocation and we will return eailer in
    2609                 :            :                          * enospc case.
    2610                 :            :                          */
    2611                 :          0 :                         rc->block_rsv->size = tmp + rc->extent_root->nodesize *
    2612                 :            :                                               RELOCATION_RESERVED_NODES;
    2613                 :            :                 }
    2614                 :            :                 return ret;
    2615                 :            :         }
    2616                 :            : 
    2617                 :            :         return 0;
    2618                 :            : }
    2619                 :            : 
    2620                 :            : /*
    2621                 :            :  * relocate a block tree, and then update pointers in upper level
    2622                 :            :  * blocks that reference the block to point to the new location.
    2623                 :            :  *
    2624                 :            :  * if called by link_to_upper, the block has already been relocated.
    2625                 :            :  * in that case this function just updates pointers.
    2626                 :            :  */
    2627                 :          0 : static int do_relocation(struct btrfs_trans_handle *trans,
    2628                 :            :                          struct reloc_control *rc,
    2629                 :            :                          struct backref_node *node,
    2630                 :            :                          struct btrfs_key *key,
    2631                 :            :                          struct btrfs_path *path, int lowest)
    2632                 :            : {
    2633                 :            :         struct backref_node *upper;
    2634                 :            :         struct backref_edge *edge;
    2635                 :            :         struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
    2636                 :          0 :         struct btrfs_root *root;
    2637                 :            :         struct extent_buffer *eb;
    2638                 :            :         u32 blocksize;
    2639                 :            :         u64 bytenr;
    2640                 :            :         u64 generation;
    2641                 :            :         int slot;
    2642                 :            :         int ret;
    2643                 :            :         int err = 0;
    2644                 :            : 
    2645 [ #  # ][ #  # ]:          0 :         BUG_ON(lowest && node->eb);
    2646                 :            : 
    2647                 :          0 :         path->lowest_level = node->level + 1;
    2648                 :          0 :         rc->backref_cache.path[node->level] = node;
    2649         [ #  # ]:          0 :         list_for_each_entry(edge, &node->upper, list[LOWER]) {
    2650                 :          0 :                 cond_resched();
    2651                 :            : 
    2652                 :          0 :                 upper = edge->node[UPPER];
    2653                 :          0 :                 root = select_reloc_root(trans, rc, upper, edges);
    2654         [ #  # ]:          0 :                 BUG_ON(!root);
    2655                 :            : 
    2656 [ #  # ][ #  # ]:          0 :                 if (upper->eb && !upper->locked) {
    2657         [ #  # ]:          0 :                         if (!lowest) {
    2658                 :          0 :                                 ret = btrfs_bin_search(upper->eb, key,
    2659                 :          0 :                                                        upper->level, &slot);
    2660         [ #  # ]:          0 :                                 BUG_ON(ret);
    2661                 :          0 :                                 bytenr = btrfs_node_blockptr(upper->eb, slot);
    2662         [ #  # ]:          0 :                                 if (node->eb->start == bytenr)
    2663                 :            :                                         goto next;
    2664                 :            :                         }
    2665                 :          0 :                         drop_node_buffer(upper);
    2666                 :            :                 }
    2667                 :            : 
    2668         [ #  # ]:          0 :                 if (!upper->eb) {
    2669                 :          0 :                         ret = btrfs_search_slot(trans, root, key, path, 0, 1);
    2670         [ #  # ]:          0 :                         if (ret < 0) {
    2671                 :            :                                 err = ret;
    2672                 :            :                                 break;
    2673                 :            :                         }
    2674         [ #  # ]:          0 :                         BUG_ON(ret > 0);
    2675                 :            : 
    2676         [ #  # ]:          0 :                         if (!upper->eb) {
    2677                 :          0 :                                 upper->eb = path->nodes[upper->level];
    2678                 :          0 :                                 path->nodes[upper->level] = NULL;
    2679                 :            :                         } else {
    2680         [ #  # ]:          0 :                                 BUG_ON(upper->eb != path->nodes[upper->level]);
    2681                 :            :                         }
    2682                 :            : 
    2683                 :          0 :                         upper->locked = 1;
    2684                 :          0 :                         path->locks[upper->level] = 0;
    2685                 :            : 
    2686                 :          0 :                         slot = path->slots[upper->level];
    2687                 :          0 :                         btrfs_release_path(path);
    2688                 :            :                 } else {
    2689                 :          0 :                         ret = btrfs_bin_search(upper->eb, key, upper->level,
    2690                 :            :                                                &slot);
    2691         [ #  # ]:          0 :                         BUG_ON(ret);
    2692                 :            :                 }
    2693                 :            : 
    2694                 :          0 :                 bytenr = btrfs_node_blockptr(upper->eb, slot);
    2695         [ #  # ]:          0 :                 if (lowest) {
    2696         [ #  # ]:          0 :                         BUG_ON(bytenr != node->bytenr);
    2697                 :            :                 } else {
    2698         [ #  # ]:          0 :                         if (node->eb->start == bytenr)
    2699                 :            :                                 goto next;
    2700                 :            :                 }
    2701                 :            : 
    2702                 :          0 :                 blocksize = btrfs_level_size(root, node->level);
    2703                 :          0 :                 generation = btrfs_node_ptr_generation(upper->eb, slot);
    2704                 :          0 :                 eb = read_tree_block(root, bytenr, blocksize, generation);
    2705 [ #  # ][ #  # ]:          0 :                 if (!eb || !extent_buffer_uptodate(eb)) {
    2706                 :          0 :                         free_extent_buffer(eb);
    2707                 :            :                         err = -EIO;
    2708                 :          0 :                         goto next;
    2709                 :            :                 }
    2710                 :          0 :                 btrfs_tree_lock(eb);
    2711                 :          0 :                 btrfs_set_lock_blocking(eb);
    2712                 :            : 
    2713         [ #  # ]:          0 :                 if (!node->eb) {
    2714                 :          0 :                         ret = btrfs_cow_block(trans, root, eb, upper->eb,
    2715                 :            :                                               slot, &eb);
    2716                 :          0 :                         btrfs_tree_unlock(eb);
    2717                 :          0 :                         free_extent_buffer(eb);
    2718         [ #  # ]:          0 :                         if (ret < 0) {
    2719                 :            :                                 err = ret;
    2720                 :            :                                 goto next;
    2721                 :            :                         }
    2722         [ #  # ]:          0 :                         BUG_ON(node->eb != eb);
    2723                 :            :                 } else {
    2724                 :          0 :                         btrfs_set_node_blockptr(upper->eb, slot,
    2725                 :            :                                                 node->eb->start);
    2726                 :          0 :                         btrfs_set_node_ptr_generation(upper->eb, slot,
    2727                 :            :                                                       trans->transid);
    2728                 :          0 :                         btrfs_mark_buffer_dirty(upper->eb);
    2729                 :            : 
    2730                 :          0 :                         ret = btrfs_inc_extent_ref(trans, root,
    2731                 :          0 :                                                 node->eb->start, blocksize,
    2732                 :          0 :                                                 upper->eb->start,
    2733                 :            :                                                 btrfs_header_owner(upper->eb),
    2734                 :          0 :                                                 node->level, 0, 1);
    2735         [ #  # ]:          0 :                         BUG_ON(ret);
    2736                 :            : 
    2737                 :          0 :                         ret = btrfs_drop_subtree(trans, root, eb, upper->eb);
    2738         [ #  # ]:          0 :                         BUG_ON(ret);
    2739                 :            :                 }
    2740                 :            : next:
    2741         [ #  # ]:          0 :                 if (!upper->pending)
    2742                 :          0 :                         drop_node_buffer(upper);
    2743                 :            :                 else
    2744                 :            :                         unlock_node_buffer(upper);
    2745         [ #  # ]:          0 :                 if (err)
    2746                 :            :                         break;
    2747                 :            :         }
    2748                 :            : 
    2749 [ #  # ][ #  # ]:          0 :         if (!err && node->pending) {
    2750                 :          0 :                 drop_node_buffer(node);
    2751                 :          0 :                 list_move_tail(&node->list, &rc->backref_cache.changed);
    2752                 :          0 :                 node->pending = 0;
    2753                 :            :         }
    2754                 :            : 
    2755                 :          0 :         path->lowest_level = 0;
    2756         [ #  # ]:          0 :         BUG_ON(err == -ENOSPC);
    2757                 :          0 :         return err;
    2758                 :            : }
    2759                 :            : 
    2760                 :          0 : static int link_to_upper(struct btrfs_trans_handle *trans,
    2761                 :            :                          struct reloc_control *rc,
    2762                 :            :                          struct backref_node *node,
    2763                 :            :                          struct btrfs_path *path)
    2764                 :            : {
    2765                 :            :         struct btrfs_key key;
    2766                 :            : 
    2767                 :          0 :         btrfs_node_key_to_cpu(node->eb, &key, 0);
    2768                 :          0 :         return do_relocation(trans, rc, node, &key, path, 0);
    2769                 :            : }
    2770                 :            : 
    2771                 :          0 : static int finish_pending_nodes(struct btrfs_trans_handle *trans,
    2772                 :            :                                 struct reloc_control *rc,
    2773                 :            :                                 struct btrfs_path *path, int err)
    2774                 :            : {
    2775                 :          0 :         LIST_HEAD(list);
    2776                 :            :         struct backref_cache *cache = &rc->backref_cache;
    2777                 :            :         struct backref_node *node;
    2778                 :            :         int level;
    2779                 :            :         int ret;
    2780                 :            : 
    2781         [ #  # ]:          0 :         for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
    2782         [ #  # ]:          0 :                 while (!list_empty(&cache->pending[level])) {
    2783                 :          0 :                         node = list_entry(cache->pending[level].next,
    2784                 :            :                                           struct backref_node, list);
    2785                 :          0 :                         list_move_tail(&node->list, &list);
    2786         [ #  # ]:          0 :                         BUG_ON(!node->pending);
    2787                 :            : 
    2788         [ #  # ]:          0 :                         if (!err) {
    2789                 :          0 :                                 ret = link_to_upper(trans, rc, node, path);
    2790         [ #  # ]:          0 :                                 if (ret < 0)
    2791                 :            :                                         err = ret;
    2792                 :            :                         }
    2793                 :            :                 }
    2794                 :            :                 list_splice_init(&list, &cache->pending[level]);
    2795                 :            :         }
    2796                 :          0 :         return err;
    2797                 :            : }
    2798                 :            : 
    2799                 :            : static void mark_block_processed(struct reloc_control *rc,
    2800                 :            :                                  u64 bytenr, u32 blocksize)
    2801                 :            : {
    2802                 :          0 :         set_extent_bits(&rc->processed_blocks, bytenr, bytenr + blocksize - 1,
    2803                 :            :                         EXTENT_DIRTY, GFP_NOFS);
    2804                 :            : }
    2805                 :            : 
    2806                 :          0 : static void __mark_block_processed(struct reloc_control *rc,
    2807                 :            :                                    struct backref_node *node)
    2808                 :            : {
    2809                 :            :         u32 blocksize;
    2810 [ #  # ][ #  # ]:          0 :         if (node->level == 0 ||
    2811                 :          0 :             in_block_group(node->bytenr, rc->block_group)) {
    2812                 :          0 :                 blocksize = btrfs_level_size(rc->extent_root, node->level);
    2813                 :          0 :                 mark_block_processed(rc, node->bytenr, blocksize);
    2814                 :            :         }
    2815                 :          0 :         node->processed = 1;
    2816                 :          0 : }
    2817                 :            : 
    2818                 :            : /*
    2819                 :            :  * mark a block and all blocks directly/indirectly reference the block
    2820                 :            :  * as processed.
    2821                 :            :  */
    2822                 :          0 : static void update_processed_blocks(struct reloc_control *rc,
    2823                 :            :                                     struct backref_node *node)
    2824                 :            : {
    2825                 :            :         struct backref_node *next = node;
    2826                 :            :         struct backref_edge *edge;
    2827                 :            :         struct backref_edge *edges[BTRFS_MAX_LEVEL - 1];
    2828                 :            :         int index = 0;
    2829                 :            : 
    2830         [ #  # ]:          0 :         while (next) {
    2831                 :          0 :                 cond_resched();
    2832                 :            :                 while (1) {
    2833         [ #  # ]:          0 :                         if (next->processed)
    2834                 :            :                                 break;
    2835                 :            : 
    2836                 :          0 :                         __mark_block_processed(rc, next);
    2837                 :            : 
    2838         [ #  # ]:          0 :                         if (list_empty(&next->upper))
    2839                 :            :                                 break;
    2840                 :            : 
    2841                 :            :                         edge = list_entry(next->upper.next,
    2842                 :            :                                           struct backref_edge, list[LOWER]);
    2843                 :          0 :                         edges[index++] = edge;
    2844                 :          0 :                         next = edge->node[UPPER];
    2845                 :          0 :                 }
    2846                 :            :                 next = walk_down_backref(edges, &index);
    2847                 :            :         }
    2848                 :          0 : }
    2849                 :            : 
    2850                 :          0 : static int tree_block_processed(u64 bytenr, u32 blocksize,
    2851                 :            :                                 struct reloc_control *rc)
    2852                 :            : {
    2853         [ #  # ]:          0 :         if (test_range_bit(&rc->processed_blocks, bytenr,
    2854                 :          0 :                            bytenr + blocksize - 1, EXTENT_DIRTY, 1, NULL))
    2855                 :            :                 return 1;
    2856                 :          0 :         return 0;
    2857                 :            : }
    2858                 :            : 
    2859                 :          0 : static int get_tree_block_key(struct reloc_control *rc,
    2860                 :            :                               struct tree_block *block)
    2861                 :            : {
    2862                 :          0 :         struct extent_buffer *eb;
    2863                 :            : 
    2864         [ #  # ]:          0 :         BUG_ON(block->key_ready);
    2865                 :          0 :         eb = read_tree_block(rc->extent_root, block->bytenr,
    2866                 :          0 :                              block->key.objectid, block->key.offset);
    2867 [ #  # ][ #  # ]:          0 :         if (!eb || !extent_buffer_uptodate(eb)) {
    2868                 :          0 :                 free_extent_buffer(eb);
    2869                 :            :                 return -EIO;
    2870                 :            :         }
    2871         [ #  # ]:          0 :         WARN_ON(btrfs_header_level(eb) != block->level);
    2872         [ #  # ]:          0 :         if (block->level == 0)
    2873                 :            :                 btrfs_item_key_to_cpu(eb, &block->key, 0);
    2874                 :            :         else
    2875                 :            :                 btrfs_node_key_to_cpu(eb, &block->key, 0);
    2876                 :          0 :         free_extent_buffer(eb);
    2877                 :          0 :         block->key_ready = 1;
    2878                 :            :         return 0;
    2879                 :            : }
    2880                 :            : 
    2881                 :          0 : static int reada_tree_block(struct reloc_control *rc,
    2882                 :            :                             struct tree_block *block)
    2883                 :            : {
    2884         [ #  # ]:          0 :         BUG_ON(block->key_ready);
    2885         [ #  # ]:          0 :         if (block->key.type == BTRFS_METADATA_ITEM_KEY)
    2886                 :          0 :                 readahead_tree_block(rc->extent_root, block->bytenr,
    2887                 :          0 :                                      block->key.objectid,
    2888                 :          0 :                                      rc->extent_root->leafsize);
    2889                 :            :         else
    2890                 :          0 :                 readahead_tree_block(rc->extent_root, block->bytenr,
    2891                 :          0 :                                      block->key.objectid, block->key.offset);
    2892                 :          0 :         return 0;
    2893                 :            : }
    2894                 :            : 
    2895                 :            : /*
    2896                 :            :  * helper function to relocate a tree block
    2897                 :            :  */
    2898                 :          0 : static int relocate_tree_block(struct btrfs_trans_handle *trans,
    2899                 :            :                                 struct reloc_control *rc,
    2900                 :            :                                 struct backref_node *node,
    2901                 :            :                                 struct btrfs_key *key,
    2902                 :            :                                 struct btrfs_path *path)
    2903                 :            : {
    2904                 :            :         struct btrfs_root *root;
    2905                 :            :         int ret = 0;
    2906                 :            : 
    2907         [ #  # ]:          0 :         if (!node)
    2908                 :            :                 return 0;
    2909                 :            : 
    2910         [ #  # ]:          0 :         BUG_ON(node->processed);
    2911                 :          0 :         root = select_one_root(trans, node);
    2912         [ #  # ]:          0 :         if (root == ERR_PTR(-ENOENT)) {
    2913                 :          0 :                 update_processed_blocks(rc, node);
    2914                 :          0 :                 goto out;
    2915                 :            :         }
    2916                 :            : 
    2917 [ #  # ][ #  # ]:          0 :         if (!root || root->ref_cows) {
    2918                 :          0 :                 ret = reserve_metadata_space(trans, rc, node);
    2919         [ #  # ]:          0 :                 if (ret)
    2920                 :            :                         goto out;
    2921                 :            :         }
    2922                 :            : 
    2923         [ #  # ]:          0 :         if (root) {
    2924         [ #  # ]:          0 :                 if (root->ref_cows) {
    2925         [ #  # ]:          0 :                         BUG_ON(node->new_bytenr);
    2926         [ #  # ]:          0 :                         BUG_ON(!list_empty(&node->list));
    2927                 :          0 :                         btrfs_record_root_in_trans(trans, root);
    2928                 :          0 :                         root = root->reloc_root;
    2929                 :          0 :                         node->new_bytenr = root->node->start;
    2930                 :          0 :                         node->root = root;
    2931                 :          0 :                         list_add_tail(&node->list, &rc->backref_cache.changed);
    2932                 :            :                 } else {
    2933                 :          0 :                         path->lowest_level = node->level;
    2934                 :          0 :                         ret = btrfs_search_slot(trans, root, key, path, 0, 1);
    2935                 :          0 :                         btrfs_release_path(path);
    2936         [ #  # ]:          0 :                         if (ret > 0)
    2937                 :            :                                 ret = 0;
    2938                 :            :                 }
    2939         [ #  # ]:          0 :                 if (!ret)
    2940                 :          0 :                         update_processed_blocks(rc, node);
    2941                 :            :         } else {
    2942                 :          0 :                 ret = do_relocation(trans, rc, node, key, path, 1);
    2943                 :            :         }
    2944                 :            : out:
    2945 [ #  # ][ #  # ]:          0 :         if (ret || node->level == 0 || node->cowonly)
                 [ #  # ]
    2946                 :          0 :                 remove_backref_node(&rc->backref_cache, node);
    2947                 :          0 :         return ret;
    2948                 :            : }
    2949                 :            : 
    2950                 :            : /*
    2951                 :            :  * relocate a list of blocks
    2952                 :            :  */
    2953                 :            : static noinline_for_stack
    2954                 :          0 : int relocate_tree_blocks(struct btrfs_trans_handle *trans,
    2955                 :            :                          struct reloc_control *rc, struct rb_root *blocks)
    2956                 :            : {
    2957                 :            :         struct backref_node *node;
    2958                 :            :         struct btrfs_path *path;
    2959                 :            :         struct tree_block *block;
    2960                 :            :         struct rb_node *rb_node;
    2961                 :            :         int ret;
    2962                 :            :         int err = 0;
    2963                 :            : 
    2964                 :          0 :         path = btrfs_alloc_path();
    2965         [ #  # ]:          0 :         if (!path) {
    2966                 :            :                 err = -ENOMEM;
    2967                 :            :                 goto out_free_blocks;
    2968                 :            :         }
    2969                 :            : 
    2970                 :          0 :         rb_node = rb_first(blocks);
    2971         [ #  # ]:          0 :         while (rb_node) {
    2972                 :            :                 block = rb_entry(rb_node, struct tree_block, rb_node);
    2973         [ #  # ]:          0 :                 if (!block->key_ready)
    2974                 :          0 :                         reada_tree_block(rc, block);
    2975                 :          0 :                 rb_node = rb_next(rb_node);
    2976                 :            :         }
    2977                 :            : 
    2978                 :          0 :         rb_node = rb_first(blocks);
    2979         [ #  # ]:          0 :         while (rb_node) {
    2980                 :            :                 block = rb_entry(rb_node, struct tree_block, rb_node);
    2981         [ #  # ]:          0 :                 if (!block->key_ready) {
    2982                 :          0 :                         err = get_tree_block_key(rc, block);
    2983         [ #  # ]:          0 :                         if (err)
    2984                 :            :                                 goto out_free_path;
    2985                 :            :                 }
    2986                 :          0 :                 rb_node = rb_next(rb_node);
    2987                 :            :         }
    2988                 :            : 
    2989                 :          0 :         rb_node = rb_first(blocks);
    2990         [ #  # ]:          0 :         while (rb_node) {
    2991                 :            :                 block = rb_entry(rb_node, struct tree_block, rb_node);
    2992                 :            : 
    2993                 :          0 :                 node = build_backref_tree(rc, &block->key,
    2994                 :          0 :                                           block->level, block->bytenr);
    2995         [ #  # ]:          0 :                 if (IS_ERR(node)) {
    2996                 :            :                         err = PTR_ERR(node);
    2997                 :          0 :                         goto out;
    2998                 :            :                 }
    2999                 :            : 
    3000                 :          0 :                 ret = relocate_tree_block(trans, rc, node, &block->key,
    3001                 :            :                                           path);
    3002         [ #  # ]:          0 :                 if (ret < 0) {
    3003 [ #  # ][ #  # ]:          0 :                         if (ret != -EAGAIN || rb_node == rb_first(blocks))
    3004                 :            :                                 err = ret;
    3005                 :            :                         goto out;
    3006                 :            :                 }
    3007                 :          0 :                 rb_node = rb_next(rb_node);
    3008                 :            :         }
    3009                 :            : out:
    3010                 :          0 :         err = finish_pending_nodes(trans, rc, path, err);
    3011                 :            : 
    3012                 :            : out_free_path:
    3013                 :          0 :         btrfs_free_path(path);
    3014                 :            : out_free_blocks:
    3015                 :          0 :         free_block_list(blocks);
    3016                 :          0 :         return err;
    3017                 :            : }
    3018                 :            : 
    3019                 :            : static noinline_for_stack
    3020                 :          0 : int prealloc_file_extent_cluster(struct inode *inode,
    3021                 :            :                                  struct file_extent_cluster *cluster)
    3022                 :            : {
    3023                 :          0 :         u64 alloc_hint = 0;
    3024                 :            :         u64 start;
    3025                 :            :         u64 end;
    3026                 :          0 :         u64 offset = BTRFS_I(inode)->index_cnt;
    3027                 :            :         u64 num_bytes;
    3028                 :            :         int nr = 0;
    3029                 :            :         int ret = 0;
    3030                 :            : 
    3031         [ #  # ]:          0 :         BUG_ON(cluster->start != cluster->boundary[0]);
    3032                 :          0 :         mutex_lock(&inode->i_mutex);
    3033                 :            : 
    3034                 :          0 :         ret = btrfs_check_data_free_space(inode, cluster->end +
    3035                 :          0 :                                           1 - cluster->start);
    3036         [ #  # ]:          0 :         if (ret)
    3037                 :            :                 goto out;
    3038                 :            : 
    3039         [ #  # ]:          0 :         while (nr < cluster->nr) {
    3040                 :          0 :                 start = cluster->boundary[nr] - offset;
    3041         [ #  # ]:          0 :                 if (nr + 1 < cluster->nr)
    3042                 :          0 :                         end = cluster->boundary[nr + 1] - 1 - offset;
    3043                 :            :                 else
    3044                 :          0 :                         end = cluster->end - offset;
    3045                 :            : 
    3046                 :          0 :                 lock_extent(&BTRFS_I(inode)->io_tree, start, end);
    3047                 :          0 :                 num_bytes = end + 1 - start;
    3048                 :          0 :                 ret = btrfs_prealloc_file_range(inode, 0, start,
    3049                 :            :                                                 num_bytes, num_bytes,
    3050                 :          0 :                                                 end + 1, &alloc_hint);
    3051                 :          0 :                 unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
    3052         [ #  # ]:          0 :                 if (ret)
    3053                 :            :                         break;
    3054                 :            :                 nr++;
    3055                 :            :         }
    3056                 :          0 :         btrfs_free_reserved_data_space(inode, cluster->end +
    3057                 :          0 :                                        1 - cluster->start);
    3058                 :            : out:
    3059                 :          0 :         mutex_unlock(&inode->i_mutex);
    3060                 :          0 :         return ret;
    3061                 :            : }
    3062                 :            : 
    3063                 :            : static noinline_for_stack
    3064                 :          0 : int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
    3065                 :            :                          u64 block_start)
    3066                 :            : {
    3067                 :          0 :         struct btrfs_root *root = BTRFS_I(inode)->root;
    3068                 :          0 :         struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
    3069                 :            :         struct extent_map *em;
    3070                 :            :         int ret = 0;
    3071                 :            : 
    3072                 :          0 :         em = alloc_extent_map();
    3073         [ #  # ]:          0 :         if (!em)
    3074                 :            :                 return -ENOMEM;
    3075                 :            : 
    3076                 :          0 :         em->start = start;
    3077                 :          0 :         em->len = end + 1 - start;
    3078                 :          0 :         em->block_len = em->len;
    3079                 :          0 :         em->block_start = block_start;
    3080                 :          0 :         em->bdev = root->fs_info->fs_devices->latest_bdev;
    3081                 :          0 :         set_bit(EXTENT_FLAG_PINNED, &em->flags);
    3082                 :            : 
    3083                 :          0 :         lock_extent(&BTRFS_I(inode)->io_tree, start, end);
    3084                 :            :         while (1) {
    3085                 :          0 :                 write_lock(&em_tree->lock);
    3086                 :          0 :                 ret = add_extent_mapping(em_tree, em, 0);
    3087                 :            :                 write_unlock(&em_tree->lock);
    3088         [ #  # ]:          0 :                 if (ret != -EEXIST) {
    3089                 :          0 :                         free_extent_map(em);
    3090                 :            :                         break;
    3091                 :            :                 }
    3092                 :          0 :                 btrfs_drop_extent_cache(inode, start, end, 0);
    3093                 :          0 :         }
    3094                 :          0 :         unlock_extent(&BTRFS_I(inode)->io_tree, start, end);
    3095                 :          0 :         return ret;
    3096                 :            : }
    3097                 :            : 
    3098                 :          0 : static int relocate_file_extent_cluster(struct inode *inode,
    3099                 :            :                                         struct file_extent_cluster *cluster)
    3100                 :            : {
    3101                 :            :         u64 page_start;
    3102                 :            :         u64 page_end;
    3103                 :          0 :         u64 offset = BTRFS_I(inode)->index_cnt;
    3104                 :            :         unsigned long index;
    3105                 :            :         unsigned long last_index;
    3106                 :          0 :         struct page *page;
    3107                 :            :         struct file_ra_state *ra;
    3108                 :          0 :         gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
    3109                 :            :         int nr = 0;
    3110                 :            :         int ret = 0;
    3111                 :            : 
    3112         [ #  # ]:          0 :         if (!cluster->nr)
    3113                 :            :                 return 0;
    3114                 :            : 
    3115                 :            :         ra = kzalloc(sizeof(*ra), GFP_NOFS);
    3116         [ #  # ]:          0 :         if (!ra)
    3117                 :            :                 return -ENOMEM;
    3118                 :            : 
    3119                 :          0 :         ret = prealloc_file_extent_cluster(inode, cluster);
    3120         [ #  # ]:          0 :         if (ret)
    3121                 :            :                 goto out;
    3122                 :            : 
    3123                 :          0 :         file_ra_state_init(ra, inode->i_mapping);
    3124                 :            : 
    3125                 :          0 :         ret = setup_extent_mapping(inode, cluster->start - offset,
    3126                 :          0 :                                    cluster->end - offset, cluster->start);
    3127         [ #  # ]:          0 :         if (ret)
    3128                 :            :                 goto out;
    3129                 :            : 
    3130                 :          0 :         index = (cluster->start - offset) >> PAGE_CACHE_SHIFT;
    3131                 :          0 :         last_index = (cluster->end - offset) >> PAGE_CACHE_SHIFT;
    3132         [ #  # ]:          0 :         while (index <= last_index) {
    3133                 :          0 :                 ret = btrfs_delalloc_reserve_metadata(inode, PAGE_CACHE_SIZE);
    3134         [ #  # ]:          0 :                 if (ret)
    3135                 :            :                         goto out;
    3136                 :            : 
    3137                 :          0 :                 page = find_lock_page(inode->i_mapping, index);
    3138         [ #  # ]:          0 :                 if (!page) {
    3139                 :          0 :                         page_cache_sync_readahead(inode->i_mapping,
    3140                 :            :                                                   ra, NULL, index,
    3141                 :          0 :                                                   last_index + 1 - index);
    3142                 :          0 :                         page = find_or_create_page(inode->i_mapping, index,
    3143                 :            :                                                    mask);
    3144         [ #  # ]:          0 :                         if (!page) {
    3145                 :          0 :                                 btrfs_delalloc_release_metadata(inode,
    3146                 :            :                                                         PAGE_CACHE_SIZE);
    3147                 :            :                                 ret = -ENOMEM;
    3148                 :          0 :                                 goto out;
    3149                 :            :                         }
    3150                 :            :                 }
    3151                 :            : 
    3152         [ #  # ]:          0 :                 if (PageReadahead(page)) {
    3153                 :          0 :                         page_cache_async_readahead(inode->i_mapping,
    3154                 :            :                                                    ra, NULL, page, index,
    3155                 :          0 :                                                    last_index + 1 - index);
    3156                 :            :                 }
    3157                 :            : 
    3158         [ #  # ]:          0 :                 if (!PageUptodate(page)) {
    3159                 :          0 :                         btrfs_readpage(NULL, page);
    3160                 :            :                         lock_page(page);
    3161         [ #  # ]:          0 :                         if (!PageUptodate(page)) {
    3162                 :          0 :                                 unlock_page(page);
    3163                 :          0 :                                 page_cache_release(page);
    3164                 :          0 :                                 btrfs_delalloc_release_metadata(inode,
    3165                 :            :                                                         PAGE_CACHE_SIZE);
    3166                 :            :                                 ret = -EIO;
    3167                 :          0 :                                 goto out;
    3168                 :            :                         }
    3169                 :            :                 }
    3170                 :            : 
    3171                 :          0 :                 page_start = page_offset(page);
    3172                 :          0 :                 page_end = page_start + PAGE_CACHE_SIZE - 1;
    3173                 :            : 
    3174                 :          0 :                 lock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end);
    3175                 :            : 
    3176                 :          0 :                 set_page_extent_mapped(page);
    3177                 :            : 
    3178 [ #  # ][ #  # ]:          0 :                 if (nr < cluster->nr &&
    3179                 :          0 :                     page_start + offset == cluster->boundary[nr]) {
    3180                 :          0 :                         set_extent_bits(&BTRFS_I(inode)->io_tree,
    3181                 :            :                                         page_start, page_end,
    3182                 :            :                                         EXTENT_BOUNDARY, GFP_NOFS);
    3183                 :          0 :                         nr++;
    3184                 :            :                 }
    3185                 :            : 
    3186                 :          0 :                 btrfs_set_extent_delalloc(inode, page_start, page_end, NULL);
    3187                 :          0 :                 set_page_dirty(page);
    3188                 :            : 
    3189                 :          0 :                 unlock_extent(&BTRFS_I(inode)->io_tree,
    3190                 :            :                               page_start, page_end);
    3191                 :          0 :                 unlock_page(page);
    3192                 :          0 :                 page_cache_release(page);
    3193                 :            : 
    3194                 :          0 :                 index++;
    3195                 :          0 :                 balance_dirty_pages_ratelimited(inode->i_mapping);
    3196                 :          0 :                 btrfs_throttle(BTRFS_I(inode)->root);
    3197                 :            :         }
    3198         [ #  # ]:          0 :         WARN_ON(nr != cluster->nr);
    3199                 :            : out:
    3200                 :          0 :         kfree(ra);
    3201                 :          0 :         return ret;
    3202                 :            : }
    3203                 :            : 
    3204                 :            : static noinline_for_stack
    3205                 :          0 : int relocate_data_extent(struct inode *inode, struct btrfs_key *extent_key,
    3206                 :            :                          struct file_extent_cluster *cluster)
    3207                 :            : {
    3208                 :            :         int ret;
    3209                 :            : 
    3210 [ #  # ][ #  # ]:          0 :         if (cluster->nr > 0 && extent_key->objectid != cluster->end + 1) {
    3211                 :          0 :                 ret = relocate_file_extent_cluster(inode, cluster);
    3212         [ #  # ]:          0 :                 if (ret)
    3213                 :            :                         return ret;
    3214                 :          0 :                 cluster->nr = 0;
    3215                 :            :         }
    3216                 :            : 
    3217         [ #  # ]:          0 :         if (!cluster->nr)
    3218                 :          0 :                 cluster->start = extent_key->objectid;
    3219                 :            :         else
    3220         [ #  # ]:          0 :                 BUG_ON(cluster->nr >= MAX_EXTENTS);
    3221                 :          0 :         cluster->end = extent_key->objectid + extent_key->offset - 1;
    3222                 :          0 :         cluster->boundary[cluster->nr] = extent_key->objectid;
    3223                 :          0 :         cluster->nr++;
    3224                 :            : 
    3225         [ #  # ]:          0 :         if (cluster->nr >= MAX_EXTENTS) {
    3226                 :          0 :                 ret = relocate_file_extent_cluster(inode, cluster);
    3227         [ #  # ]:          0 :                 if (ret)
    3228                 :            :                         return ret;
    3229                 :          0 :                 cluster->nr = 0;
    3230                 :            :         }
    3231                 :            :         return 0;
    3232                 :            : }
    3233                 :            : 
    3234                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    3235                 :          0 : static int get_ref_objectid_v0(struct reloc_control *rc,
    3236                 :            :                                struct btrfs_path *path,
    3237                 :            :                                struct btrfs_key *extent_key,
    3238                 :            :                                u64 *ref_objectid, int *path_change)
    3239                 :            : {
    3240                 :            :         struct btrfs_key key;
    3241                 :          0 :         struct extent_buffer *leaf;
    3242                 :            :         struct btrfs_extent_ref_v0 *ref0;
    3243                 :            :         int ret;
    3244                 :            :         int slot;
    3245                 :            : 
    3246                 :          0 :         leaf = path->nodes[0];
    3247                 :          0 :         slot = path->slots[0];
    3248                 :            :         while (1) {
    3249         [ #  # ]:          0 :                 if (slot >= btrfs_header_nritems(leaf)) {
    3250                 :          0 :                         ret = btrfs_next_leaf(rc->extent_root, path);
    3251         [ #  # ]:          0 :                         if (ret < 0)
    3252                 :            :                                 return ret;
    3253         [ #  # ]:          0 :                         BUG_ON(ret > 0);
    3254                 :          0 :                         leaf = path->nodes[0];
    3255                 :          0 :                         slot = path->slots[0];
    3256         [ #  # ]:          0 :                         if (path_change)
    3257                 :          0 :                                 *path_change = 1;
    3258                 :            :                 }
    3259                 :            :                 btrfs_item_key_to_cpu(leaf, &key, slot);
    3260         [ #  # ]:          0 :                 if (key.objectid != extent_key->objectid)
    3261                 :            :                         return -ENOENT;
    3262                 :            : 
    3263         [ #  # ]:          0 :                 if (key.type != BTRFS_EXTENT_REF_V0_KEY) {
    3264                 :          0 :                         slot++;
    3265                 :          0 :                         continue;
    3266                 :            :                 }
    3267                 :          0 :                 ref0 = btrfs_item_ptr(leaf, slot,
    3268                 :            :                                 struct btrfs_extent_ref_v0);
    3269                 :          0 :                 *ref_objectid = btrfs_ref_objectid_v0(leaf, ref0);
    3270                 :            :                 break;
    3271                 :            :         }
    3272                 :            :         return 0;
    3273                 :            : }
    3274                 :            : #endif
    3275                 :            : 
    3276                 :            : /*
    3277                 :            :  * helper to add a tree block to the list.
    3278                 :            :  * the major work is getting the generation and level of the block
    3279                 :            :  */
    3280                 :          0 : static int add_tree_block(struct reloc_control *rc,
    3281                 :            :                           struct btrfs_key *extent_key,
    3282                 :            :                           struct btrfs_path *path,
    3283                 :            :                           struct rb_root *blocks)
    3284                 :            : {
    3285                 :            :         struct extent_buffer *eb;
    3286                 :            :         struct btrfs_extent_item *ei;
    3287                 :            :         struct btrfs_tree_block_info *bi;
    3288                 :            :         struct tree_block *block;
    3289                 :            :         struct rb_node *rb_node;
    3290                 :            :         u32 item_size;
    3291                 :            :         int level = -1;
    3292                 :            :         u64 generation;
    3293                 :            : 
    3294                 :          0 :         eb =  path->nodes[0];
    3295                 :          0 :         item_size = btrfs_item_size_nr(eb, path->slots[0]);
    3296                 :            : 
    3297 [ #  # ][ #  # ]:          0 :         if (extent_key->type == BTRFS_METADATA_ITEM_KEY ||
    3298                 :            :             item_size >= sizeof(*ei) + sizeof(*bi)) {
    3299                 :          0 :                 ei = btrfs_item_ptr(eb, path->slots[0],
    3300                 :            :                                 struct btrfs_extent_item);
    3301         [ #  # ]:          0 :                 if (extent_key->type == BTRFS_EXTENT_ITEM_KEY) {
    3302                 :          0 :                         bi = (struct btrfs_tree_block_info *)(ei + 1);
    3303                 :          0 :                         level = btrfs_tree_block_level(eb, bi);
    3304                 :            :                 } else {
    3305                 :          0 :                         level = (int)extent_key->offset;
    3306                 :            :                 }
    3307                 :          0 :                 generation = btrfs_extent_generation(eb, ei);
    3308                 :            :         } else {
    3309                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    3310                 :            :                 u64 ref_owner;
    3311                 :            :                 int ret;
    3312                 :            : 
    3313         [ #  # ]:          0 :                 BUG_ON(item_size != sizeof(struct btrfs_extent_item_v0));
    3314                 :          0 :                 ret = get_ref_objectid_v0(rc, path, extent_key,
    3315                 :            :                                           &ref_owner, NULL);
    3316         [ #  # ]:          0 :                 if (ret < 0)
    3317                 :          0 :                         return ret;
    3318         [ #  # ]:          0 :                 BUG_ON(ref_owner >= BTRFS_MAX_LEVEL);
    3319                 :          0 :                 level = (int)ref_owner;
    3320                 :            :                 /* FIXME: get real generation */
    3321                 :            :                 generation = 0;
    3322                 :            : #else
    3323                 :            :                 BUG();
    3324                 :            : #endif
    3325                 :            :         }
    3326                 :            : 
    3327                 :          0 :         btrfs_release_path(path);
    3328                 :            : 
    3329         [ #  # ]:          0 :         BUG_ON(level == -1);
    3330                 :            : 
    3331                 :            :         block = kmalloc(sizeof(*block), GFP_NOFS);
    3332         [ #  # ]:          0 :         if (!block)
    3333                 :            :                 return -ENOMEM;
    3334                 :            : 
    3335                 :          0 :         block->bytenr = extent_key->objectid;
    3336                 :          0 :         block->key.objectid = rc->extent_root->leafsize;
    3337                 :          0 :         block->key.offset = generation;
    3338                 :          0 :         block->level = level;
    3339                 :          0 :         block->key_ready = 0;
    3340                 :            : 
    3341                 :          0 :         rb_node = tree_insert(blocks, block->bytenr, &block->rb_node);
    3342         [ #  # ]:          0 :         if (rb_node)
    3343                 :          0 :                 backref_tree_panic(rb_node, -EEXIST, block->bytenr);
    3344                 :            : 
    3345                 :            :         return 0;
    3346                 :            : }
    3347                 :            : 
    3348                 :            : /*
    3349                 :            :  * helper to add tree blocks for backref of type BTRFS_SHARED_DATA_REF_KEY
    3350                 :            :  */
    3351                 :          0 : static int __add_tree_block(struct reloc_control *rc,
    3352                 :            :                             u64 bytenr, u32 blocksize,
    3353                 :            :                             struct rb_root *blocks)
    3354                 :            : {
    3355                 :            :         struct btrfs_path *path;
    3356                 :            :         struct btrfs_key key;
    3357                 :            :         int ret;
    3358                 :          0 :         bool skinny = btrfs_fs_incompat(rc->extent_root->fs_info,
    3359                 :            :                                         SKINNY_METADATA);
    3360                 :            : 
    3361         [ #  # ]:          0 :         if (tree_block_processed(bytenr, blocksize, rc))
    3362                 :            :                 return 0;
    3363                 :            : 
    3364         [ #  # ]:          0 :         if (tree_search(blocks, bytenr))
    3365                 :            :                 return 0;
    3366                 :            : 
    3367                 :          0 :         path = btrfs_alloc_path();
    3368         [ #  # ]:          0 :         if (!path)
    3369                 :            :                 return -ENOMEM;
    3370                 :            : again:
    3371                 :          0 :         key.objectid = bytenr;
    3372         [ #  # ]:          0 :         if (skinny) {
    3373                 :          0 :                 key.type = BTRFS_METADATA_ITEM_KEY;
    3374                 :          0 :                 key.offset = (u64)-1;
    3375                 :            :         } else {
    3376                 :          0 :                 key.type = BTRFS_EXTENT_ITEM_KEY;
    3377                 :          0 :                 key.offset = blocksize;
    3378                 :            :         }
    3379                 :            : 
    3380                 :          0 :         path->search_commit_root = 1;
    3381                 :          0 :         path->skip_locking = 1;
    3382                 :          0 :         ret = btrfs_search_slot(NULL, rc->extent_root, &key, path, 0, 0);
    3383         [ #  # ]:          0 :         if (ret < 0)
    3384                 :            :                 goto out;
    3385                 :            : 
    3386         [ #  # ]:          0 :         if (ret > 0 && skinny) {
    3387         [ #  # ]:          0 :                 if (path->slots[0]) {
    3388                 :          0 :                         path->slots[0]--;
    3389                 :          0 :                         btrfs_item_key_to_cpu(path->nodes[0], &key,
    3390                 :            :                                               path->slots[0]);
    3391 [ #  # ][ #  # ]:          0 :                         if (key.objectid == bytenr &&
    3392         [ #  # ]:          0 :                             (key.type == BTRFS_METADATA_ITEM_KEY ||
    3393         [ #  # ]:          0 :                              (key.type == BTRFS_EXTENT_ITEM_KEY &&
    3394                 :          0 :                               key.offset == blocksize)))
    3395                 :            :                                 ret = 0;
    3396                 :            :                 }
    3397                 :            : 
    3398         [ #  # ]:          0 :                 if (ret) {
    3399                 :            :                         skinny = false;
    3400                 :          0 :                         btrfs_release_path(path);
    3401                 :          0 :                         goto again;
    3402                 :            :                 }
    3403                 :            :         }
    3404         [ #  # ]:          0 :         BUG_ON(ret);
    3405                 :            : 
    3406                 :          0 :         ret = add_tree_block(rc, &key, path, blocks);
    3407                 :            : out:
    3408                 :          0 :         btrfs_free_path(path);
    3409                 :          0 :         return ret;
    3410                 :            : }
    3411                 :            : 
    3412                 :            : /*
    3413                 :            :  * helper to check if the block use full backrefs for pointers in it
    3414                 :            :  */
    3415                 :          0 : static int block_use_full_backref(struct reloc_control *rc,
    3416                 :          0 :                                   struct extent_buffer *eb)
    3417                 :            : {
    3418                 :            :         u64 flags;
    3419                 :            :         int ret;
    3420                 :            : 
    3421   [ #  #  #  # ]:          0 :         if (btrfs_header_flag(eb, BTRFS_HEADER_FLAG_RELOC) ||
    3422                 :            :             btrfs_header_backref_rev(eb) < BTRFS_MIXED_BACKREF_REV)
    3423                 :            :                 return 1;
    3424                 :            : 
    3425                 :          0 :         ret = btrfs_lookup_extent_info(NULL, rc->extent_root,
    3426                 :            :                                        eb->start, btrfs_header_level(eb), 1,
    3427                 :            :                                        NULL, &flags);
    3428         [ #  # ]:          0 :         BUG_ON(ret);
    3429                 :            : 
    3430         [ #  # ]:          0 :         if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
    3431                 :            :                 ret = 1;
    3432                 :            :         else
    3433                 :            :                 ret = 0;
    3434                 :            :         return ret;
    3435                 :            : }
    3436                 :            : 
    3437                 :          0 : static int delete_block_group_cache(struct btrfs_fs_info *fs_info,
    3438                 :            :                                     struct inode *inode, u64 ino)
    3439                 :            : {
    3440                 :            :         struct btrfs_key key;
    3441                 :          0 :         struct btrfs_root *root = fs_info->tree_root;
    3442                 :            :         struct btrfs_trans_handle *trans;
    3443                 :            :         int ret = 0;
    3444                 :            : 
    3445         [ #  # ]:          0 :         if (inode)
    3446                 :            :                 goto truncate;
    3447                 :            : 
    3448                 :          0 :         key.objectid = ino;
    3449                 :          0 :         key.type = BTRFS_INODE_ITEM_KEY;
    3450                 :          0 :         key.offset = 0;
    3451                 :            : 
    3452                 :          0 :         inode = btrfs_iget(fs_info->sb, &key, root, NULL);
    3453 [ #  # ][ #  # ]:          0 :         if (IS_ERR(inode) || is_bad_inode(inode)) {
    3454         [ #  # ]:          0 :                 if (!IS_ERR(inode))
    3455                 :          0 :                         iput(inode);
    3456                 :            :                 return -ENOENT;
    3457                 :            :         }
    3458                 :            : 
    3459                 :            : truncate:
    3460                 :          0 :         ret = btrfs_check_trunc_cache_free_space(root,
    3461                 :            :                                                  &fs_info->global_block_rsv);
    3462         [ #  # ]:          0 :         if (ret)
    3463                 :            :                 goto out;
    3464                 :            : 
    3465                 :          0 :         trans = btrfs_join_transaction(root);
    3466         [ #  # ]:          0 :         if (IS_ERR(trans)) {
    3467                 :            :                 ret = PTR_ERR(trans);
    3468                 :          0 :                 goto out;
    3469                 :            :         }
    3470                 :            : 
    3471                 :          0 :         ret = btrfs_truncate_free_space_cache(root, trans, inode);
    3472                 :            : 
    3473                 :          0 :         btrfs_end_transaction(trans, root);
    3474                 :          0 :         btrfs_btree_balance_dirty(root);
    3475                 :            : out:
    3476                 :          0 :         iput(inode);
    3477                 :          0 :         return ret;
    3478                 :            : }
    3479                 :            : 
    3480                 :            : /*
    3481                 :            :  * helper to add tree blocks for backref of type BTRFS_EXTENT_DATA_REF_KEY
    3482                 :            :  * this function scans fs tree to find blocks reference the data extent
    3483                 :            :  */
    3484                 :          0 : static int find_data_references(struct reloc_control *rc,
    3485                 :            :                                 struct btrfs_key *extent_key,
    3486                 :          0 :                                 struct extent_buffer *leaf,
    3487                 :            :                                 struct btrfs_extent_data_ref *ref,
    3488                 :            :                                 struct rb_root *blocks)
    3489                 :            : {
    3490                 :            :         struct btrfs_path *path;
    3491                 :            :         struct tree_block *block;
    3492                 :            :         struct btrfs_root *root;
    3493                 :            :         struct btrfs_file_extent_item *fi;
    3494                 :            :         struct rb_node *rb_node;
    3495                 :            :         struct btrfs_key key;
    3496                 :            :         u64 ref_root;
    3497                 :            :         u64 ref_objectid;
    3498                 :            :         u64 ref_offset;
    3499                 :            :         u32 ref_count;
    3500                 :            :         u32 nritems;
    3501                 :            :         int err = 0;
    3502                 :            :         int added = 0;
    3503                 :            :         int counted;
    3504                 :            :         int ret;
    3505                 :            : 
    3506                 :            :         ref_root = btrfs_extent_data_ref_root(leaf, ref);
    3507                 :            :         ref_objectid = btrfs_extent_data_ref_objectid(leaf, ref);
    3508                 :            :         ref_offset = btrfs_extent_data_ref_offset(leaf, ref);
    3509                 :            :         ref_count = btrfs_extent_data_ref_count(leaf, ref);
    3510                 :            : 
    3511                 :            :         /*
    3512                 :            :          * This is an extent belonging to the free space cache, lets just delete
    3513                 :            :          * it and redo the search.
    3514                 :            :          */
    3515         [ #  # ]:          0 :         if (ref_root == BTRFS_ROOT_TREE_OBJECTID) {
    3516                 :          0 :                 ret = delete_block_group_cache(rc->extent_root->fs_info,
    3517                 :            :                                                NULL, ref_objectid);
    3518         [ #  # ]:          0 :                 if (ret != -ENOENT)
    3519                 :            :                         return ret;
    3520                 :            :                 ret = 0;
    3521                 :            :         }
    3522                 :            : 
    3523                 :          0 :         path = btrfs_alloc_path();
    3524         [ #  # ]:          0 :         if (!path)
    3525                 :            :                 return -ENOMEM;
    3526                 :          0 :         path->reada = 1;
    3527                 :            : 
    3528                 :          0 :         root = read_fs_root(rc->extent_root->fs_info, ref_root);
    3529         [ #  # ]:          0 :         if (IS_ERR(root)) {
    3530                 :            :                 err = PTR_ERR(root);
    3531                 :          0 :                 goto out;
    3532                 :            :         }
    3533                 :            : 
    3534                 :          0 :         key.objectid = ref_objectid;
    3535                 :          0 :         key.type = BTRFS_EXTENT_DATA_KEY;
    3536         [ #  # ]:          0 :         if (ref_offset > ((u64)-1 << 32))
    3537                 :          0 :                 key.offset = 0;
    3538                 :            :         else
    3539                 :          0 :                 key.offset = ref_offset;
    3540                 :            : 
    3541                 :          0 :         path->search_commit_root = 1;
    3542                 :          0 :         path->skip_locking = 1;
    3543                 :          0 :         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
    3544         [ #  # ]:          0 :         if (ret < 0) {
    3545                 :            :                 err = ret;
    3546                 :            :                 goto out;
    3547                 :            :         }
    3548                 :            : 
    3549                 :          0 :         leaf = path->nodes[0];
    3550                 :            :         nritems = btrfs_header_nritems(leaf);
    3551                 :            :         /*
    3552                 :            :          * the references in tree blocks that use full backrefs
    3553                 :            :          * are not counted in
    3554                 :            :          */
    3555         [ #  # ]:          0 :         if (block_use_full_backref(rc, leaf))
    3556                 :            :                 counted = 0;
    3557                 :            :         else
    3558                 :            :                 counted = 1;
    3559                 :          0 :         rb_node = tree_search(blocks, leaf->start);
    3560         [ #  # ]:          0 :         if (rb_node) {
    3561         [ #  # ]:          0 :                 if (counted)
    3562                 :            :                         added = 1;
    3563                 :            :                 else
    3564                 :          0 :                         path->slots[0] = nritems;
    3565                 :            :         }
    3566                 :            : 
    3567         [ #  # ]:          0 :         while (ref_count > 0) {
    3568         [ #  # ]:          0 :                 while (path->slots[0] >= nritems) {
    3569                 :          0 :                         ret = btrfs_next_leaf(root, path);
    3570         [ #  # ]:          0 :                         if (ret < 0) {
    3571                 :            :                                 err = ret;
    3572                 :            :                                 goto out;
    3573                 :            :                         }
    3574 [ #  # ][ #  # ]:          0 :                         if (WARN_ON(ret > 0))
    3575                 :            :                                 goto out;
    3576                 :            : 
    3577                 :          0 :                         leaf = path->nodes[0];
    3578                 :            :                         nritems = btrfs_header_nritems(leaf);
    3579                 :            :                         added = 0;
    3580                 :            : 
    3581         [ #  # ]:          0 :                         if (block_use_full_backref(rc, leaf))
    3582                 :            :                                 counted = 0;
    3583                 :            :                         else
    3584                 :            :                                 counted = 1;
    3585                 :          0 :                         rb_node = tree_search(blocks, leaf->start);
    3586         [ #  # ]:          0 :                         if (rb_node) {
    3587         [ #  # ]:          0 :                                 if (counted)
    3588                 :            :                                         added = 1;
    3589                 :            :                                 else
    3590                 :          0 :                                         path->slots[0] = nritems;
    3591                 :            :                         }
    3592                 :            :                 }
    3593                 :            : 
    3594                 :            :                 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
    3595 [ #  # ][ #  # ]:          0 :                 if (WARN_ON(key.objectid != ref_objectid ||
         [ #  # ][ #  # ]
    3596                 :            :                     key.type != BTRFS_EXTENT_DATA_KEY))
    3597                 :            :                         break;
    3598                 :            : 
    3599                 :          0 :                 fi = btrfs_item_ptr(leaf, path->slots[0],
    3600                 :            :                                     struct btrfs_file_extent_item);
    3601                 :            : 
    3602         [ #  # ]:          0 :                 if (btrfs_file_extent_type(leaf, fi) ==
    3603                 :            :                     BTRFS_FILE_EXTENT_INLINE)
    3604                 :            :                         goto next;
    3605                 :            : 
    3606         [ #  # ]:          0 :                 if (btrfs_file_extent_disk_bytenr(leaf, fi) !=
    3607                 :          0 :                     extent_key->objectid)
    3608                 :            :                         goto next;
    3609                 :            : 
    3610                 :          0 :                 key.offset -= btrfs_file_extent_offset(leaf, fi);
    3611         [ #  # ]:          0 :                 if (key.offset != ref_offset)
    3612                 :            :                         goto next;
    3613                 :            : 
    3614         [ #  # ]:          0 :                 if (counted)
    3615                 :          0 :                         ref_count--;
    3616         [ #  # ]:          0 :                 if (added)
    3617                 :            :                         goto next;
    3618                 :            : 
    3619         [ #  # ]:          0 :                 if (!tree_block_processed(leaf->start, leaf->len, rc)) {
    3620                 :            :                         block = kmalloc(sizeof(*block), GFP_NOFS);
    3621         [ #  # ]:          0 :                         if (!block) {
    3622                 :            :                                 err = -ENOMEM;
    3623                 :            :                                 break;
    3624                 :            :                         }
    3625                 :          0 :                         block->bytenr = leaf->start;
    3626                 :            :                         btrfs_item_key_to_cpu(leaf, &block->key, 0);
    3627                 :          0 :                         block->level = 0;
    3628                 :          0 :                         block->key_ready = 1;
    3629                 :          0 :                         rb_node = tree_insert(blocks, block->bytenr,
    3630                 :            :                                               &block->rb_node);
    3631         [ #  # ]:          0 :                         if (rb_node)
    3632                 :          0 :                                 backref_tree_panic(rb_node, -EEXIST,
    3633                 :            :                                                    block->bytenr);
    3634                 :            :                 }
    3635         [ #  # ]:          0 :                 if (counted)
    3636                 :            :                         added = 1;
    3637                 :            :                 else
    3638                 :          0 :                         path->slots[0] = nritems;
    3639                 :            : next:
    3640                 :          0 :                 path->slots[0]++;
    3641                 :            : 
    3642                 :            :         }
    3643                 :            : out:
    3644                 :          0 :         btrfs_free_path(path);
    3645                 :          0 :         return err;
    3646                 :            : }
    3647                 :            : 
    3648                 :            : /*
    3649                 :            :  * helper to find all tree blocks that reference a given data extent
    3650                 :            :  */
    3651                 :            : static noinline_for_stack
    3652                 :          0 : int add_data_references(struct reloc_control *rc,
    3653                 :            :                         struct btrfs_key *extent_key,
    3654                 :            :                         struct btrfs_path *path,
    3655                 :            :                         struct rb_root *blocks)
    3656                 :            : {
    3657                 :            :         struct btrfs_key key;
    3658                 :          0 :         struct extent_buffer *eb;
    3659                 :            :         struct btrfs_extent_data_ref *dref;
    3660                 :            :         struct btrfs_extent_inline_ref *iref;
    3661                 :            :         unsigned long ptr;
    3662                 :            :         unsigned long end;
    3663                 :          0 :         u32 blocksize = btrfs_level_size(rc->extent_root, 0);
    3664                 :            :         int ret = 0;
    3665                 :            :         int err = 0;
    3666                 :            : 
    3667                 :          0 :         eb = path->nodes[0];
    3668                 :          0 :         ptr = btrfs_item_ptr_offset(eb, path->slots[0]);
    3669                 :          0 :         end = ptr + btrfs_item_size_nr(eb, path->slots[0]);
    3670                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    3671         [ #  # ]:          0 :         if (ptr + sizeof(struct btrfs_extent_item_v0) == end)
    3672                 :            :                 ptr = end;
    3673                 :            :         else
    3674                 :            : #endif
    3675                 :          0 :                 ptr += sizeof(struct btrfs_extent_item);
    3676                 :            : 
    3677         [ #  # ]:          0 :         while (ptr < end) {
    3678                 :          0 :                 iref = (struct btrfs_extent_inline_ref *)ptr;
    3679                 :            :                 key.type = btrfs_extent_inline_ref_type(eb, iref);
    3680         [ #  # ]:          0 :                 if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
    3681                 :            :                         key.offset = btrfs_extent_inline_ref_offset(eb, iref);
    3682                 :          0 :                         ret = __add_tree_block(rc, key.offset, blocksize,
    3683                 :            :                                                blocks);
    3684         [ #  # ]:          0 :                 } else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
    3685                 :          0 :                         dref = (struct btrfs_extent_data_ref *)(&iref->offset);
    3686                 :          0 :                         ret = find_data_references(rc, extent_key,
    3687                 :            :                                                    eb, dref, blocks);
    3688                 :            :                 } else {
    3689                 :          0 :                         BUG();
    3690                 :            :                 }
    3691         [ #  # ]:          0 :                 if (ret) {
    3692                 :            :                         err = ret;
    3693                 :            :                         goto out;
    3694                 :            :                 }
    3695                 :          0 :                 ptr += btrfs_extent_inline_ref_size(key.type);
    3696                 :            :         }
    3697         [ #  # ]:          0 :         WARN_ON(ptr > end);
    3698                 :            : 
    3699                 :            :         while (1) {
    3700                 :          0 :                 cond_resched();
    3701                 :          0 :                 eb = path->nodes[0];
    3702         [ #  # ]:          0 :                 if (path->slots[0] >= btrfs_header_nritems(eb)) {
    3703                 :          0 :                         ret = btrfs_next_leaf(rc->extent_root, path);
    3704         [ #  # ]:          0 :                         if (ret < 0) {
    3705                 :            :                                 err = ret;
    3706                 :            :                                 break;
    3707                 :            :                         }
    3708         [ #  # ]:          0 :                         if (ret > 0)
    3709                 :            :                                 break;
    3710                 :          0 :                         eb = path->nodes[0];
    3711                 :            :                 }
    3712                 :            : 
    3713                 :          0 :                 btrfs_item_key_to_cpu(eb, &key, path->slots[0]);
    3714         [ #  # ]:          0 :                 if (key.objectid != extent_key->objectid)
    3715                 :            :                         break;
    3716                 :            : 
    3717                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    3718         [ #  # ]:          0 :                 if (key.type == BTRFS_SHARED_DATA_REF_KEY ||
    3719                 :            :                     key.type == BTRFS_EXTENT_REF_V0_KEY) {
    3720                 :            : #else
    3721                 :            :                 BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
    3722                 :            :                 if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
    3723                 :            : #endif
    3724                 :          0 :                         ret = __add_tree_block(rc, key.offset, blocksize,
    3725                 :            :                                                blocks);
    3726         [ #  # ]:          0 :                 } else if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
    3727                 :          0 :                         dref = btrfs_item_ptr(eb, path->slots[0],
    3728                 :            :                                               struct btrfs_extent_data_ref);
    3729                 :          0 :                         ret = find_data_references(rc, extent_key,
    3730                 :            :                                                    eb, dref, blocks);
    3731                 :            :                 } else {
    3732                 :            :                         ret = 0;
    3733                 :            :                 }
    3734         [ #  # ]:          0 :                 if (ret) {
    3735                 :            :                         err = ret;
    3736                 :            :                         break;
    3737                 :            :                 }
    3738                 :          0 :                 path->slots[0]++;
    3739                 :          0 :         }
    3740                 :            : out:
    3741                 :          0 :         btrfs_release_path(path);
    3742         [ #  # ]:          0 :         if (err)
    3743                 :          0 :                 free_block_list(blocks);
    3744                 :          0 :         return err;
    3745                 :            : }
    3746                 :            : 
    3747                 :            : /*
    3748                 :            :  * helper to find next unprocessed extent
    3749                 :            :  */
    3750                 :            : static noinline_for_stack
    3751                 :          0 : int find_next_extent(struct btrfs_trans_handle *trans,
    3752                 :            :                      struct reloc_control *rc, struct btrfs_path *path,
    3753                 :            :                      struct btrfs_key *extent_key)
    3754                 :            : {
    3755                 :            :         struct btrfs_key key;
    3756                 :          0 :         struct extent_buffer *leaf;
    3757                 :            :         u64 start, end, last;
    3758                 :            :         int ret;
    3759                 :            : 
    3760                 :          0 :         last = rc->block_group->key.objectid + rc->block_group->key.offset;
    3761                 :            :         while (1) {
    3762                 :          0 :                 cond_resched();
    3763         [ #  # ]:          0 :                 if (rc->search_start >= last) {
    3764                 :            :                         ret = 1;
    3765                 :            :                         break;
    3766                 :            :                 }
    3767                 :            : 
    3768                 :          0 :                 key.objectid = rc->search_start;
    3769                 :          0 :                 key.type = BTRFS_EXTENT_ITEM_KEY;
    3770                 :          0 :                 key.offset = 0;
    3771                 :            : 
    3772                 :          0 :                 path->search_commit_root = 1;
    3773                 :          0 :                 path->skip_locking = 1;
    3774                 :          0 :                 ret = btrfs_search_slot(NULL, rc->extent_root, &key, path,
    3775                 :            :                                         0, 0);
    3776         [ #  # ]:          0 :                 if (ret < 0)
    3777                 :            :                         break;
    3778                 :            : next:
    3779                 :          0 :                 leaf = path->nodes[0];
    3780         [ #  # ]:          0 :                 if (path->slots[0] >= btrfs_header_nritems(leaf)) {
    3781                 :          0 :                         ret = btrfs_next_leaf(rc->extent_root, path);
    3782         [ #  # ]:          0 :                         if (ret != 0)
    3783                 :            :                                 break;
    3784                 :          0 :                         leaf = path->nodes[0];
    3785                 :            :                 }
    3786                 :            : 
    3787                 :          0 :                 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
    3788         [ #  # ]:          0 :                 if (key.objectid >= last) {
    3789                 :            :                         ret = 1;
    3790                 :            :                         break;
    3791                 :            :                 }
    3792                 :            : 
    3793         [ #  # ]:          0 :                 if (key.type != BTRFS_EXTENT_ITEM_KEY &&
    3794                 :            :                     key.type != BTRFS_METADATA_ITEM_KEY) {
    3795                 :          0 :                         path->slots[0]++;
    3796                 :            :                         goto next;
    3797                 :            :                 }
    3798                 :            : 
    3799 [ #  # ][ #  # ]:          0 :                 if (key.type == BTRFS_EXTENT_ITEM_KEY &&
    3800                 :          0 :                     key.objectid + key.offset <= rc->search_start) {
    3801                 :          0 :                         path->slots[0]++;
    3802                 :            :                         goto next;
    3803                 :            :                 }
    3804                 :            : 
    3805 [ #  # ][ #  # ]:          0 :                 if (key.type == BTRFS_METADATA_ITEM_KEY &&
    3806                 :          0 :                     key.objectid + rc->extent_root->leafsize <=
    3807                 :          0 :                     rc->search_start) {
    3808                 :          0 :                         path->slots[0]++;
    3809                 :            :                         goto next;
    3810                 :            :                 }
    3811                 :            : 
    3812                 :          0 :                 ret = find_first_extent_bit(&rc->processed_blocks,
    3813                 :            :                                             key.objectid, &start, &end,
    3814                 :            :                                             EXTENT_DIRTY, NULL);
    3815                 :            : 
    3816 [ #  # ][ #  # ]:          0 :                 if (ret == 0 && start <= key.objectid) {
    3817                 :          0 :                         btrfs_release_path(path);
    3818                 :          0 :                         rc->search_start = end + 1;
    3819                 :            :                 } else {
    3820         [ #  # ]:          0 :                         if (key.type == BTRFS_EXTENT_ITEM_KEY)
    3821                 :          0 :                                 rc->search_start = key.objectid + key.offset;
    3822                 :            :                         else
    3823                 :          0 :                                 rc->search_start = key.objectid +
    3824                 :          0 :                                         rc->extent_root->leafsize;
    3825                 :          0 :                         memcpy(extent_key, &key, sizeof(key));
    3826                 :            :                         return 0;
    3827                 :            :                 }
    3828                 :            :         }
    3829                 :          0 :         btrfs_release_path(path);
    3830                 :            :         return ret;
    3831                 :            : }
    3832                 :            : 
    3833                 :          0 : static void set_reloc_control(struct reloc_control *rc)
    3834                 :            : {
    3835                 :          0 :         struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
    3836                 :            : 
    3837                 :          0 :         mutex_lock(&fs_info->reloc_mutex);
    3838                 :          0 :         fs_info->reloc_ctl = rc;
    3839                 :          0 :         mutex_unlock(&fs_info->reloc_mutex);
    3840                 :          0 : }
    3841                 :            : 
    3842                 :          0 : static void unset_reloc_control(struct reloc_control *rc)
    3843                 :            : {
    3844                 :          0 :         struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
    3845                 :            : 
    3846                 :          0 :         mutex_lock(&fs_info->reloc_mutex);
    3847                 :          0 :         fs_info->reloc_ctl = NULL;
    3848                 :          0 :         mutex_unlock(&fs_info->reloc_mutex);
    3849                 :          0 : }
    3850                 :            : 
    3851                 :          0 : static int check_extent_flags(u64 flags)
    3852                 :            : {
    3853 [ #  # ][ #  # ]:          0 :         if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
    3854                 :          0 :             (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
    3855                 :            :                 return 1;
    3856 [ #  # ][ #  # ]:          0 :         if (!(flags & BTRFS_EXTENT_FLAG_DATA) &&
    3857                 :          0 :             !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
    3858                 :            :                 return 1;
    3859 [ #  # ][ #  # ]:          0 :         if ((flags & BTRFS_EXTENT_FLAG_DATA) &&
    3860                 :          0 :             (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF))
    3861                 :            :                 return 1;
    3862                 :          0 :         return 0;
    3863                 :            : }
    3864                 :            : 
    3865                 :            : static noinline_for_stack
    3866                 :          0 : int prepare_to_relocate(struct reloc_control *rc)
    3867                 :            : {
    3868                 :            :         struct btrfs_trans_handle *trans;
    3869                 :            : 
    3870                 :          0 :         rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root,
    3871                 :            :                                               BTRFS_BLOCK_RSV_TEMP);
    3872         [ #  # ]:          0 :         if (!rc->block_rsv)
    3873                 :            :                 return -ENOMEM;
    3874                 :            : 
    3875                 :          0 :         memset(&rc->cluster, 0, sizeof(rc->cluster));
    3876                 :          0 :         rc->search_start = rc->block_group->key.objectid;
    3877                 :          0 :         rc->extents_found = 0;
    3878                 :          0 :         rc->nodes_relocated = 0;
    3879                 :          0 :         rc->merging_rsv_size = 0;
    3880                 :          0 :         rc->reserved_bytes = 0;
    3881                 :          0 :         rc->block_rsv->size = rc->extent_root->nodesize *
    3882                 :            :                               RELOCATION_RESERVED_NODES;
    3883                 :            : 
    3884                 :          0 :         rc->create_reloc_tree = 1;
    3885                 :          0 :         set_reloc_control(rc);
    3886                 :            : 
    3887                 :          0 :         trans = btrfs_join_transaction(rc->extent_root);
    3888         [ #  # ]:          0 :         if (IS_ERR(trans)) {
    3889                 :          0 :                 unset_reloc_control(rc);
    3890                 :            :                 /*
    3891                 :            :                  * extent tree is not a ref_cow tree and has no reloc_root to
    3892                 :            :                  * cleanup.  And callers are responsible to free the above
    3893                 :            :                  * block rsv.
    3894                 :            :                  */
    3895                 :          0 :                 return PTR_ERR(trans);
    3896                 :            :         }
    3897                 :          0 :         btrfs_commit_transaction(trans, rc->extent_root);
    3898                 :          0 :         return 0;
    3899                 :            : }
    3900                 :            : 
    3901                 :          0 : static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
    3902                 :            : {
    3903                 :          0 :         struct rb_root blocks = RB_ROOT;
    3904                 :            :         struct btrfs_key key;
    3905                 :          0 :         struct btrfs_trans_handle *trans = NULL;
    3906                 :            :         struct btrfs_path *path;
    3907                 :            :         struct btrfs_extent_item *ei;
    3908                 :            :         u64 flags;
    3909                 :            :         u32 item_size;
    3910                 :            :         int ret;
    3911                 :            :         int err = 0;
    3912                 :            :         int progress = 0;
    3913                 :            : 
    3914                 :          0 :         path = btrfs_alloc_path();
    3915         [ #  # ]:          0 :         if (!path)
    3916                 :            :                 return -ENOMEM;
    3917                 :          0 :         path->reada = 1;
    3918                 :            : 
    3919                 :          0 :         ret = prepare_to_relocate(rc);
    3920         [ #  # ]:          0 :         if (ret) {
    3921                 :            :                 err = ret;
    3922                 :            :                 goto out_free;
    3923                 :            :         }
    3924                 :            : 
    3925                 :            :         while (1) {
    3926                 :          0 :                 rc->reserved_bytes = 0;
    3927                 :          0 :                 ret = btrfs_block_rsv_refill(rc->extent_root,
    3928                 :          0 :                                         rc->block_rsv, rc->block_rsv->size,
    3929                 :            :                                         BTRFS_RESERVE_FLUSH_ALL);
    3930         [ #  # ]:          0 :                 if (ret) {
    3931                 :            :                         err = ret;
    3932                 :            :                         break;
    3933                 :            :                 }
    3934                 :          0 :                 progress++;
    3935                 :          0 :                 trans = btrfs_start_transaction(rc->extent_root, 0);
    3936         [ #  # ]:          0 :                 if (IS_ERR(trans)) {
    3937                 :            :                         err = PTR_ERR(trans);
    3938                 :            :                         trans = NULL;
    3939                 :          0 :                         break;
    3940                 :            :                 }
    3941                 :            : restart:
    3942         [ #  # ]:          0 :                 if (update_backref_cache(trans, &rc->backref_cache)) {
    3943                 :          0 :                         btrfs_end_transaction(trans, rc->extent_root);
    3944                 :          0 :                         continue;
    3945                 :            :                 }
    3946                 :            : 
    3947                 :          0 :                 ret = find_next_extent(trans, rc, path, &key);
    3948         [ #  # ]:          0 :                 if (ret < 0)
    3949                 :            :                         err = ret;
    3950         [ #  # ]:          0 :                 if (ret != 0)
    3951                 :            :                         break;
    3952                 :            : 
    3953                 :          0 :                 rc->extents_found++;
    3954                 :            : 
    3955                 :          0 :                 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
    3956                 :            :                                     struct btrfs_extent_item);
    3957                 :          0 :                 item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
    3958         [ #  # ]:          0 :                 if (item_size >= sizeof(*ei)) {
    3959                 :          0 :                         flags = btrfs_extent_flags(path->nodes[0], ei);
    3960                 :          0 :                         ret = check_extent_flags(flags);
    3961         [ #  # ]:          0 :                         BUG_ON(ret);
    3962                 :            : 
    3963                 :            :                 } else {
    3964                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    3965                 :            :                         u64 ref_owner;
    3966                 :          0 :                         int path_change = 0;
    3967                 :            : 
    3968         [ #  # ]:          0 :                         BUG_ON(item_size !=
    3969                 :            :                                sizeof(struct btrfs_extent_item_v0));
    3970                 :          0 :                         ret = get_ref_objectid_v0(rc, path, &key, &ref_owner,
    3971                 :            :                                                   &path_change);
    3972         [ #  # ]:          0 :                         if (ref_owner < BTRFS_FIRST_FREE_OBJECTID)
    3973                 :            :                                 flags = BTRFS_EXTENT_FLAG_TREE_BLOCK;
    3974                 :            :                         else
    3975                 :            :                                 flags = BTRFS_EXTENT_FLAG_DATA;
    3976                 :            : 
    3977         [ #  # ]:          0 :                         if (path_change) {
    3978                 :          0 :                                 btrfs_release_path(path);
    3979                 :            : 
    3980                 :          0 :                                 path->search_commit_root = 1;
    3981                 :          0 :                                 path->skip_locking = 1;
    3982                 :          0 :                                 ret = btrfs_search_slot(NULL, rc->extent_root,
    3983                 :            :                                                         &key, path, 0, 0);
    3984         [ #  # ]:          0 :                                 if (ret < 0) {
    3985                 :            :                                         err = ret;
    3986                 :          0 :                                         break;
    3987                 :            :                                 }
    3988         [ #  # ]:          0 :                                 BUG_ON(ret > 0);
    3989                 :            :                         }
    3990                 :            : #else
    3991                 :            :                         BUG();
    3992                 :            : #endif
    3993                 :            :                 }
    3994                 :            : 
    3995         [ #  # ]:          0 :                 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
    3996                 :          0 :                         ret = add_tree_block(rc, &key, path, &blocks);
    3997 [ #  # ][ #  # ]:          0 :                 } else if (rc->stage == UPDATE_DATA_PTRS &&
    3998                 :          0 :                            (flags & BTRFS_EXTENT_FLAG_DATA)) {
    3999                 :          0 :                         ret = add_data_references(rc, &key, path, &blocks);
    4000                 :            :                 } else {
    4001                 :          0 :                         btrfs_release_path(path);
    4002                 :            :                         ret = 0;
    4003                 :            :                 }
    4004         [ #  # ]:          0 :                 if (ret < 0) {
    4005                 :            :                         err = ret;
    4006                 :            :                         break;
    4007                 :            :                 }
    4008                 :            : 
    4009         [ #  # ]:          0 :                 if (!RB_EMPTY_ROOT(&blocks)) {
    4010                 :          0 :                         ret = relocate_tree_blocks(trans, rc, &blocks);
    4011         [ #  # ]:          0 :                         if (ret < 0) {
    4012                 :            :                                 /*
    4013                 :            :                                  * if we fail to relocate tree blocks, force to update
    4014                 :            :                                  * backref cache when committing transaction.
    4015                 :            :                                  */
    4016                 :          0 :                                 rc->backref_cache.last_trans = trans->transid - 1;
    4017                 :            : 
    4018         [ #  # ]:          0 :                                 if (ret != -EAGAIN) {
    4019                 :            :                                         err = ret;
    4020                 :            :                                         break;
    4021                 :            :                                 }
    4022                 :          0 :                                 rc->extents_found--;
    4023                 :          0 :                                 rc->search_start = key.objectid;
    4024                 :            :                         }
    4025                 :            :                 }
    4026                 :            : 
    4027                 :          0 :                 btrfs_end_transaction_throttle(trans, rc->extent_root);
    4028                 :          0 :                 btrfs_btree_balance_dirty(rc->extent_root);
    4029                 :            :                 trans = NULL;
    4030                 :            : 
    4031 [ #  # ][ #  # ]:          0 :                 if (rc->stage == MOVE_DATA_EXTENTS &&
    4032                 :          0 :                     (flags & BTRFS_EXTENT_FLAG_DATA)) {
    4033                 :          0 :                         rc->found_file_extent = 1;
    4034                 :          0 :                         ret = relocate_data_extent(rc->data_inode,
    4035                 :            :                                                    &key, &rc->cluster);
    4036         [ #  # ]:          0 :                         if (ret < 0) {
    4037                 :            :                                 err = ret;
    4038                 :            :                                 break;
    4039                 :            :                         }
    4040                 :            :                 }
    4041                 :            :         }
    4042 [ #  # ][ #  # ]:          0 :         if (trans && progress && err == -ENOSPC) {
    4043                 :          0 :                 ret = btrfs_force_chunk_alloc(trans, rc->extent_root,
    4044                 :          0 :                                               rc->block_group->flags);
    4045         [ #  # ]:          0 :                 if (ret == 0) {
    4046                 :            :                         err = 0;
    4047                 :            :                         progress = 0;
    4048                 :            :                         goto restart;
    4049                 :            :                 }
    4050                 :            :         }
    4051                 :            : 
    4052                 :          0 :         btrfs_release_path(path);
    4053                 :          0 :         clear_extent_bits(&rc->processed_blocks, 0, (u64)-1, EXTENT_DIRTY,
    4054                 :            :                           GFP_NOFS);
    4055                 :            : 
    4056         [ #  # ]:          0 :         if (trans) {
    4057                 :          0 :                 btrfs_end_transaction_throttle(trans, rc->extent_root);
    4058                 :          0 :                 btrfs_btree_balance_dirty(rc->extent_root);
    4059                 :            :         }
    4060                 :            : 
    4061         [ #  # ]:          0 :         if (!err) {
    4062                 :          0 :                 ret = relocate_file_extent_cluster(rc->data_inode,
    4063                 :            :                                                    &rc->cluster);
    4064         [ #  # ]:          0 :                 if (ret < 0)
    4065                 :            :                         err = ret;
    4066                 :            :         }
    4067                 :            : 
    4068                 :          0 :         rc->create_reloc_tree = 0;
    4069                 :          0 :         set_reloc_control(rc);
    4070                 :            : 
    4071                 :          0 :         backref_cache_cleanup(&rc->backref_cache);
    4072                 :          0 :         btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
    4073                 :            : 
    4074                 :          0 :         err = prepare_to_merge(rc, err);
    4075                 :            : 
    4076                 :          0 :         merge_reloc_roots(rc);
    4077                 :            : 
    4078                 :          0 :         rc->merge_reloc_tree = 0;
    4079                 :          0 :         unset_reloc_control(rc);
    4080                 :          0 :         btrfs_block_rsv_release(rc->extent_root, rc->block_rsv, (u64)-1);
    4081                 :            : 
    4082                 :            :         /* get rid of pinned extents */
    4083                 :          0 :         trans = btrfs_join_transaction(rc->extent_root);
    4084         [ #  # ]:          0 :         if (IS_ERR(trans))
    4085                 :            :                 err = PTR_ERR(trans);
    4086                 :            :         else
    4087                 :          0 :                 btrfs_commit_transaction(trans, rc->extent_root);
    4088                 :            : out_free:
    4089                 :          0 :         btrfs_free_block_rsv(rc->extent_root, rc->block_rsv);
    4090                 :          0 :         btrfs_free_path(path);
    4091                 :          0 :         return err;
    4092                 :            : }
    4093                 :            : 
    4094                 :          0 : static int __insert_orphan_inode(struct btrfs_trans_handle *trans,
    4095                 :            :                                  struct btrfs_root *root, u64 objectid)
    4096                 :            : {
    4097                 :            :         struct btrfs_path *path;
    4098                 :            :         struct btrfs_inode_item *item;
    4099                 :            :         struct extent_buffer *leaf;
    4100                 :            :         int ret;
    4101                 :            : 
    4102                 :          0 :         path = btrfs_alloc_path();
    4103         [ #  # ]:          0 :         if (!path)
    4104                 :            :                 return -ENOMEM;
    4105                 :            : 
    4106                 :          0 :         ret = btrfs_insert_empty_inode(trans, root, path, objectid);
    4107         [ #  # ]:          0 :         if (ret)
    4108                 :            :                 goto out;
    4109                 :            : 
    4110                 :          0 :         leaf = path->nodes[0];
    4111                 :          0 :         item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item);
    4112                 :          0 :         memset_extent_buffer(leaf, 0, (unsigned long)item, sizeof(*item));
    4113                 :            :         btrfs_set_inode_generation(leaf, item, 1);
    4114                 :            :         btrfs_set_inode_size(leaf, item, 0);
    4115                 :            :         btrfs_set_inode_mode(leaf, item, S_IFREG | 0600);
    4116                 :            :         btrfs_set_inode_flags(leaf, item, BTRFS_INODE_NOCOMPRESS |
    4117                 :            :                                           BTRFS_INODE_PREALLOC);
    4118                 :          0 :         btrfs_mark_buffer_dirty(leaf);
    4119                 :          0 :         btrfs_release_path(path);
    4120                 :            : out:
    4121                 :          0 :         btrfs_free_path(path);
    4122                 :          0 :         return ret;
    4123                 :            : }
    4124                 :            : 
    4125                 :            : /*
    4126                 :            :  * helper to create inode for data relocation.
    4127                 :            :  * the inode is in data relocation tree and its link count is 0
    4128                 :            :  */
    4129                 :            : static noinline_for_stack
    4130                 :          0 : struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,
    4131                 :            :                                  struct btrfs_block_group_cache *group)
    4132                 :            : {
    4133                 :            :         struct inode *inode = NULL;
    4134                 :            :         struct btrfs_trans_handle *trans;
    4135                 :            :         struct btrfs_root *root;
    4136                 :            :         struct btrfs_key key;
    4137                 :          0 :         u64 objectid = BTRFS_FIRST_FREE_OBJECTID;
    4138                 :            :         int err = 0;
    4139                 :            : 
    4140                 :          0 :         root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID);
    4141         [ #  # ]:          0 :         if (IS_ERR(root))
    4142                 :            :                 return ERR_CAST(root);
    4143                 :            : 
    4144                 :          0 :         trans = btrfs_start_transaction(root, 6);
    4145         [ #  # ]:          0 :         if (IS_ERR(trans))
    4146                 :            :                 return ERR_CAST(trans);
    4147                 :            : 
    4148                 :          0 :         err = btrfs_find_free_objectid(root, &objectid);
    4149         [ #  # ]:          0 :         if (err)
    4150                 :            :                 goto out;
    4151                 :            : 
    4152                 :          0 :         err = __insert_orphan_inode(trans, root, objectid);
    4153         [ #  # ]:          0 :         BUG_ON(err);
    4154                 :            : 
    4155                 :          0 :         key.objectid = objectid;
    4156                 :          0 :         key.type = BTRFS_INODE_ITEM_KEY;
    4157                 :          0 :         key.offset = 0;
    4158                 :          0 :         inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
    4159 [ #  # ][ #  # ]:          0 :         BUG_ON(IS_ERR(inode) || is_bad_inode(inode));
    4160                 :          0 :         BTRFS_I(inode)->index_cnt = group->key.objectid;
    4161                 :            : 
    4162                 :          0 :         err = btrfs_orphan_add(trans, inode);
    4163                 :            : out:
    4164                 :          0 :         btrfs_end_transaction(trans, root);
    4165                 :          0 :         btrfs_btree_balance_dirty(root);
    4166         [ #  # ]:          0 :         if (err) {
    4167         [ #  # ]:          0 :                 if (inode)
    4168                 :          0 :                         iput(inode);
    4169                 :            :                 inode = ERR_PTR(err);
    4170                 :            :         }
    4171                 :            :         return inode;
    4172                 :            : }
    4173                 :            : 
    4174                 :          0 : static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info)
    4175                 :            : {
    4176                 :            :         struct reloc_control *rc;
    4177                 :            : 
    4178                 :            :         rc = kzalloc(sizeof(*rc), GFP_NOFS);
    4179         [ #  # ]:          0 :         if (!rc)
    4180                 :            :                 return NULL;
    4181                 :            : 
    4182                 :          0 :         INIT_LIST_HEAD(&rc->reloc_roots);
    4183                 :            :         backref_cache_init(&rc->backref_cache);
    4184                 :            :         mapping_tree_init(&rc->reloc_root_tree);
    4185                 :          0 :         extent_io_tree_init(&rc->processed_blocks,
    4186                 :          0 :                             fs_info->btree_inode->i_mapping);
    4187                 :            :         return rc;
    4188                 :            : }
    4189                 :            : 
    4190                 :            : /*
    4191                 :            :  * function to relocate all extents in a block group.
    4192                 :            :  */
    4193                 :          0 : int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)
    4194                 :            : {
    4195                 :          0 :         struct btrfs_fs_info *fs_info = extent_root->fs_info;
    4196                 :            :         struct reloc_control *rc;
    4197                 :            :         struct inode *inode;
    4198                 :            :         struct btrfs_path *path;
    4199                 :            :         int ret;
    4200                 :            :         int rw = 0;
    4201                 :            :         int err = 0;
    4202                 :            : 
    4203                 :          0 :         rc = alloc_reloc_control(fs_info);
    4204         [ #  # ]:          0 :         if (!rc)
    4205                 :            :                 return -ENOMEM;
    4206                 :            : 
    4207                 :          0 :         rc->extent_root = extent_root;
    4208                 :            : 
    4209                 :          0 :         rc->block_group = btrfs_lookup_block_group(fs_info, group_start);
    4210         [ #  # ]:          0 :         BUG_ON(!rc->block_group);
    4211                 :            : 
    4212         [ #  # ]:          0 :         if (!rc->block_group->ro) {
    4213                 :          0 :                 ret = btrfs_set_block_group_ro(extent_root, rc->block_group);
    4214         [ #  # ]:          0 :                 if (ret) {
    4215                 :            :                         err = ret;
    4216                 :            :                         goto out;
    4217                 :            :                 }
    4218                 :            :                 rw = 1;
    4219                 :            :         }
    4220                 :            : 
    4221                 :          0 :         path = btrfs_alloc_path();
    4222         [ #  # ]:          0 :         if (!path) {
    4223                 :            :                 err = -ENOMEM;
    4224                 :            :                 goto out;
    4225                 :            :         }
    4226                 :            : 
    4227                 :          0 :         inode = lookup_free_space_inode(fs_info->tree_root, rc->block_group,
    4228                 :            :                                         path);
    4229                 :          0 :         btrfs_free_path(path);
    4230                 :            : 
    4231         [ #  # ]:          0 :         if (!IS_ERR(inode))
    4232                 :          0 :                 ret = delete_block_group_cache(fs_info, inode, 0);
    4233                 :            :         else
    4234                 :            :                 ret = PTR_ERR(inode);
    4235                 :            : 
    4236         [ #  # ]:          0 :         if (ret && ret != -ENOENT) {
    4237                 :            :                 err = ret;
    4238                 :            :                 goto out;
    4239                 :            :         }
    4240                 :            : 
    4241                 :          0 :         rc->data_inode = create_reloc_inode(fs_info, rc->block_group);
    4242         [ #  # ]:          0 :         if (IS_ERR(rc->data_inode)) {
    4243                 :            :                 err = PTR_ERR(rc->data_inode);
    4244                 :          0 :                 rc->data_inode = NULL;
    4245                 :          0 :                 goto out;
    4246                 :            :         }
    4247                 :            : 
    4248                 :          0 :         btrfs_info(extent_root->fs_info, "relocating block group %llu flags %llu",
    4249                 :            :                rc->block_group->key.objectid, rc->block_group->flags);
    4250                 :            : 
    4251                 :          0 :         ret = btrfs_start_delalloc_roots(fs_info, 0);
    4252         [ #  # ]:          0 :         if (ret < 0) {
    4253                 :            :                 err = ret;
    4254                 :            :                 goto out;
    4255                 :            :         }
    4256                 :          0 :         btrfs_wait_ordered_roots(fs_info, -1);
    4257                 :            : 
    4258                 :            :         while (1) {
    4259                 :          0 :                 mutex_lock(&fs_info->cleaner_mutex);
    4260                 :          0 :                 ret = relocate_block_group(rc);
    4261                 :          0 :                 mutex_unlock(&fs_info->cleaner_mutex);
    4262         [ #  # ]:          0 :                 if (ret < 0) {
    4263                 :            :                         err = ret;
    4264                 :            :                         goto out;
    4265                 :            :                 }
    4266                 :            : 
    4267         [ #  # ]:          0 :                 if (rc->extents_found == 0)
    4268                 :            :                         break;
    4269                 :            : 
    4270                 :          0 :                 btrfs_info(extent_root->fs_info, "found %llu extents",
    4271                 :            :                         rc->extents_found);
    4272                 :            : 
    4273         [ #  # ]:          0 :                 if (rc->stage == MOVE_DATA_EXTENTS && rc->found_file_extent) {
    4274                 :          0 :                         ret = btrfs_wait_ordered_range(rc->data_inode, 0,
    4275                 :            :                                                        (u64)-1);
    4276         [ #  # ]:          0 :                         if (ret) {
    4277                 :            :                                 err = ret;
    4278                 :            :                                 goto out;
    4279                 :            :                         }
    4280                 :          0 :                         invalidate_mapping_pages(rc->data_inode->i_mapping,
    4281                 :            :                                                  0, -1);
    4282                 :          0 :                         rc->stage = UPDATE_DATA_PTRS;
    4283                 :            :                 }
    4284                 :            :         }
    4285                 :            : 
    4286         [ #  # ]:          0 :         WARN_ON(rc->block_group->pinned > 0);
    4287         [ #  # ]:          0 :         WARN_ON(rc->block_group->reserved > 0);
    4288         [ #  # ]:          0 :         WARN_ON(btrfs_block_group_used(&rc->block_group->item) > 0);
    4289                 :            : out:
    4290         [ #  # ]:          0 :         if (err && rw)
    4291                 :          0 :                 btrfs_set_block_group_rw(extent_root, rc->block_group);
    4292                 :          0 :         iput(rc->data_inode);
    4293                 :          0 :         btrfs_put_block_group(rc->block_group);
    4294                 :          0 :         kfree(rc);
    4295                 :          0 :         return err;
    4296                 :            : }
    4297                 :            : 
    4298                 :          0 : static noinline_for_stack int mark_garbage_root(struct btrfs_root *root)
    4299                 :            : {
    4300                 :            :         struct btrfs_trans_handle *trans;
    4301                 :            :         int ret, err;
    4302                 :            : 
    4303                 :          0 :         trans = btrfs_start_transaction(root->fs_info->tree_root, 0);
    4304         [ #  # ]:          0 :         if (IS_ERR(trans))
    4305                 :          0 :                 return PTR_ERR(trans);
    4306                 :            : 
    4307                 :          0 :         memset(&root->root_item.drop_progress, 0,
    4308                 :            :                 sizeof(root->root_item.drop_progress));
    4309                 :          0 :         root->root_item.drop_level = 0;
    4310                 :            :         btrfs_set_root_refs(&root->root_item, 0);
    4311                 :          0 :         ret = btrfs_update_root(trans, root->fs_info->tree_root,
    4312                 :            :                                 &root->root_key, &root->root_item);
    4313                 :            : 
    4314                 :          0 :         err = btrfs_end_transaction(trans, root->fs_info->tree_root);
    4315         [ #  # ]:          0 :         if (err)
    4316                 :            :                 return err;
    4317                 :          0 :         return ret;
    4318                 :            : }
    4319                 :            : 
    4320                 :            : /*
    4321                 :            :  * recover relocation interrupted by system crash.
    4322                 :            :  *
    4323                 :            :  * this function resumes merging reloc trees with corresponding fs trees.
    4324                 :            :  * this is important for keeping the sharing of tree blocks
    4325                 :            :  */
    4326                 :          0 : int btrfs_recover_relocation(struct btrfs_root *root)
    4327                 :            : {
    4328                 :          0 :         LIST_HEAD(reloc_roots);
    4329                 :            :         struct btrfs_key key;
    4330                 :            :         struct btrfs_root *fs_root;
    4331                 :            :         struct btrfs_root *reloc_root;
    4332                 :            :         struct btrfs_path *path;
    4333                 :            :         struct extent_buffer *leaf;
    4334                 :          0 :         struct reloc_control *rc = NULL;
    4335                 :            :         struct btrfs_trans_handle *trans;
    4336                 :            :         int ret;
    4337                 :            :         int err = 0;
    4338                 :            : 
    4339                 :          0 :         path = btrfs_alloc_path();
    4340         [ #  # ]:          0 :         if (!path)
    4341                 :            :                 return -ENOMEM;
    4342                 :          0 :         path->reada = -1;
    4343                 :            : 
    4344                 :          0 :         key.objectid = BTRFS_TREE_RELOC_OBJECTID;
    4345                 :          0 :         key.type = BTRFS_ROOT_ITEM_KEY;
    4346                 :          0 :         key.offset = (u64)-1;
    4347                 :            : 
    4348                 :            :         while (1) {
    4349                 :          0 :                 ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key,
    4350                 :            :                                         path, 0, 0);
    4351         [ #  # ]:          0 :                 if (ret < 0) {
    4352                 :            :                         err = ret;
    4353                 :            :                         goto out;
    4354                 :            :                 }
    4355         [ #  # ]:          0 :                 if (ret > 0) {
    4356         [ #  # ]:          0 :                         if (path->slots[0] == 0)
    4357                 :            :                                 break;
    4358                 :          0 :                         path->slots[0]--;
    4359                 :            :                 }
    4360                 :          0 :                 leaf = path->nodes[0];
    4361                 :          0 :                 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
    4362                 :          0 :                 btrfs_release_path(path);
    4363                 :            : 
    4364 [ #  # ][ #  # ]:          0 :                 if (key.objectid != BTRFS_TREE_RELOC_OBJECTID ||
    4365                 :          0 :                     key.type != BTRFS_ROOT_ITEM_KEY)
    4366                 :            :                         break;
    4367                 :            : 
    4368                 :          0 :                 reloc_root = btrfs_read_fs_root(root, &key);
    4369         [ #  # ]:          0 :                 if (IS_ERR(reloc_root)) {
    4370                 :            :                         err = PTR_ERR(reloc_root);
    4371                 :          0 :                         goto out;
    4372                 :            :                 }
    4373                 :            : 
    4374                 :          0 :                 list_add(&reloc_root->root_list, &reloc_roots);
    4375                 :            : 
    4376         [ #  # ]:          0 :                 if (btrfs_root_refs(&reloc_root->root_item) > 0) {
    4377                 :          0 :                         fs_root = read_fs_root(root->fs_info,
    4378                 :            :                                                reloc_root->root_key.offset);
    4379         [ #  # ]:          0 :                         if (IS_ERR(fs_root)) {
    4380                 :            :                                 ret = PTR_ERR(fs_root);
    4381         [ #  # ]:          0 :                                 if (ret != -ENOENT) {
    4382                 :            :                                         err = ret;
    4383                 :            :                                         goto out;
    4384                 :            :                                 }
    4385                 :          0 :                                 ret = mark_garbage_root(reloc_root);
    4386         [ #  # ]:          0 :                                 if (ret < 0) {
    4387                 :            :                                         err = ret;
    4388                 :            :                                         goto out;
    4389                 :            :                                 }
    4390                 :            :                         }
    4391                 :            :                 }
    4392                 :            : 
    4393         [ #  # ]:          0 :                 if (key.offset == 0)
    4394                 :            :                         break;
    4395                 :            : 
    4396                 :          0 :                 key.offset--;
    4397                 :          0 :         }
    4398                 :          0 :         btrfs_release_path(path);
    4399                 :            : 
    4400         [ #  # ]:          0 :         if (list_empty(&reloc_roots))
    4401                 :            :                 goto out;
    4402                 :            : 
    4403                 :          0 :         rc = alloc_reloc_control(root->fs_info);
    4404         [ #  # ]:          0 :         if (!rc) {
    4405                 :            :                 err = -ENOMEM;
    4406                 :            :                 goto out;
    4407                 :            :         }
    4408                 :            : 
    4409                 :          0 :         rc->extent_root = root->fs_info->extent_root;
    4410                 :            : 
    4411                 :          0 :         set_reloc_control(rc);
    4412                 :            : 
    4413                 :          0 :         trans = btrfs_join_transaction(rc->extent_root);
    4414         [ #  # ]:          0 :         if (IS_ERR(trans)) {
    4415                 :          0 :                 unset_reloc_control(rc);
    4416                 :            :                 err = PTR_ERR(trans);
    4417                 :          0 :                 goto out_free;
    4418                 :            :         }
    4419                 :            : 
    4420                 :          0 :         rc->merge_reloc_tree = 1;
    4421                 :            : 
    4422         [ #  # ]:          0 :         while (!list_empty(&reloc_roots)) {
    4423                 :          0 :                 reloc_root = list_entry(reloc_roots.next,
    4424                 :            :                                         struct btrfs_root, root_list);
    4425                 :            :                 list_del(&reloc_root->root_list);
    4426                 :            : 
    4427         [ #  # ]:          0 :                 if (btrfs_root_refs(&reloc_root->root_item) == 0) {
    4428                 :          0 :                         list_add_tail(&reloc_root->root_list,
    4429                 :            :                                       &rc->reloc_roots);
    4430                 :          0 :                         continue;
    4431                 :            :                 }
    4432                 :            : 
    4433                 :          0 :                 fs_root = read_fs_root(root->fs_info,
    4434                 :            :                                        reloc_root->root_key.offset);
    4435         [ #  # ]:          0 :                 if (IS_ERR(fs_root)) {
    4436                 :            :                         err = PTR_ERR(fs_root);
    4437                 :          0 :                         goto out_free;
    4438                 :            :                 }
    4439                 :            : 
    4440                 :          0 :                 err = __add_reloc_root(reloc_root);
    4441         [ #  # ]:          0 :                 BUG_ON(err < 0); /* -ENOMEM or logic error */
    4442                 :          0 :                 fs_root->reloc_root = reloc_root;
    4443                 :            :         }
    4444                 :            : 
    4445                 :          0 :         err = btrfs_commit_transaction(trans, rc->extent_root);
    4446         [ #  # ]:          0 :         if (err)
    4447                 :            :                 goto out_free;
    4448                 :            : 
    4449                 :          0 :         merge_reloc_roots(rc);
    4450                 :            : 
    4451                 :          0 :         unset_reloc_control(rc);
    4452                 :            : 
    4453                 :          0 :         trans = btrfs_join_transaction(rc->extent_root);
    4454         [ #  # ]:          0 :         if (IS_ERR(trans))
    4455                 :            :                 err = PTR_ERR(trans);
    4456                 :            :         else
    4457                 :          0 :                 err = btrfs_commit_transaction(trans, rc->extent_root);
    4458                 :            : out_free:
    4459                 :          0 :         kfree(rc);
    4460                 :            : out:
    4461         [ #  # ]:          0 :         if (!list_empty(&reloc_roots))
    4462                 :          0 :                 free_reloc_roots(&reloc_roots);
    4463                 :            : 
    4464                 :          0 :         btrfs_free_path(path);
    4465                 :            : 
    4466         [ #  # ]:          0 :         if (err == 0) {
    4467                 :            :                 /* cleanup orphan inode in data relocation tree */
    4468                 :          0 :                 fs_root = read_fs_root(root->fs_info,
    4469                 :            :                                        BTRFS_DATA_RELOC_TREE_OBJECTID);
    4470         [ #  # ]:          0 :                 if (IS_ERR(fs_root))
    4471                 :            :                         err = PTR_ERR(fs_root);
    4472                 :            :                 else
    4473                 :          0 :                         err = btrfs_orphan_cleanup(fs_root);
    4474                 :            :         }
    4475                 :          0 :         return err;
    4476                 :            : }
    4477                 :            : 
    4478                 :            : /*
    4479                 :            :  * helper to add ordered checksum for data relocation.
    4480                 :            :  *
    4481                 :            :  * cloning checksum properly handles the nodatasum extents.
    4482                 :            :  * it also saves CPU time to re-calculate the checksum.
    4483                 :            :  */
    4484                 :          0 : int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len)
    4485                 :            : {
    4486                 :            :         struct btrfs_ordered_sum *sums;
    4487                 :            :         struct btrfs_ordered_extent *ordered;
    4488                 :          0 :         struct btrfs_root *root = BTRFS_I(inode)->root;
    4489                 :            :         int ret;
    4490                 :            :         u64 disk_bytenr;
    4491                 :            :         u64 new_bytenr;
    4492                 :          0 :         LIST_HEAD(list);
    4493                 :            : 
    4494                 :          0 :         ordered = btrfs_lookup_ordered_extent(inode, file_pos);
    4495 [ #  # ][ #  # ]:          0 :         BUG_ON(ordered->file_offset != file_pos || ordered->len != len);
    4496                 :            : 
    4497                 :          0 :         disk_bytenr = file_pos + BTRFS_I(inode)->index_cnt;
    4498                 :          0 :         ret = btrfs_lookup_csums_range(root->fs_info->csum_root, disk_bytenr,
    4499                 :          0 :                                        disk_bytenr + len - 1, &list, 0);
    4500         [ #  # ]:          0 :         if (ret)
    4501                 :            :                 goto out;
    4502                 :            : 
    4503         [ #  # ]:          0 :         while (!list_empty(&list)) {
    4504                 :          0 :                 sums = list_entry(list.next, struct btrfs_ordered_sum, list);
    4505                 :          0 :                 list_del_init(&sums->list);
    4506                 :            : 
    4507                 :            :                 /*
    4508                 :            :                  * We need to offset the new_bytenr based on where the csum is.
    4509                 :            :                  * We need to do this because we will read in entire prealloc
    4510                 :            :                  * extents but we may have written to say the middle of the
    4511                 :            :                  * prealloc extent, so we need to make sure the csum goes with
    4512                 :            :                  * the right disk offset.
    4513                 :            :                  *
    4514                 :            :                  * We can do this because the data reloc inode refers strictly
    4515                 :            :                  * to the on disk bytes, so we don't have to worry about
    4516                 :            :                  * disk_len vs real len like with real inodes since it's all
    4517                 :            :                  * disk length.
    4518                 :            :                  */
    4519                 :          0 :                 new_bytenr = ordered->start + (sums->bytenr - disk_bytenr);
    4520                 :          0 :                 sums->bytenr = new_bytenr;
    4521                 :            : 
    4522                 :          0 :                 btrfs_add_ordered_sum(inode, ordered, sums);
    4523                 :            :         }
    4524                 :            : out:
    4525                 :          0 :         btrfs_put_ordered_extent(ordered);
    4526                 :          0 :         return ret;
    4527                 :            : }
    4528                 :            : 
    4529                 :          0 : int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans,
    4530                 :          0 :                           struct btrfs_root *root, struct extent_buffer *buf,
    4531                 :            :                           struct extent_buffer *cow)
    4532                 :            : {
    4533                 :            :         struct reloc_control *rc;
    4534                 :            :         struct backref_node *node;
    4535                 :            :         int first_cow = 0;
    4536                 :            :         int level;
    4537                 :            :         int ret = 0;
    4538                 :            : 
    4539                 :          0 :         rc = root->fs_info->reloc_ctl;
    4540         [ #  # ]:          0 :         if (!rc)
    4541                 :            :                 return 0;
    4542                 :            : 
    4543 [ #  # ][ #  # ]:          0 :         BUG_ON(rc->stage == UPDATE_DATA_PTRS &&
    4544                 :            :                root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID);
    4545                 :            : 
    4546         [ #  # ]:          0 :         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
    4547         [ #  # ]:          0 :                 if (buf == root->node)
    4548                 :          0 :                         __update_reloc_root(root, cow->start);
    4549                 :            :         }
    4550                 :            : 
    4551                 :          0 :         level = btrfs_header_level(buf);
    4552         [ #  # ]:          0 :         if (btrfs_header_generation(buf) <=
    4553                 :            :             btrfs_root_last_snapshot(&root->root_item))
    4554                 :            :                 first_cow = 1;
    4555                 :            : 
    4556 [ #  # ][ #  # ]:          0 :         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID &&
    4557                 :          0 :             rc->create_reloc_tree) {
    4558         [ #  # ]:          0 :                 WARN_ON(!first_cow && level == 0);
    4559                 :            : 
    4560                 :          0 :                 node = rc->backref_cache.path[level];
    4561 [ #  # ][ #  # ]:          0 :                 BUG_ON(node->bytenr != buf->start &&
    4562                 :            :                        node->new_bytenr != buf->start);
    4563                 :            : 
    4564                 :          0 :                 drop_node_buffer(node);
    4565                 :            :                 extent_buffer_get(cow);
    4566                 :          0 :                 node->eb = cow;
    4567                 :          0 :                 node->new_bytenr = cow->start;
    4568                 :            : 
    4569         [ #  # ]:          0 :                 if (!node->pending) {
    4570                 :          0 :                         list_move_tail(&node->list,
    4571                 :            :                                        &rc->backref_cache.pending[level]);
    4572                 :          0 :                         node->pending = 1;
    4573                 :            :                 }
    4574                 :            : 
    4575         [ #  # ]:          0 :                 if (first_cow)
    4576                 :          0 :                         __mark_block_processed(rc, node);
    4577                 :            : 
    4578         [ #  # ]:          0 :                 if (first_cow && level > 0)
    4579                 :          0 :                         rc->nodes_relocated += buf->len;
    4580                 :            :         }
    4581                 :            : 
    4582 [ #  # ][ #  # ]:          0 :         if (level == 0 && first_cow && rc->stage == UPDATE_DATA_PTRS)
    4583                 :          0 :                 ret = replace_file_extents(trans, rc, root, cow);
    4584                 :          0 :         return ret;
    4585                 :            : }
    4586                 :            : 
    4587                 :            : /*
    4588                 :            :  * called before creating snapshot. it calculates metadata reservation
    4589                 :            :  * requried for relocating tree blocks in the snapshot
    4590                 :            :  */
    4591                 :          0 : void btrfs_reloc_pre_snapshot(struct btrfs_trans_handle *trans,
    4592                 :            :                               struct btrfs_pending_snapshot *pending,
    4593                 :            :                               u64 *bytes_to_reserve)
    4594                 :            : {
    4595                 :            :         struct btrfs_root *root;
    4596                 :            :         struct reloc_control *rc;
    4597                 :            : 
    4598                 :          0 :         root = pending->root;
    4599         [ #  # ]:          0 :         if (!root->reloc_root)
    4600                 :            :                 return;
    4601                 :            : 
    4602                 :          0 :         rc = root->fs_info->reloc_ctl;
    4603         [ #  # ]:          0 :         if (!rc->merge_reloc_tree)
    4604                 :            :                 return;
    4605                 :            : 
    4606                 :            :         root = root->reloc_root;
    4607         [ #  # ]:          0 :         BUG_ON(btrfs_root_refs(&root->root_item) == 0);
    4608                 :            :         /*
    4609                 :            :          * relocation is in the stage of merging trees. the space
    4610                 :            :          * used by merging a reloc tree is twice the size of
    4611                 :            :          * relocated tree nodes in the worst case. half for cowing
    4612                 :            :          * the reloc tree, half for cowing the fs tree. the space
    4613                 :            :          * used by cowing the reloc tree will be freed after the
    4614                 :            :          * tree is dropped. if we create snapshot, cowing the fs
    4615                 :            :          * tree may use more space than it frees. so we need
    4616                 :            :          * reserve extra space.
    4617                 :            :          */
    4618                 :          0 :         *bytes_to_reserve += rc->nodes_relocated;
    4619                 :            : }
    4620                 :            : 
    4621                 :            : /*
    4622                 :            :  * called after snapshot is created. migrate block reservation
    4623                 :            :  * and create reloc root for the newly created snapshot
    4624                 :            :  */
    4625                 :          0 : int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
    4626                 :            :                                struct btrfs_pending_snapshot *pending)
    4627                 :            : {
    4628                 :          0 :         struct btrfs_root *root = pending->root;
    4629                 :            :         struct btrfs_root *reloc_root;
    4630                 :            :         struct btrfs_root *new_root;
    4631                 :            :         struct reloc_control *rc;
    4632                 :            :         int ret;
    4633                 :            : 
    4634         [ #  # ]:          0 :         if (!root->reloc_root)
    4635                 :            :                 return 0;
    4636                 :            : 
    4637                 :          0 :         rc = root->fs_info->reloc_ctl;
    4638                 :          0 :         rc->merging_rsv_size += rc->nodes_relocated;
    4639                 :            : 
    4640         [ #  # ]:          0 :         if (rc->merge_reloc_tree) {
    4641                 :          0 :                 ret = btrfs_block_rsv_migrate(&pending->block_rsv,
    4642                 :            :                                               rc->block_rsv,
    4643                 :            :                                               rc->nodes_relocated);
    4644         [ #  # ]:          0 :                 if (ret)
    4645                 :            :                         return ret;
    4646                 :            :         }
    4647                 :            : 
    4648                 :          0 :         new_root = pending->snap;
    4649                 :          0 :         reloc_root = create_reloc_root(trans, root->reloc_root,
    4650                 :            :                                        new_root->root_key.objectid);
    4651         [ #  # ]:          0 :         if (IS_ERR(reloc_root))
    4652                 :          0 :                 return PTR_ERR(reloc_root);
    4653                 :            : 
    4654                 :          0 :         ret = __add_reloc_root(reloc_root);
    4655         [ #  # ]:          0 :         BUG_ON(ret < 0);
    4656                 :          0 :         new_root->reloc_root = reloc_root;
    4657                 :            : 
    4658         [ #  # ]:          0 :         if (rc->create_reloc_tree)
    4659                 :          0 :                 ret = clone_backref_node(trans, rc, root, reloc_root);
    4660                 :          0 :         return ret;
    4661                 :            : }

Generated by: LCOV version 1.9