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

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 2007,2008 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/slab.h>
      21                 :            : #include <linux/rbtree.h>
      22                 :            : #include "ctree.h"
      23                 :            : #include "disk-io.h"
      24                 :            : #include "transaction.h"
      25                 :            : #include "print-tree.h"
      26                 :            : #include "locking.h"
      27                 :            : 
      28                 :            : static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
      29                 :            :                       *root, struct btrfs_path *path, int level);
      30                 :            : static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
      31                 :            :                       *root, struct btrfs_key *ins_key,
      32                 :            :                       struct btrfs_path *path, int data_size, int extend);
      33                 :            : static int push_node_left(struct btrfs_trans_handle *trans,
      34                 :            :                           struct btrfs_root *root, struct extent_buffer *dst,
      35                 :            :                           struct extent_buffer *src, int empty);
      36                 :            : static int balance_node_right(struct btrfs_trans_handle *trans,
      37                 :            :                               struct btrfs_root *root,
      38                 :            :                               struct extent_buffer *dst_buf,
      39                 :            :                               struct extent_buffer *src_buf);
      40                 :            : static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
      41                 :            :                     int level, int slot);
      42                 :            : static int tree_mod_log_free_eb(struct btrfs_fs_info *fs_info,
      43                 :            :                                  struct extent_buffer *eb);
      44                 :            : 
      45                 :          0 : struct btrfs_path *btrfs_alloc_path(void)
      46                 :            : {
      47                 :            :         struct btrfs_path *path;
      48                 :          0 :         path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
      49                 :          0 :         return path;
      50                 :            : }
      51                 :            : 
      52                 :            : /*
      53                 :            :  * set all locked nodes in the path to blocking locks.  This should
      54                 :            :  * be done before scheduling
      55                 :            :  */
      56                 :          0 : noinline void btrfs_set_path_blocking(struct btrfs_path *p)
      57                 :            : {
      58                 :            :         int i;
      59         [ #  # ]:          0 :         for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
      60 [ #  # ][ #  # ]:          0 :                 if (!p->nodes[i] || !p->locks[i])
      61                 :          0 :                         continue;
      62                 :          0 :                 btrfs_set_lock_blocking_rw(p->nodes[i], p->locks[i]);
      63         [ #  # ]:          0 :                 if (p->locks[i] == BTRFS_READ_LOCK)
      64                 :          0 :                         p->locks[i] = BTRFS_READ_LOCK_BLOCKING;
      65         [ #  # ]:          0 :                 else if (p->locks[i] == BTRFS_WRITE_LOCK)
      66                 :          0 :                         p->locks[i] = BTRFS_WRITE_LOCK_BLOCKING;
      67                 :            :         }
      68                 :          0 : }
      69                 :            : 
      70                 :            : /*
      71                 :            :  * reset all the locked nodes in the patch to spinning locks.
      72                 :            :  *
      73                 :            :  * held is used to keep lockdep happy, when lockdep is enabled
      74                 :            :  * we set held to a blocking lock before we go around and
      75                 :            :  * retake all the spinlocks in the path.  You can safely use NULL
      76                 :            :  * for held
      77                 :            :  */
      78                 :          0 : noinline void btrfs_clear_path_blocking(struct btrfs_path *p,
      79                 :            :                                         struct extent_buffer *held, int held_rw)
      80                 :            : {
      81                 :            :         int i;
      82                 :            : 
      83                 :            : #ifdef CONFIG_DEBUG_LOCK_ALLOC
      84                 :            :         /* lockdep really cares that we take all of these spinlocks
      85                 :            :          * in the right order.  If any of the locks in the path are not
      86                 :            :          * currently blocking, it is going to complain.  So, make really
      87                 :            :          * really sure by forcing the path to blocking before we clear
      88                 :            :          * the path blocking.
      89                 :            :          */
      90                 :            :         if (held) {
      91                 :            :                 btrfs_set_lock_blocking_rw(held, held_rw);
      92                 :            :                 if (held_rw == BTRFS_WRITE_LOCK)
      93                 :            :                         held_rw = BTRFS_WRITE_LOCK_BLOCKING;
      94                 :            :                 else if (held_rw == BTRFS_READ_LOCK)
      95                 :            :                         held_rw = BTRFS_READ_LOCK_BLOCKING;
      96                 :            :         }
      97                 :            :         btrfs_set_path_blocking(p);
      98                 :            : #endif
      99                 :            : 
     100         [ #  # ]:          0 :         for (i = BTRFS_MAX_LEVEL - 1; i >= 0; i--) {
     101 [ #  # ][ #  # ]:          0 :                 if (p->nodes[i] && p->locks[i]) {
     102                 :          0 :                         btrfs_clear_lock_blocking_rw(p->nodes[i], p->locks[i]);
     103         [ #  # ]:          0 :                         if (p->locks[i] == BTRFS_WRITE_LOCK_BLOCKING)
     104                 :          0 :                                 p->locks[i] = BTRFS_WRITE_LOCK;
     105         [ #  # ]:          0 :                         else if (p->locks[i] == BTRFS_READ_LOCK_BLOCKING)
     106                 :          0 :                                 p->locks[i] = BTRFS_READ_LOCK;
     107                 :            :                 }
     108                 :            :         }
     109                 :            : 
     110                 :            : #ifdef CONFIG_DEBUG_LOCK_ALLOC
     111                 :            :         if (held)
     112                 :            :                 btrfs_clear_lock_blocking_rw(held, held_rw);
     113                 :            : #endif
     114                 :          0 : }
     115                 :            : 
     116                 :            : /* this also releases the path */
     117                 :          0 : void btrfs_free_path(struct btrfs_path *p)
     118                 :            : {
     119         [ #  # ]:          0 :         if (!p)
     120                 :          0 :                 return;
     121                 :          0 :         btrfs_release_path(p);
     122                 :          0 :         kmem_cache_free(btrfs_path_cachep, p);
     123                 :            : }
     124                 :            : 
     125                 :            : /*
     126                 :            :  * path release drops references on the extent buffers in the path
     127                 :            :  * and it drops any locks held by this path
     128                 :            :  *
     129                 :            :  * It is safe to call this on paths that no locks or extent buffers held.
     130                 :            :  */
     131                 :          0 : noinline void btrfs_release_path(struct btrfs_path *p)
     132                 :            : {
     133                 :            :         int i;
     134                 :            : 
     135         [ #  # ]:          0 :         for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
     136                 :          0 :                 p->slots[i] = 0;
     137         [ #  # ]:          0 :                 if (!p->nodes[i])
     138                 :          0 :                         continue;
     139         [ #  # ]:          0 :                 if (p->locks[i]) {
     140                 :            :                         btrfs_tree_unlock_rw(p->nodes[i], p->locks[i]);
     141                 :          0 :                         p->locks[i] = 0;
     142                 :            :                 }
     143                 :          0 :                 free_extent_buffer(p->nodes[i]);
     144                 :          0 :                 p->nodes[i] = NULL;
     145                 :            :         }
     146                 :          0 : }
     147                 :            : 
     148                 :            : /*
     149                 :            :  * safely gets a reference on the root node of a tree.  A lock
     150                 :            :  * is not taken, so a concurrent writer may put a different node
     151                 :            :  * at the root of the tree.  See btrfs_lock_root_node for the
     152                 :            :  * looping required.
     153                 :            :  *
     154                 :            :  * The extent buffer returned by this has a reference taken, so
     155                 :            :  * it won't disappear.  It may stop being the root of the tree
     156                 :            :  * at any time because there are no locks held.
     157                 :            :  */
     158                 :          0 : struct extent_buffer *btrfs_root_node(struct btrfs_root *root)
     159                 :            : {
     160                 :            :         struct extent_buffer *eb;
     161                 :            : 
     162                 :            :         while (1) {
     163                 :            :                 rcu_read_lock();
     164                 :          0 :                 eb = rcu_dereference(root->node);
     165                 :            : 
     166                 :            :                 /*
     167                 :            :                  * RCU really hurts here, we could free up the root node because
     168                 :            :                  * it was cow'ed but we may not get the new root node yet so do
     169                 :            :                  * the inc_not_zero dance and if it doesn't work then
     170                 :            :                  * synchronize_rcu and try again.
     171                 :            :                  */
     172         [ #  # ]:          0 :                 if (atomic_inc_not_zero(&eb->refs)) {
     173                 :            :                         rcu_read_unlock();
     174                 :            :                         break;
     175                 :            :                 }
     176                 :            :                 rcu_read_unlock();
     177                 :            :                 synchronize_rcu();
     178                 :            :         }
     179                 :          0 :         return eb;
     180                 :            : }
     181                 :            : 
     182                 :            : /* loop around taking references on and locking the root node of the
     183                 :            :  * tree until you end up with a lock on the root.  A locked buffer
     184                 :            :  * is returned, with a reference held.
     185                 :            :  */
     186                 :          0 : struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root)
     187                 :            : {
     188                 :            :         struct extent_buffer *eb;
     189                 :            : 
     190                 :            :         while (1) {
     191                 :          0 :                 eb = btrfs_root_node(root);
     192                 :          0 :                 btrfs_tree_lock(eb);
     193         [ #  # ]:          0 :                 if (eb == root->node)
     194                 :            :                         break;
     195                 :          0 :                 btrfs_tree_unlock(eb);
     196                 :          0 :                 free_extent_buffer(eb);
     197                 :          0 :         }
     198                 :          0 :         return eb;
     199                 :            : }
     200                 :            : 
     201                 :            : /* loop around taking references on and locking the root node of the
     202                 :            :  * tree until you end up with a lock on the root.  A locked buffer
     203                 :            :  * is returned, with a reference held.
     204                 :            :  */
     205                 :          0 : static struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root)
     206                 :            : {
     207                 :            :         struct extent_buffer *eb;
     208                 :            : 
     209                 :            :         while (1) {
     210                 :          0 :                 eb = btrfs_root_node(root);
     211                 :          0 :                 btrfs_tree_read_lock(eb);
     212         [ #  # ]:          0 :                 if (eb == root->node)
     213                 :            :                         break;
     214                 :          0 :                 btrfs_tree_read_unlock(eb);
     215                 :          0 :                 free_extent_buffer(eb);
     216                 :          0 :         }
     217                 :          0 :         return eb;
     218                 :            : }
     219                 :            : 
     220                 :            : /* cowonly root (everything not a reference counted cow subvolume), just get
     221                 :            :  * put onto a simple dirty list.  transaction.c walks this to make sure they
     222                 :            :  * get properly updated on disk.
     223                 :            :  */
     224                 :          0 : static void add_root_to_dirty_list(struct btrfs_root *root)
     225                 :            : {
     226                 :          0 :         spin_lock(&root->fs_info->trans_lock);
     227 [ #  # ][ #  # ]:          0 :         if (root->track_dirty && list_empty(&root->dirty_list)) {
     228                 :          0 :                 list_add(&root->dirty_list,
     229                 :          0 :                          &root->fs_info->dirty_cowonly_roots);
     230                 :            :         }
     231                 :          0 :         spin_unlock(&root->fs_info->trans_lock);
     232                 :          0 : }
     233                 :            : 
     234                 :            : /*
     235                 :            :  * used by snapshot creation to make a copy of a root for a tree with
     236                 :            :  * a given objectid.  The buffer with the new root node is returned in
     237                 :            :  * cow_ret, and this func returns zero on success or a negative error code.
     238                 :            :  */
     239                 :          0 : int btrfs_copy_root(struct btrfs_trans_handle *trans,
     240                 :            :                       struct btrfs_root *root,
     241                 :          0 :                       struct extent_buffer *buf,
     242                 :            :                       struct extent_buffer **cow_ret, u64 new_root_objectid)
     243                 :            : {
     244                 :          0 :         struct extent_buffer *cow;
     245                 :            :         int ret = 0;
     246                 :            :         int level;
     247                 :            :         struct btrfs_disk_key disk_key;
     248                 :            : 
     249 [ #  # ][ #  # ]:          0 :         WARN_ON(root->ref_cows && trans->transid !=
                 [ #  # ]
     250                 :            :                 root->fs_info->running_transaction->transid);
     251 [ #  # ][ #  # ]:          0 :         WARN_ON(root->ref_cows && trans->transid != root->last_trans);
                 [ #  # ]
     252                 :            : 
     253                 :          0 :         level = btrfs_header_level(buf);
     254         [ #  # ]:          0 :         if (level == 0)
     255                 :            :                 btrfs_item_key(buf, &disk_key, 0);
     256                 :            :         else
     257                 :          0 :                 btrfs_node_key(buf, &disk_key, 0);
     258                 :            : 
     259                 :          0 :         cow = btrfs_alloc_free_block(trans, root, buf->len, 0,
     260                 :            :                                      new_root_objectid, &disk_key, level,
     261                 :            :                                      buf->start, 0);
     262         [ #  # ]:          0 :         if (IS_ERR(cow))
     263                 :          0 :                 return PTR_ERR(cow);
     264                 :            : 
     265                 :          0 :         copy_extent_buffer(cow, buf, 0, 0, cow->len);
     266                 :          0 :         btrfs_set_header_bytenr(cow, cow->start);
     267                 :          0 :         btrfs_set_header_generation(cow, trans->transid);
     268                 :            :         btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
     269                 :            :         btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
     270                 :            :                                      BTRFS_HEADER_FLAG_RELOC);
     271         [ #  # ]:          0 :         if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
     272                 :            :                 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
     273                 :            :         else
     274                 :            :                 btrfs_set_header_owner(cow, new_root_objectid);
     275                 :            : 
     276                 :          0 :         write_extent_buffer(cow, root->fs_info->fsid, btrfs_header_fsid(),
     277                 :            :                             BTRFS_FSID_SIZE);
     278                 :            : 
     279         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(buf) > trans->transid);
     280         [ #  # ]:          0 :         if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
     281                 :          0 :                 ret = btrfs_inc_ref(trans, root, cow, 1, 1);
     282                 :            :         else
     283                 :          0 :                 ret = btrfs_inc_ref(trans, root, cow, 0, 1);
     284                 :            : 
     285         [ #  # ]:          0 :         if (ret)
     286                 :            :                 return ret;
     287                 :            : 
     288                 :          0 :         btrfs_mark_buffer_dirty(cow);
     289                 :          0 :         *cow_ret = cow;
     290                 :          0 :         return 0;
     291                 :            : }
     292                 :            : 
     293                 :            : enum mod_log_op {
     294                 :            :         MOD_LOG_KEY_REPLACE,
     295                 :            :         MOD_LOG_KEY_ADD,
     296                 :            :         MOD_LOG_KEY_REMOVE,
     297                 :            :         MOD_LOG_KEY_REMOVE_WHILE_FREEING,
     298                 :            :         MOD_LOG_KEY_REMOVE_WHILE_MOVING,
     299                 :            :         MOD_LOG_MOVE_KEYS,
     300                 :            :         MOD_LOG_ROOT_REPLACE,
     301                 :            : };
     302                 :            : 
     303                 :            : struct tree_mod_move {
     304                 :            :         int dst_slot;
     305                 :            :         int nr_items;
     306                 :            : };
     307                 :            : 
     308                 :            : struct tree_mod_root {
     309                 :            :         u64 logical;
     310                 :            :         u8 level;
     311                 :            : };
     312                 :            : 
     313                 :            : struct tree_mod_elem {
     314                 :            :         struct rb_node node;
     315                 :            :         u64 index;              /* shifted logical */
     316                 :            :         u64 seq;
     317                 :            :         enum mod_log_op op;
     318                 :            : 
     319                 :            :         /* this is used for MOD_LOG_KEY_* and MOD_LOG_MOVE_KEYS operations */
     320                 :            :         int slot;
     321                 :            : 
     322                 :            :         /* this is used for MOD_LOG_KEY* and MOD_LOG_ROOT_REPLACE */
     323                 :            :         u64 generation;
     324                 :            : 
     325                 :            :         /* those are used for op == MOD_LOG_KEY_{REPLACE,REMOVE} */
     326                 :            :         struct btrfs_disk_key key;
     327                 :            :         u64 blockptr;
     328                 :            : 
     329                 :            :         /* this is used for op == MOD_LOG_MOVE_KEYS */
     330                 :            :         struct tree_mod_move move;
     331                 :            : 
     332                 :            :         /* this is used for op == MOD_LOG_ROOT_REPLACE */
     333                 :            :         struct tree_mod_root old_root;
     334                 :            : };
     335                 :            : 
     336                 :            : static inline void tree_mod_log_read_lock(struct btrfs_fs_info *fs_info)
     337                 :            : {
     338                 :          0 :         read_lock(&fs_info->tree_mod_log_lock);
     339                 :            : }
     340                 :            : 
     341                 :            : static inline void tree_mod_log_read_unlock(struct btrfs_fs_info *fs_info)
     342                 :            : {
     343                 :            :         read_unlock(&fs_info->tree_mod_log_lock);
     344                 :            : }
     345                 :            : 
     346                 :            : static inline void tree_mod_log_write_lock(struct btrfs_fs_info *fs_info)
     347                 :            : {
     348                 :          0 :         write_lock(&fs_info->tree_mod_log_lock);
     349                 :            : }
     350                 :            : 
     351                 :            : static inline void tree_mod_log_write_unlock(struct btrfs_fs_info *fs_info)
     352                 :            : {
     353                 :            :         write_unlock(&fs_info->tree_mod_log_lock);
     354                 :            : }
     355                 :            : 
     356                 :            : /*
     357                 :            :  * Increment the upper half of tree_mod_seq, set lower half zero.
     358                 :            :  *
     359                 :            :  * Must be called with fs_info->tree_mod_seq_lock held.
     360                 :            :  */
     361                 :            : static inline u64 btrfs_inc_tree_mod_seq_major(struct btrfs_fs_info *fs_info)
     362                 :            : {
     363                 :          0 :         u64 seq = atomic64_read(&fs_info->tree_mod_seq);
     364                 :          0 :         seq &= 0xffffffff00000000ull;
     365                 :          0 :         seq += 1ull << 32;
     366                 :          0 :         atomic64_set(&fs_info->tree_mod_seq, seq);
     367                 :            :         return seq;
     368                 :            : }
     369                 :            : 
     370                 :            : /*
     371                 :            :  * Increment the lower half of tree_mod_seq.
     372                 :            :  *
     373                 :            :  * Must be called with fs_info->tree_mod_seq_lock held. The way major numbers
     374                 :            :  * are generated should not technically require a spin lock here. (Rationale:
     375                 :            :  * incrementing the minor while incrementing the major seq number is between its
     376                 :            :  * atomic64_read and atomic64_set calls doesn't duplicate sequence numbers, it
     377                 :            :  * just returns a unique sequence number as usual.) We have decided to leave
     378                 :            :  * that requirement in here and rethink it once we notice it really imposes a
     379                 :            :  * problem on some workload.
     380                 :            :  */
     381                 :            : static inline u64 btrfs_inc_tree_mod_seq_minor(struct btrfs_fs_info *fs_info)
     382                 :            : {
     383                 :          0 :         return atomic64_inc_return(&fs_info->tree_mod_seq);
     384                 :            : }
     385                 :            : 
     386                 :            : /*
     387                 :            :  * return the last minor in the previous major tree_mod_seq number
     388                 :            :  */
     389                 :          0 : u64 btrfs_tree_mod_seq_prev(u64 seq)
     390                 :            : {
     391                 :          0 :         return (seq & 0xffffffff00000000ull) - 1ull;
     392                 :            : }
     393                 :            : 
     394                 :            : /*
     395                 :            :  * This adds a new blocker to the tree mod log's blocker list if the @elem
     396                 :            :  * passed does not already have a sequence number set. So when a caller expects
     397                 :            :  * to record tree modifications, it should ensure to set elem->seq to zero
     398                 :            :  * before calling btrfs_get_tree_mod_seq.
     399                 :            :  * Returns a fresh, unused tree log modification sequence number, even if no new
     400                 :            :  * blocker was added.
     401                 :            :  */
     402                 :          0 : u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info,
     403                 :            :                            struct seq_list *elem)
     404                 :            : {
     405                 :            :         u64 seq;
     406                 :            : 
     407                 :            :         tree_mod_log_write_lock(fs_info);
     408                 :            :         spin_lock(&fs_info->tree_mod_seq_lock);
     409         [ #  # ]:          0 :         if (!elem->seq) {
     410                 :          0 :                 elem->seq = btrfs_inc_tree_mod_seq_major(fs_info);
     411                 :          0 :                 list_add_tail(&elem->list, &fs_info->tree_mod_seq_list);
     412                 :            :         }
     413                 :            :         seq = btrfs_inc_tree_mod_seq_minor(fs_info);
     414                 :            :         spin_unlock(&fs_info->tree_mod_seq_lock);
     415                 :            :         tree_mod_log_write_unlock(fs_info);
     416                 :            : 
     417                 :          0 :         return seq;
     418                 :            : }
     419                 :            : 
     420                 :          0 : void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info,
     421                 :            :                             struct seq_list *elem)
     422                 :            : {
     423                 :            :         struct rb_root *tm_root;
     424                 :            :         struct rb_node *node;
     425                 :            :         struct rb_node *next;
     426                 :            :         struct seq_list *cur_elem;
     427                 :            :         struct tree_mod_elem *tm;
     428                 :            :         u64 min_seq = (u64)-1;
     429                 :          0 :         u64 seq_putting = elem->seq;
     430                 :            : 
     431         [ #  # ]:          0 :         if (!seq_putting)
     432                 :            :                 return;
     433                 :            : 
     434                 :            :         spin_lock(&fs_info->tree_mod_seq_lock);
     435                 :            :         list_del(&elem->list);
     436                 :          0 :         elem->seq = 0;
     437                 :            : 
     438         [ #  # ]:          0 :         list_for_each_entry(cur_elem, &fs_info->tree_mod_seq_list, list) {
     439         [ #  # ]:          0 :                 if (cur_elem->seq < min_seq) {
     440         [ #  # ]:          0 :                         if (seq_putting > cur_elem->seq) {
     441                 :            :                                 /*
     442                 :            :                                  * blocker with lower sequence number exists, we
     443                 :            :                                  * cannot remove anything from the log
     444                 :            :                                  */
     445                 :            :                                 spin_unlock(&fs_info->tree_mod_seq_lock);
     446                 :            :                                 return;
     447                 :            :                         }
     448                 :            :                         min_seq = cur_elem->seq;
     449                 :            :                 }
     450                 :            :         }
     451                 :            :         spin_unlock(&fs_info->tree_mod_seq_lock);
     452                 :            : 
     453                 :            :         /*
     454                 :            :          * anything that's lower than the lowest existing (read: blocked)
     455                 :            :          * sequence number can be removed from the tree.
     456                 :            :          */
     457                 :            :         tree_mod_log_write_lock(fs_info);
     458                 :          0 :         tm_root = &fs_info->tree_mod_log;
     459         [ #  # ]:          0 :         for (node = rb_first(tm_root); node; node = next) {
     460                 :          0 :                 next = rb_next(node);
     461                 :            :                 tm = container_of(node, struct tree_mod_elem, node);
     462         [ #  # ]:          0 :                 if (tm->seq > min_seq)
     463                 :          0 :                         continue;
     464                 :          0 :                 rb_erase(node, tm_root);
     465                 :          0 :                 kfree(tm);
     466                 :            :         }
     467                 :            :         tree_mod_log_write_unlock(fs_info);
     468                 :            : }
     469                 :            : 
     470                 :            : /*
     471                 :            :  * key order of the log:
     472                 :            :  *       index -> sequence
     473                 :            :  *
     474                 :            :  * the index is the shifted logical of the *new* root node for root replace
     475                 :            :  * operations, or the shifted logical of the affected block for all other
     476                 :            :  * operations.
     477                 :            :  *
     478                 :            :  * Note: must be called with write lock (tree_mod_log_write_lock).
     479                 :            :  */
     480                 :            : static noinline int
     481                 :          0 : __tree_mod_log_insert(struct btrfs_fs_info *fs_info, struct tree_mod_elem *tm)
     482                 :            : {
     483                 :            :         struct rb_root *tm_root;
     484                 :            :         struct rb_node **new;
     485                 :            :         struct rb_node *parent = NULL;
     486                 :            :         struct tree_mod_elem *cur;
     487                 :            : 
     488         [ #  # ]:          0 :         BUG_ON(!tm);
     489                 :            : 
     490                 :            :         spin_lock(&fs_info->tree_mod_seq_lock);
     491                 :          0 :         tm->seq = btrfs_inc_tree_mod_seq_minor(fs_info);
     492                 :            :         spin_unlock(&fs_info->tree_mod_seq_lock);
     493                 :            : 
     494                 :          0 :         tm_root = &fs_info->tree_mod_log;
     495                 :          0 :         new = &tm_root->rb_node;
     496         [ #  # ]:          0 :         while (*new) {
     497                 :            :                 cur = container_of(*new, struct tree_mod_elem, node);
     498                 :            :                 parent = *new;
     499         [ #  # ]:          0 :                 if (cur->index < tm->index)
     500                 :          0 :                         new = &((*new)->rb_left);
     501         [ #  # ]:          0 :                 else if (cur->index > tm->index)
     502                 :          0 :                         new = &((*new)->rb_right);
     503         [ #  # ]:          0 :                 else if (cur->seq < tm->seq)
     504                 :          0 :                         new = &((*new)->rb_left);
     505         [ #  # ]:          0 :                 else if (cur->seq > tm->seq)
     506                 :          0 :                         new = &((*new)->rb_right);
     507                 :            :                 else
     508                 :            :                         return -EEXIST;
     509                 :            :         }
     510                 :            : 
     511                 :          0 :         rb_link_node(&tm->node, parent, new);
     512                 :          0 :         rb_insert_color(&tm->node, tm_root);
     513                 :          0 :         return 0;
     514                 :            : }
     515                 :            : 
     516                 :            : /*
     517                 :            :  * Determines if logging can be omitted. Returns 1 if it can. Otherwise, it
     518                 :            :  * returns zero with the tree_mod_log_lock acquired. The caller must hold
     519                 :            :  * this until all tree mod log insertions are recorded in the rb tree and then
     520                 :            :  * call tree_mod_log_write_unlock() to release.
     521                 :            :  */
     522                 :            : static inline int tree_mod_dont_log(struct btrfs_fs_info *fs_info,
     523                 :          0 :                                     struct extent_buffer *eb) {
     524                 :          0 :         smp_mb();
     525   [ #  #  #  #  :          0 :         if (list_empty(&(fs_info)->tree_mod_seq_list))
          #  #  #  #  #  
                      # ]
     526                 :            :                 return 1;
     527   [ #  #  #  # ]:          0 :         if (eb && btrfs_header_level(eb) == 0)
           [ #  #  #  # ]
           [ #  #  #  # ]
     528                 :            :                 return 1;
     529                 :            : 
     530                 :            :         tree_mod_log_write_lock(fs_info);
     531   [ #  #  #  #  :          0 :         if (list_empty(&(fs_info)->tree_mod_seq_list)) {
          #  #  #  #  #  
                      # ]
     532                 :            :                 tree_mod_log_write_unlock(fs_info);
     533                 :            :                 return 1;
     534                 :            :         }
     535                 :            : 
     536                 :            :         return 0;
     537                 :            : }
     538                 :            : 
     539                 :            : /* Similar to tree_mod_dont_log, but doesn't acquire any locks. */
     540                 :            : static inline int tree_mod_need_log(const struct btrfs_fs_info *fs_info,
     541                 :          0 :                                     struct extent_buffer *eb)
     542                 :            : {
     543                 :          0 :         smp_mb();
     544 [ #  # ][ #  # ]:          0 :         if (list_empty(&(fs_info)->tree_mod_seq_list))
                 [ #  # ]
           [ #  #  #  # ]
     545                 :            :                 return 0;
     546   [ #  #  #  # ]:          0 :         if (eb && btrfs_header_level(eb) == 0)
           [ #  #  #  # ]
     547                 :            :                 return 0;
     548                 :            : 
     549                 :            :         return 1;
     550                 :            : }
     551                 :            : 
     552                 :            : static struct tree_mod_elem *
     553                 :          0 : alloc_tree_mod_elem(struct extent_buffer *eb, int slot,
     554                 :            :                     enum mod_log_op op, gfp_t flags)
     555                 :            : {
     556                 :            :         struct tree_mod_elem *tm;
     557                 :            : 
     558                 :            :         tm = kzalloc(sizeof(*tm), flags);
     559         [ #  # ]:          0 :         if (!tm)
     560                 :            :                 return NULL;
     561                 :            : 
     562                 :          0 :         tm->index = eb->start >> PAGE_CACHE_SHIFT;
     563         [ #  # ]:          0 :         if (op != MOD_LOG_KEY_ADD) {
     564                 :          0 :                 btrfs_node_key(eb, &tm->key, slot);
     565                 :          0 :                 tm->blockptr = btrfs_node_blockptr(eb, slot);
     566                 :            :         }
     567                 :          0 :         tm->op = op;
     568                 :          0 :         tm->slot = slot;
     569                 :          0 :         tm->generation = btrfs_node_ptr_generation(eb, slot);
     570                 :          0 :         RB_CLEAR_NODE(&tm->node);
     571                 :            : 
     572                 :          0 :         return tm;
     573                 :            : }
     574                 :            : 
     575                 :            : static noinline int
     576                 :          0 : tree_mod_log_insert_key(struct btrfs_fs_info *fs_info,
     577                 :            :                         struct extent_buffer *eb, int slot,
     578                 :            :                         enum mod_log_op op, gfp_t flags)
     579                 :            : {
     580                 :            :         struct tree_mod_elem *tm;
     581                 :            :         int ret;
     582                 :            : 
     583         [ #  # ]:          0 :         if (!tree_mod_need_log(fs_info, eb))
     584                 :            :                 return 0;
     585                 :            : 
     586                 :          0 :         tm = alloc_tree_mod_elem(eb, slot, op, flags);
     587         [ #  # ]:          0 :         if (!tm)
     588                 :            :                 return -ENOMEM;
     589                 :            : 
     590         [ #  # ]:          0 :         if (tree_mod_dont_log(fs_info, eb)) {
     591                 :          0 :                 kfree(tm);
     592                 :          0 :                 return 0;
     593                 :            :         }
     594                 :            : 
     595                 :          0 :         ret = __tree_mod_log_insert(fs_info, tm);
     596                 :            :         tree_mod_log_write_unlock(fs_info);
     597         [ #  # ]:          0 :         if (ret)
     598                 :          0 :                 kfree(tm);
     599                 :            : 
     600                 :          0 :         return ret;
     601                 :            : }
     602                 :            : 
     603                 :            : static noinline int
     604                 :          0 : tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
     605                 :            :                          struct extent_buffer *eb, int dst_slot, int src_slot,
     606                 :            :                          int nr_items, gfp_t flags)
     607                 :            : {
     608                 :            :         struct tree_mod_elem *tm = NULL;
     609                 :            :         struct tree_mod_elem **tm_list = NULL;
     610                 :            :         int ret = 0;
     611                 :            :         int i;
     612                 :            :         int locked = 0;
     613                 :            : 
     614         [ #  # ]:          0 :         if (!tree_mod_need_log(fs_info, eb))
     615                 :            :                 return 0;
     616                 :            : 
     617                 :          0 :         tm_list = kzalloc(nr_items * sizeof(struct tree_mod_elem *), flags);
     618         [ #  # ]:          0 :         if (!tm_list)
     619                 :            :                 return -ENOMEM;
     620                 :            : 
     621                 :            :         tm = kzalloc(sizeof(*tm), flags);
     622         [ #  # ]:          0 :         if (!tm) {
     623                 :            :                 ret = -ENOMEM;
     624                 :            :                 goto free_tms;
     625                 :            :         }
     626                 :            : 
     627                 :          0 :         tm->index = eb->start >> PAGE_CACHE_SHIFT;
     628                 :          0 :         tm->slot = src_slot;
     629                 :          0 :         tm->move.dst_slot = dst_slot;
     630                 :          0 :         tm->move.nr_items = nr_items;
     631                 :          0 :         tm->op = MOD_LOG_MOVE_KEYS;
     632                 :            : 
     633 [ #  # ][ #  # ]:          0 :         for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
     634                 :          0 :                 tm_list[i] = alloc_tree_mod_elem(eb, i + dst_slot,
     635                 :            :                     MOD_LOG_KEY_REMOVE_WHILE_MOVING, flags);
     636         [ #  # ]:          0 :                 if (!tm_list[i]) {
     637                 :            :                         ret = -ENOMEM;
     638                 :            :                         goto free_tms;
     639                 :            :                 }
     640                 :            :         }
     641                 :            : 
     642         [ #  # ]:          0 :         if (tree_mod_dont_log(fs_info, eb))
     643                 :            :                 goto free_tms;
     644                 :            :         locked = 1;
     645                 :            : 
     646                 :            :         /*
     647                 :            :          * When we override something during the move, we log these removals.
     648                 :            :          * This can only happen when we move towards the beginning of the
     649                 :            :          * buffer, i.e. dst_slot < src_slot.
     650                 :            :          */
     651 [ #  # ][ #  # ]:          0 :         for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
     652                 :          0 :                 ret = __tree_mod_log_insert(fs_info, tm_list[i]);
     653         [ #  # ]:          0 :                 if (ret)
     654                 :            :                         goto free_tms;
     655                 :            :         }
     656                 :            : 
     657                 :          0 :         ret = __tree_mod_log_insert(fs_info, tm);
     658         [ #  # ]:          0 :         if (ret)
     659                 :            :                 goto free_tms;
     660                 :            :         tree_mod_log_write_unlock(fs_info);
     661                 :          0 :         kfree(tm_list);
     662                 :            : 
     663                 :          0 :         return 0;
     664                 :            : free_tms:
     665         [ #  # ]:          0 :         for (i = 0; i < nr_items; i++) {
     666 [ #  # ][ #  # ]:          0 :                 if (tm_list[i] && !RB_EMPTY_NODE(&tm_list[i]->node))
     667                 :          0 :                         rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log);
     668                 :          0 :                 kfree(tm_list[i]);
     669                 :            :         }
     670         [ #  # ]:          0 :         if (locked)
     671                 :            :                 tree_mod_log_write_unlock(fs_info);
     672                 :          0 :         kfree(tm_list);
     673                 :          0 :         kfree(tm);
     674                 :            : 
     675                 :          0 :         return ret;
     676                 :            : }
     677                 :            : 
     678                 :            : static inline int
     679                 :            : __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info,
     680                 :            :                        struct tree_mod_elem **tm_list,
     681                 :            :                        int nritems)
     682                 :            : {
     683                 :            :         int i, j;
     684                 :            :         int ret;
     685                 :            : 
     686 [ #  # ][ #  # ]:          0 :         for (i = nritems - 1; i >= 0; i--) {
     687                 :          0 :                 ret = __tree_mod_log_insert(fs_info, tm_list[i]);
     688 [ #  # ][ #  # ]:          0 :                 if (ret) {
     689 [ #  # ][ #  # ]:          0 :                         for (j = nritems - 1; j > i; j--)
     690                 :          0 :                                 rb_erase(&tm_list[j]->node,
     691                 :            :                                          &fs_info->tree_mod_log);
     692                 :            :                         return ret;
     693                 :            :                 }
     694                 :            :         }
     695                 :            : 
     696                 :            :         return 0;
     697                 :            : }
     698                 :            : 
     699                 :            : static noinline int
     700                 :          0 : tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
     701                 :          0 :                          struct extent_buffer *old_root,
     702                 :            :                          struct extent_buffer *new_root, gfp_t flags,
     703                 :            :                          int log_removal)
     704                 :            : {
     705                 :            :         struct tree_mod_elem *tm = NULL;
     706                 :            :         struct tree_mod_elem **tm_list = NULL;
     707                 :            :         int nritems = 0;
     708                 :            :         int ret = 0;
     709                 :            :         int i;
     710                 :            : 
     711         [ #  # ]:          0 :         if (!tree_mod_need_log(fs_info, NULL))
     712                 :            :                 return 0;
     713                 :            : 
     714   [ #  #  #  # ]:          0 :         if (log_removal && btrfs_header_level(old_root) > 0) {
     715                 :          0 :                 nritems = btrfs_header_nritems(old_root);
     716                 :          0 :                 tm_list = kzalloc(nritems * sizeof(struct tree_mod_elem *),
     717                 :            :                                   flags);
     718         [ #  # ]:          0 :                 if (!tm_list) {
     719                 :            :                         ret = -ENOMEM;
     720                 :            :                         goto free_tms;
     721                 :            :                 }
     722         [ #  # ]:          0 :                 for (i = 0; i < nritems; i++) {
     723                 :          0 :                         tm_list[i] = alloc_tree_mod_elem(old_root, i,
     724                 :            :                             MOD_LOG_KEY_REMOVE_WHILE_FREEING, flags);
     725         [ #  # ]:          0 :                         if (!tm_list[i]) {
     726                 :            :                                 ret = -ENOMEM;
     727                 :            :                                 goto free_tms;
     728                 :            :                         }
     729                 :            :                 }
     730                 :            :         }
     731                 :            : 
     732                 :            :         tm = kzalloc(sizeof(*tm), flags);
     733         [ #  # ]:          0 :         if (!tm) {
     734                 :            :                 ret = -ENOMEM;
     735                 :            :                 goto free_tms;
     736                 :            :         }
     737                 :            : 
     738                 :          0 :         tm->index = new_root->start >> PAGE_CACHE_SHIFT;
     739                 :          0 :         tm->old_root.logical = old_root->start;
     740                 :          0 :         tm->old_root.level = btrfs_header_level(old_root);
     741                 :          0 :         tm->generation = btrfs_header_generation(old_root);
     742                 :          0 :         tm->op = MOD_LOG_ROOT_REPLACE;
     743                 :            : 
     744         [ #  # ]:          0 :         if (tree_mod_dont_log(fs_info, NULL))
     745                 :            :                 goto free_tms;
     746                 :            : 
     747         [ #  # ]:          0 :         if (tm_list)
     748                 :            :                 ret = __tree_mod_log_free_eb(fs_info, tm_list, nritems);
     749         [ #  # ]:          0 :         if (!ret)
     750                 :          0 :                 ret = __tree_mod_log_insert(fs_info, tm);
     751                 :            : 
     752                 :            :         tree_mod_log_write_unlock(fs_info);
     753         [ #  # ]:          0 :         if (ret)
     754                 :            :                 goto free_tms;
     755                 :          0 :         kfree(tm_list);
     756                 :            : 
     757                 :            :         return ret;
     758                 :            : 
     759                 :            : free_tms:
     760         [ #  # ]:          0 :         if (tm_list) {
     761         [ #  # ]:          0 :                 for (i = 0; i < nritems; i++)
     762                 :          0 :                         kfree(tm_list[i]);
     763                 :          0 :                 kfree(tm_list);
     764                 :            :         }
     765                 :          0 :         kfree(tm);
     766                 :            : 
     767                 :            :         return ret;
     768                 :            : }
     769                 :            : 
     770                 :            : static struct tree_mod_elem *
     771                 :          0 : __tree_mod_log_search(struct btrfs_fs_info *fs_info, u64 start, u64 min_seq,
     772                 :            :                       int smallest)
     773                 :            : {
     774                 :            :         struct rb_root *tm_root;
     775                 :            :         struct rb_node *node;
     776                 :            :         struct tree_mod_elem *cur = NULL;
     777                 :            :         struct tree_mod_elem *found = NULL;
     778                 :          0 :         u64 index = start >> PAGE_CACHE_SHIFT;
     779                 :            : 
     780                 :            :         tree_mod_log_read_lock(fs_info);
     781                 :            :         tm_root = &fs_info->tree_mod_log;
     782                 :          0 :         node = tm_root->rb_node;
     783         [ #  # ]:          0 :         while (node) {
     784                 :            :                 cur = container_of(node, struct tree_mod_elem, node);
     785         [ #  # ]:          0 :                 if (cur->index < index) {
     786                 :          0 :                         node = node->rb_left;
     787         [ #  # ]:          0 :                 } else if (cur->index > index) {
     788                 :          0 :                         node = node->rb_right;
     789         [ #  # ]:          0 :                 } else if (cur->seq < min_seq) {
     790                 :          0 :                         node = node->rb_left;
     791         [ #  # ]:          0 :                 } else if (!smallest) {
     792                 :            :                         /* we want the node with the highest seq */
     793         [ #  # ]:          0 :                         if (found)
     794         [ #  # ]:          0 :                                 BUG_ON(found->seq > cur->seq);
     795                 :            :                         found = cur;
     796                 :          0 :                         node = node->rb_left;
     797         [ #  # ]:          0 :                 } else if (cur->seq > min_seq) {
     798                 :            :                         /* we want the node with the smallest seq */
     799         [ #  # ]:          0 :                         if (found)
     800         [ #  # ]:          0 :                                 BUG_ON(found->seq < cur->seq);
     801                 :            :                         found = cur;
     802                 :          0 :                         node = node->rb_right;
     803                 :            :                 } else {
     804                 :            :                         found = cur;
     805                 :            :                         break;
     806                 :            :                 }
     807                 :            :         }
     808                 :            :         tree_mod_log_read_unlock(fs_info);
     809                 :            : 
     810                 :          0 :         return found;
     811                 :            : }
     812                 :            : 
     813                 :            : /*
     814                 :            :  * this returns the element from the log with the smallest time sequence
     815                 :            :  * value that's in the log (the oldest log item). any element with a time
     816                 :            :  * sequence lower than min_seq will be ignored.
     817                 :            :  */
     818                 :            : static struct tree_mod_elem *
     819                 :            : tree_mod_log_search_oldest(struct btrfs_fs_info *fs_info, u64 start,
     820                 :            :                            u64 min_seq)
     821                 :            : {
     822                 :          0 :         return __tree_mod_log_search(fs_info, start, min_seq, 1);
     823                 :            : }
     824                 :            : 
     825                 :            : /*
     826                 :            :  * this returns the element from the log with the largest time sequence
     827                 :            :  * value that's in the log (the most recent log item). any element with
     828                 :            :  * a time sequence lower than min_seq will be ignored.
     829                 :            :  */
     830                 :            : static struct tree_mod_elem *
     831                 :          0 : tree_mod_log_search(struct btrfs_fs_info *fs_info, u64 start, u64 min_seq)
     832                 :            : {
     833                 :          0 :         return __tree_mod_log_search(fs_info, start, min_seq, 0);
     834                 :            : }
     835                 :            : 
     836                 :            : static noinline int
     837                 :          0 : tree_mod_log_eb_copy(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
     838                 :          0 :                      struct extent_buffer *src, unsigned long dst_offset,
     839                 :            :                      unsigned long src_offset, int nr_items)
     840                 :            : {
     841                 :            :         int ret = 0;
     842                 :            :         struct tree_mod_elem **tm_list = NULL;
     843                 :            :         struct tree_mod_elem **tm_list_add, **tm_list_rem;
     844                 :            :         int i;
     845                 :            :         int locked = 0;
     846                 :            : 
     847         [ #  # ]:          0 :         if (!tree_mod_need_log(fs_info, NULL))
     848                 :            :                 return 0;
     849                 :            : 
     850   [ #  #  #  # ]:          0 :         if (btrfs_header_level(dst) == 0 && btrfs_header_level(src) == 0)
     851                 :            :                 return 0;
     852                 :            : 
     853                 :          0 :         tm_list = kzalloc(nr_items * 2 * sizeof(struct tree_mod_elem *),
     854                 :            :                           GFP_NOFS);
     855         [ #  # ]:          0 :         if (!tm_list)
     856                 :            :                 return -ENOMEM;
     857                 :            : 
     858                 :            :         tm_list_add = tm_list;
     859                 :          0 :         tm_list_rem = tm_list + nr_items;
     860         [ #  # ]:          0 :         for (i = 0; i < nr_items; i++) {
     861                 :          0 :                 tm_list_rem[i] = alloc_tree_mod_elem(src, i + src_offset,
     862                 :            :                     MOD_LOG_KEY_REMOVE, GFP_NOFS);
     863         [ #  # ]:          0 :                 if (!tm_list_rem[i]) {
     864                 :            :                         ret = -ENOMEM;
     865                 :            :                         goto free_tms;
     866                 :            :                 }
     867                 :            : 
     868                 :          0 :                 tm_list_add[i] = alloc_tree_mod_elem(dst, i + dst_offset,
     869                 :            :                     MOD_LOG_KEY_ADD, GFP_NOFS);
     870         [ #  # ]:          0 :                 if (!tm_list_add[i]) {
     871                 :            :                         ret = -ENOMEM;
     872                 :            :                         goto free_tms;
     873                 :            :                 }
     874                 :            :         }
     875                 :            : 
     876         [ #  # ]:          0 :         if (tree_mod_dont_log(fs_info, NULL))
     877                 :            :                 goto free_tms;
     878                 :            :         locked = 1;
     879                 :            : 
     880         [ #  # ]:          0 :         for (i = 0; i < nr_items; i++) {
     881                 :          0 :                 ret = __tree_mod_log_insert(fs_info, tm_list_rem[i]);
     882         [ #  # ]:          0 :                 if (ret)
     883                 :            :                         goto free_tms;
     884                 :          0 :                 ret = __tree_mod_log_insert(fs_info, tm_list_add[i]);
     885         [ #  # ]:          0 :                 if (ret)
     886                 :            :                         goto free_tms;
     887                 :            :         }
     888                 :            : 
     889                 :            :         tree_mod_log_write_unlock(fs_info);
     890                 :          0 :         kfree(tm_list);
     891                 :            : 
     892                 :          0 :         return 0;
     893                 :            : 
     894                 :            : free_tms:
     895         [ #  # ]:          0 :         for (i = 0; i < nr_items * 2; i++) {
     896 [ #  # ][ #  # ]:          0 :                 if (tm_list[i] && !RB_EMPTY_NODE(&tm_list[i]->node))
     897                 :          0 :                         rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log);
     898                 :          0 :                 kfree(tm_list[i]);
     899                 :            :         }
     900         [ #  # ]:          0 :         if (locked)
     901                 :            :                 tree_mod_log_write_unlock(fs_info);
     902                 :          0 :         kfree(tm_list);
     903                 :            : 
     904                 :          0 :         return ret;
     905                 :            : }
     906                 :            : 
     907                 :            : static inline void
     908                 :            : tree_mod_log_eb_move(struct btrfs_fs_info *fs_info, struct extent_buffer *dst,
     909                 :            :                      int dst_offset, int src_offset, int nr_items)
     910                 :            : {
     911                 :            :         int ret;
     912                 :          0 :         ret = tree_mod_log_insert_move(fs_info, dst, dst_offset, src_offset,
     913                 :            :                                        nr_items, GFP_NOFS);
     914 [ #  # ][ #  # ]:          0 :         BUG_ON(ret < 0);
                 [ #  # ]
     915                 :            : }
     916                 :            : 
     917                 :            : static noinline void
     918                 :          0 : tree_mod_log_set_node_key(struct btrfs_fs_info *fs_info,
     919                 :            :                           struct extent_buffer *eb, int slot, int atomic)
     920                 :            : {
     921                 :            :         int ret;
     922                 :            : 
     923         [ #  # ]:          0 :         ret = tree_mod_log_insert_key(fs_info, eb, slot,
     924                 :            :                                         MOD_LOG_KEY_REPLACE,
     925                 :            :                                         atomic ? GFP_ATOMIC : GFP_NOFS);
     926         [ #  # ]:          0 :         BUG_ON(ret < 0);
     927                 :          0 : }
     928                 :            : 
     929                 :            : static noinline int
     930                 :          0 : tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb)
     931                 :            : {
     932                 :            :         struct tree_mod_elem **tm_list = NULL;
     933                 :            :         int nritems = 0;
     934                 :            :         int i;
     935                 :            :         int ret = 0;
     936                 :            : 
     937         [ #  # ]:          0 :         if (btrfs_header_level(eb) == 0)
     938                 :            :                 return 0;
     939                 :            : 
     940         [ #  # ]:          0 :         if (!tree_mod_need_log(fs_info, NULL))
     941                 :            :                 return 0;
     942                 :            : 
     943                 :          0 :         nritems = btrfs_header_nritems(eb);
     944                 :          0 :         tm_list = kzalloc(nritems * sizeof(struct tree_mod_elem *),
     945                 :            :                           GFP_NOFS);
     946         [ #  # ]:          0 :         if (!tm_list)
     947                 :            :                 return -ENOMEM;
     948                 :            : 
     949         [ #  # ]:          0 :         for (i = 0; i < nritems; i++) {
     950                 :          0 :                 tm_list[i] = alloc_tree_mod_elem(eb, i,
     951                 :            :                     MOD_LOG_KEY_REMOVE_WHILE_FREEING, GFP_NOFS);
     952         [ #  # ]:          0 :                 if (!tm_list[i]) {
     953                 :            :                         ret = -ENOMEM;
     954                 :            :                         goto free_tms;
     955                 :            :                 }
     956                 :            :         }
     957                 :            : 
     958         [ #  # ]:          0 :         if (tree_mod_dont_log(fs_info, eb))
     959                 :            :                 goto free_tms;
     960                 :            : 
     961                 :            :         ret = __tree_mod_log_free_eb(fs_info, tm_list, nritems);
     962                 :            :         tree_mod_log_write_unlock(fs_info);
     963         [ #  # ]:          0 :         if (ret)
     964                 :            :                 goto free_tms;
     965                 :          0 :         kfree(tm_list);
     966                 :            : 
     967                 :          0 :         return 0;
     968                 :            : 
     969                 :            : free_tms:
     970         [ #  # ]:          0 :         for (i = 0; i < nritems; i++)
     971                 :          0 :                 kfree(tm_list[i]);
     972                 :          0 :         kfree(tm_list);
     973                 :            : 
     974                 :          0 :         return ret;
     975                 :            : }
     976                 :            : 
     977                 :            : static noinline void
     978                 :          0 : tree_mod_log_set_root_pointer(struct btrfs_root *root,
     979                 :            :                               struct extent_buffer *new_root_node,
     980                 :            :                               int log_removal)
     981                 :            : {
     982                 :            :         int ret;
     983                 :          0 :         ret = tree_mod_log_insert_root(root->fs_info, root->node,
     984                 :            :                                        new_root_node, GFP_NOFS, log_removal);
     985         [ #  # ]:          0 :         BUG_ON(ret < 0);
     986                 :          0 : }
     987                 :            : 
     988                 :            : /*
     989                 :            :  * check if the tree block can be shared by multiple trees
     990                 :            :  */
     991                 :          0 : int btrfs_block_can_be_shared(struct btrfs_root *root,
     992                 :          0 :                               struct extent_buffer *buf)
     993                 :            : {
     994                 :            :         /*
     995                 :            :          * Tree blocks not in refernece counted trees and tree roots
     996                 :            :          * are never shared. If a block was allocated after the last
     997                 :            :          * snapshot and the block was not allocated by tree relocation,
     998                 :            :          * we know the block is not shared.
     999                 :            :          */
    1000 [ #  # ][ #  # ]:          0 :         if (root->ref_cows &&
    1001   [ #  #  #  # ]:          0 :             buf != root->node && buf != root->commit_root &&
    1002                 :            :             (btrfs_header_generation(buf) <=
    1003         [ #  # ]:          0 :              btrfs_root_last_snapshot(&root->root_item) ||
    1004                 :            :              btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)))
    1005                 :            :                 return 1;
    1006                 :            : #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
    1007   [ #  #  #  # ]:          0 :         if (root->ref_cows &&
    1008                 :            :             btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
    1009                 :            :                 return 1;
    1010                 :            : #endif
    1011                 :            :         return 0;
    1012                 :            : }
    1013                 :            : 
    1014                 :          0 : static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
    1015                 :            :                                        struct btrfs_root *root,
    1016                 :          0 :                                        struct extent_buffer *buf,
    1017                 :            :                                        struct extent_buffer *cow,
    1018                 :            :                                        int *last_ref)
    1019                 :            : {
    1020                 :            :         u64 refs;
    1021                 :            :         u64 owner;
    1022                 :            :         u64 flags;
    1023                 :            :         u64 new_flags = 0;
    1024                 :            :         int ret;
    1025                 :            : 
    1026                 :            :         /*
    1027                 :            :          * Backrefs update rules:
    1028                 :            :          *
    1029                 :            :          * Always use full backrefs for extent pointers in tree block
    1030                 :            :          * allocated by tree relocation.
    1031                 :            :          *
    1032                 :            :          * If a shared tree block is no longer referenced by its owner
    1033                 :            :          * tree (btrfs_header_owner(buf) == root->root_key.objectid),
    1034                 :            :          * use full backrefs for extent pointers in tree block.
    1035                 :            :          *
    1036                 :            :          * If a tree block is been relocating
    1037                 :            :          * (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID),
    1038                 :            :          * use full backrefs for extent pointers in tree block.
    1039                 :            :          * The reason for this is some operations (such as drop tree)
    1040                 :            :          * are only allowed for blocks use full backrefs.
    1041                 :            :          */
    1042                 :            : 
    1043         [ #  # ]:          0 :         if (btrfs_block_can_be_shared(root, buf)) {
    1044                 :          0 :                 ret = btrfs_lookup_extent_info(trans, root, buf->start,
    1045                 :            :                                                btrfs_header_level(buf), 1,
    1046                 :            :                                                &refs, &flags);
    1047         [ #  # ]:          0 :                 if (ret)
    1048                 :            :                         return ret;
    1049         [ #  # ]:          0 :                 if (refs == 0) {
    1050                 :            :                         ret = -EROFS;
    1051                 :          0 :                         btrfs_std_error(root->fs_info, ret);
    1052                 :          0 :                         return ret;
    1053                 :            :                 }
    1054                 :            :         } else {
    1055                 :          0 :                 refs = 1;
    1056   [ #  #  #  # ]:          0 :                 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
    1057                 :            :                     btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
    1058                 :          0 :                         flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
    1059                 :            :                 else
    1060                 :          0 :                         flags = 0;
    1061                 :            :         }
    1062                 :            : 
    1063                 :            :         owner = btrfs_header_owner(buf);
    1064 [ #  # ][ #  # ]:          0 :         BUG_ON(owner == BTRFS_TREE_RELOC_OBJECTID &&
    1065                 :            :                !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF));
    1066                 :            : 
    1067         [ #  # ]:          0 :         if (refs > 1) {
    1068 [ #  # ][ #  # ]:          0 :                 if ((owner == root->root_key.objectid ||
    1069         [ #  # ]:          0 :                      root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) &&
    1070                 :          0 :                     !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) {
    1071                 :          0 :                         ret = btrfs_inc_ref(trans, root, buf, 1, 1);
    1072         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
    1073                 :            : 
    1074         [ #  # ]:          0 :                         if (root->root_key.objectid ==
    1075                 :            :                             BTRFS_TREE_RELOC_OBJECTID) {
    1076                 :          0 :                                 ret = btrfs_dec_ref(trans, root, buf, 0, 1);
    1077         [ #  # ]:          0 :                                 BUG_ON(ret); /* -ENOMEM */
    1078                 :          0 :                                 ret = btrfs_inc_ref(trans, root, cow, 1, 1);
    1079         [ #  # ]:          0 :                                 BUG_ON(ret); /* -ENOMEM */
    1080                 :            :                         }
    1081                 :            :                         new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
    1082                 :            :                 } else {
    1083                 :            : 
    1084         [ #  # ]:          0 :                         if (root->root_key.objectid ==
    1085                 :            :                             BTRFS_TREE_RELOC_OBJECTID)
    1086                 :          0 :                                 ret = btrfs_inc_ref(trans, root, cow, 1, 1);
    1087                 :            :                         else
    1088                 :          0 :                                 ret = btrfs_inc_ref(trans, root, cow, 0, 1);
    1089         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
    1090                 :            :                 }
    1091         [ #  # ]:          0 :                 if (new_flags != 0) {
    1092                 :          0 :                         int level = btrfs_header_level(buf);
    1093                 :            : 
    1094                 :          0 :                         ret = btrfs_set_disk_extent_flags(trans, root,
    1095                 :            :                                                           buf->start,
    1096                 :          0 :                                                           buf->len,
    1097                 :            :                                                           new_flags, level, 0);
    1098         [ #  # ]:          0 :                         if (ret)
    1099                 :          0 :                                 return ret;
    1100                 :            :                 }
    1101                 :            :         } else {
    1102         [ #  # ]:          0 :                 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
    1103         [ #  # ]:          0 :                         if (root->root_key.objectid ==
    1104                 :            :                             BTRFS_TREE_RELOC_OBJECTID)
    1105                 :          0 :                                 ret = btrfs_inc_ref(trans, root, cow, 1, 1);
    1106                 :            :                         else
    1107                 :          0 :                                 ret = btrfs_inc_ref(trans, root, cow, 0, 1);
    1108         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
    1109                 :          0 :                         ret = btrfs_dec_ref(trans, root, buf, 1, 1);
    1110         [ #  # ]:          0 :                         BUG_ON(ret); /* -ENOMEM */
    1111                 :            :                 }
    1112                 :          0 :                 clean_tree_block(trans, root, buf);
    1113                 :          0 :                 *last_ref = 1;
    1114                 :            :         }
    1115                 :            :         return 0;
    1116                 :            : }
    1117                 :            : 
    1118                 :            : /*
    1119                 :            :  * does the dirty work in cow of a single block.  The parent block (if
    1120                 :            :  * supplied) is updated to point to the new cow copy.  The new buffer is marked
    1121                 :            :  * dirty and returned locked.  If you modify the block it needs to be marked
    1122                 :            :  * dirty again.
    1123                 :            :  *
    1124                 :            :  * search_start -- an allocation hint for the new block
    1125                 :            :  *
    1126                 :            :  * empty_size -- a hint that you plan on doing more cow.  This is the size in
    1127                 :            :  * bytes the allocator should try to find free next to the block it returns.
    1128                 :            :  * This is just a hint and may be ignored by the allocator.
    1129                 :            :  */
    1130                 :          0 : static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
    1131                 :          0 :                              struct btrfs_root *root,
    1132                 :          0 :                              struct extent_buffer *buf,
    1133                 :          0 :                              struct extent_buffer *parent, int parent_slot,
    1134                 :            :                              struct extent_buffer **cow_ret,
    1135                 :            :                              u64 search_start, u64 empty_size)
    1136                 :            : {
    1137                 :            :         struct btrfs_disk_key disk_key;
    1138                 :          0 :         struct extent_buffer *cow;
    1139                 :            :         int level, ret;
    1140                 :          0 :         int last_ref = 0;
    1141                 :            :         int unlock_orig = 0;
    1142                 :            :         u64 parent_start;
    1143                 :            : 
    1144         [ #  # ]:          0 :         if (*cow_ret == buf)
    1145                 :            :                 unlock_orig = 1;
    1146                 :            : 
    1147                 :          0 :         btrfs_assert_tree_locked(buf);
    1148                 :            : 
    1149 [ #  # ][ #  # ]:          0 :         WARN_ON(root->ref_cows && trans->transid !=
                 [ #  # ]
    1150                 :            :                 root->fs_info->running_transaction->transid);
    1151 [ #  # ][ #  # ]:          0 :         WARN_ON(root->ref_cows && trans->transid != root->last_trans);
                 [ #  # ]
    1152                 :            : 
    1153                 :          0 :         level = btrfs_header_level(buf);
    1154                 :            : 
    1155         [ #  # ]:          0 :         if (level == 0)
    1156                 :            :                 btrfs_item_key(buf, &disk_key, 0);
    1157                 :            :         else
    1158                 :          0 :                 btrfs_node_key(buf, &disk_key, 0);
    1159                 :            : 
    1160         [ #  # ]:          0 :         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
    1161         [ #  # ]:          0 :                 if (parent)
    1162                 :          0 :                         parent_start = parent->start;
    1163                 :            :                 else
    1164                 :            :                         parent_start = 0;
    1165                 :            :         } else
    1166                 :            :                 parent_start = 0;
    1167                 :            : 
    1168                 :          0 :         cow = btrfs_alloc_free_block(trans, root, buf->len, parent_start,
    1169                 :            :                                      root->root_key.objectid, &disk_key,
    1170                 :            :                                      level, search_start, empty_size);
    1171         [ #  # ]:          0 :         if (IS_ERR(cow))
    1172                 :          0 :                 return PTR_ERR(cow);
    1173                 :            : 
    1174                 :            :         /* cow is set to blocking by btrfs_init_new_buffer */
    1175                 :            : 
    1176                 :          0 :         copy_extent_buffer(cow, buf, 0, 0, cow->len);
    1177                 :          0 :         btrfs_set_header_bytenr(cow, cow->start);
    1178                 :          0 :         btrfs_set_header_generation(cow, trans->transid);
    1179                 :            :         btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
    1180                 :            :         btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
    1181                 :            :                                      BTRFS_HEADER_FLAG_RELOC);
    1182         [ #  # ]:          0 :         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
    1183                 :            :                 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
    1184                 :            :         else
    1185                 :            :                 btrfs_set_header_owner(cow, root->root_key.objectid);
    1186                 :            : 
    1187                 :          0 :         write_extent_buffer(cow, root->fs_info->fsid, btrfs_header_fsid(),
    1188                 :            :                             BTRFS_FSID_SIZE);
    1189                 :            : 
    1190                 :          0 :         ret = update_ref_for_cow(trans, root, buf, cow, &last_ref);
    1191         [ #  # ]:          0 :         if (ret) {
    1192                 :          0 :                 btrfs_abort_transaction(trans, root, ret);
    1193                 :          0 :                 return ret;
    1194                 :            :         }
    1195                 :            : 
    1196         [ #  # ]:          0 :         if (root->ref_cows) {
    1197                 :          0 :                 ret = btrfs_reloc_cow_block(trans, root, buf, cow);
    1198         [ #  # ]:          0 :                 if (ret)
    1199                 :            :                         return ret;
    1200                 :            :         }
    1201                 :            : 
    1202         [ #  # ]:          0 :         if (buf == root->node) {
    1203         [ #  # ]:          0 :                 WARN_ON(parent && parent != buf);
    1204   [ #  #  #  # ]:          0 :                 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
    1205                 :            :                     btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
    1206                 :          0 :                         parent_start = buf->start;
    1207                 :            :                 else
    1208                 :            :                         parent_start = 0;
    1209                 :            : 
    1210                 :            :                 extent_buffer_get(cow);
    1211                 :          0 :                 tree_mod_log_set_root_pointer(root, cow, 1);
    1212                 :          0 :                 rcu_assign_pointer(root->node, cow);
    1213                 :            : 
    1214                 :          0 :                 btrfs_free_tree_block(trans, root, buf, parent_start,
    1215                 :            :                                       last_ref);
    1216                 :          0 :                 free_extent_buffer(buf);
    1217                 :          0 :                 add_root_to_dirty_list(root);
    1218                 :            :         } else {
    1219         [ #  # ]:          0 :                 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
    1220                 :          0 :                         parent_start = parent->start;
    1221                 :            :                 else
    1222                 :            :                         parent_start = 0;
    1223                 :            : 
    1224         [ #  # ]:          0 :                 WARN_ON(trans->transid != btrfs_header_generation(parent));
    1225                 :          0 :                 tree_mod_log_insert_key(root->fs_info, parent, parent_slot,
    1226                 :            :                                         MOD_LOG_KEY_REPLACE, GFP_NOFS);
    1227                 :          0 :                 btrfs_set_node_blockptr(parent, parent_slot,
    1228                 :            :                                         cow->start);
    1229                 :          0 :                 btrfs_set_node_ptr_generation(parent, parent_slot,
    1230                 :            :                                               trans->transid);
    1231                 :          0 :                 btrfs_mark_buffer_dirty(parent);
    1232         [ #  # ]:          0 :                 if (last_ref) {
    1233                 :          0 :                         ret = tree_mod_log_free_eb(root->fs_info, buf);
    1234         [ #  # ]:          0 :                         if (ret) {
    1235                 :          0 :                                 btrfs_abort_transaction(trans, root, ret);
    1236                 :          0 :                                 return ret;
    1237                 :            :                         }
    1238                 :            :                 }
    1239                 :          0 :                 btrfs_free_tree_block(trans, root, buf, parent_start,
    1240                 :            :                                       last_ref);
    1241                 :            :         }
    1242         [ #  # ]:          0 :         if (unlock_orig)
    1243                 :          0 :                 btrfs_tree_unlock(buf);
    1244                 :          0 :         free_extent_buffer_stale(buf);
    1245                 :          0 :         btrfs_mark_buffer_dirty(cow);
    1246                 :          0 :         *cow_ret = cow;
    1247                 :          0 :         return 0;
    1248                 :            : }
    1249                 :            : 
    1250                 :            : /*
    1251                 :            :  * returns the logical address of the oldest predecessor of the given root.
    1252                 :            :  * entries older than time_seq are ignored.
    1253                 :            :  */
    1254                 :            : static struct tree_mod_elem *
    1255                 :          0 : __tree_mod_log_oldest_root(struct btrfs_fs_info *fs_info,
    1256                 :            :                            struct extent_buffer *eb_root, u64 time_seq)
    1257                 :            : {
    1258                 :            :         struct tree_mod_elem *tm;
    1259                 :            :         struct tree_mod_elem *found = NULL;
    1260                 :          0 :         u64 root_logical = eb_root->start;
    1261                 :            :         int looped = 0;
    1262                 :            : 
    1263         [ #  # ]:          0 :         if (!time_seq)
    1264                 :            :                 return NULL;
    1265                 :            : 
    1266                 :            :         /*
    1267                 :            :          * the very last operation that's logged for a root is the replacement
    1268                 :            :          * operation (if it is replaced at all). this has the index of the *new*
    1269                 :            :          * root, making it the very first operation that's logged for this root.
    1270                 :            :          */
    1271                 :            :         while (1) {
    1272                 :            :                 tm = tree_mod_log_search_oldest(fs_info, root_logical,
    1273                 :            :                                                 time_seq);
    1274         [ #  # ]:          0 :                 if (!looped && !tm)
    1275                 :            :                         return NULL;
    1276                 :            :                 /*
    1277                 :            :                  * if there are no tree operation for the oldest root, we simply
    1278                 :            :                  * return it. this should only happen if that (old) root is at
    1279                 :            :                  * level 0.
    1280                 :            :                  */
    1281         [ #  # ]:          0 :                 if (!tm)
    1282                 :            :                         break;
    1283                 :            : 
    1284                 :            :                 /*
    1285                 :            :                  * if there's an operation that's not a root replacement, we
    1286                 :            :                  * found the oldest version of our root. normally, we'll find a
    1287                 :            :                  * MOD_LOG_KEY_REMOVE_WHILE_FREEING operation here.
    1288                 :            :                  */
    1289         [ #  # ]:          0 :                 if (tm->op != MOD_LOG_ROOT_REPLACE)
    1290                 :            :                         break;
    1291                 :            : 
    1292                 :            :                 found = tm;
    1293                 :          0 :                 root_logical = tm->old_root.logical;
    1294                 :            :                 looped = 1;
    1295                 :            :         }
    1296                 :            : 
    1297                 :            :         /* if there's no old root to return, return what we found instead */
    1298         [ #  # ]:          0 :         if (!found)
    1299                 :            :                 found = tm;
    1300                 :            : 
    1301                 :            :         return found;
    1302                 :            : }
    1303                 :            : 
    1304                 :            : /*
    1305                 :            :  * tm is a pointer to the first operation to rewind within eb. then, all
    1306                 :            :  * previous operations will be rewinded (until we reach something older than
    1307                 :            :  * time_seq).
    1308                 :            :  */
    1309                 :            : static void
    1310                 :          0 : __tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct extent_buffer *eb,
    1311                 :            :                       u64 time_seq, struct tree_mod_elem *first_tm)
    1312                 :            : {
    1313                 :            :         u32 n;
    1314                 :            :         struct rb_node *next;
    1315                 :            :         struct tree_mod_elem *tm = first_tm;
    1316                 :            :         unsigned long o_dst;
    1317                 :            :         unsigned long o_src;
    1318                 :            :         unsigned long p_size = sizeof(struct btrfs_key_ptr);
    1319                 :            : 
    1320                 :            :         n = btrfs_header_nritems(eb);
    1321                 :            :         tree_mod_log_read_lock(fs_info);
    1322 [ #  # ][ #  # ]:          0 :         while (tm && tm->seq >= time_seq) {
    1323                 :            :                 /*
    1324                 :            :                  * all the operations are recorded with the operator used for
    1325                 :            :                  * the modification. as we're going backwards, we do the
    1326                 :            :                  * opposite of each operation here.
    1327                 :            :                  */
    1328   [ #  #  #  #  :          0 :                 switch (tm->op) {
                   #  # ]
    1329                 :            :                 case MOD_LOG_KEY_REMOVE_WHILE_FREEING:
    1330         [ #  # ]:          0 :                         BUG_ON(tm->slot < n);
    1331                 :            :                         /* Fallthrough */
    1332                 :            :                 case MOD_LOG_KEY_REMOVE_WHILE_MOVING:
    1333                 :            :                 case MOD_LOG_KEY_REMOVE:
    1334                 :          0 :                         btrfs_set_node_key(eb, &tm->key, tm->slot);
    1335                 :          0 :                         btrfs_set_node_blockptr(eb, tm->slot, tm->blockptr);
    1336                 :          0 :                         btrfs_set_node_ptr_generation(eb, tm->slot,
    1337                 :            :                                                       tm->generation);
    1338                 :          0 :                         n++;
    1339                 :          0 :                         break;
    1340                 :            :                 case MOD_LOG_KEY_REPLACE:
    1341         [ #  # ]:          0 :                         BUG_ON(tm->slot >= n);
    1342                 :          0 :                         btrfs_set_node_key(eb, &tm->key, tm->slot);
    1343                 :          0 :                         btrfs_set_node_blockptr(eb, tm->slot, tm->blockptr);
    1344                 :          0 :                         btrfs_set_node_ptr_generation(eb, tm->slot,
    1345                 :            :                                                       tm->generation);
    1346                 :            :                         break;
    1347                 :            :                 case MOD_LOG_KEY_ADD:
    1348                 :            :                         /* if a move operation is needed it's in the log */
    1349                 :          0 :                         n--;
    1350                 :          0 :                         break;
    1351                 :            :                 case MOD_LOG_MOVE_KEYS:
    1352                 :          0 :                         o_dst = btrfs_node_key_ptr_offset(tm->slot);
    1353                 :          0 :                         o_src = btrfs_node_key_ptr_offset(tm->move.dst_slot);
    1354                 :          0 :                         memmove_extent_buffer(eb, o_dst, o_src,
    1355                 :          0 :                                               tm->move.nr_items * p_size);
    1356                 :          0 :                         break;
    1357                 :            :                 case MOD_LOG_ROOT_REPLACE:
    1358                 :            :                         /*
    1359                 :            :                          * this operation is special. for roots, this must be
    1360                 :            :                          * handled explicitly before rewinding.
    1361                 :            :                          * for non-roots, this operation may exist if the node
    1362                 :            :                          * was a root: root A -> child B; then A gets empty and
    1363                 :            :                          * B is promoted to the new root. in the mod log, we'll
    1364                 :            :                          * have a root-replace operation for B, a tree block
    1365                 :            :                          * that is no root. we simply ignore that operation.
    1366                 :            :                          */
    1367                 :            :                         break;
    1368                 :            :                 }
    1369                 :          0 :                 next = rb_next(&tm->node);
    1370         [ #  # ]:          0 :                 if (!next)
    1371                 :            :                         break;
    1372                 :            :                 tm = container_of(next, struct tree_mod_elem, node);
    1373         [ #  # ]:          0 :                 if (tm->index != first_tm->index)
    1374                 :            :                         break;
    1375                 :            :         }
    1376                 :            :         tree_mod_log_read_unlock(fs_info);
    1377                 :            :         btrfs_set_header_nritems(eb, n);
    1378                 :          0 : }
    1379                 :            : 
    1380                 :            : /*
    1381                 :            :  * Called with eb read locked. If the buffer cannot be rewinded, the same buffer
    1382                 :            :  * is returned. If rewind operations happen, a fresh buffer is returned. The
    1383                 :            :  * returned buffer is always read-locked. If the returned buffer is not the
    1384                 :            :  * input buffer, the lock on the input buffer is released and the input buffer
    1385                 :            :  * is freed (its refcount is decremented).
    1386                 :            :  */
    1387                 :            : static struct extent_buffer *
    1388                 :          0 : tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
    1389                 :          0 :                     struct extent_buffer *eb, u64 time_seq)
    1390                 :            : {
    1391                 :          0 :         struct extent_buffer *eb_rewin;
    1392                 :            :         struct tree_mod_elem *tm;
    1393                 :            : 
    1394         [ #  # ]:          0 :         if (!time_seq)
    1395                 :            :                 return eb;
    1396                 :            : 
    1397         [ #  # ]:          0 :         if (btrfs_header_level(eb) == 0)
    1398                 :            :                 return eb;
    1399                 :            : 
    1400                 :          0 :         tm = tree_mod_log_search(fs_info, eb->start, time_seq);
    1401         [ #  # ]:          0 :         if (!tm)
    1402                 :            :                 return eb;
    1403                 :            : 
    1404                 :          0 :         btrfs_set_path_blocking(path);
    1405                 :          0 :         btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
    1406                 :            : 
    1407         [ #  # ]:          0 :         if (tm->op == MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
    1408         [ #  # ]:          0 :                 BUG_ON(tm->slot != 0);
    1409                 :          0 :                 eb_rewin = alloc_dummy_extent_buffer(eb->start,
    1410                 :          0 :                                                 fs_info->tree_root->nodesize);
    1411         [ #  # ]:          0 :                 if (!eb_rewin) {
    1412                 :          0 :                         btrfs_tree_read_unlock_blocking(eb);
    1413                 :          0 :                         free_extent_buffer(eb);
    1414                 :          0 :                         return NULL;
    1415                 :            :                 }
    1416                 :          0 :                 btrfs_set_header_bytenr(eb_rewin, eb->start);
    1417                 :            :                 btrfs_set_header_backref_rev(eb_rewin,
    1418                 :            :                                              btrfs_header_backref_rev(eb));
    1419                 :            :                 btrfs_set_header_owner(eb_rewin, btrfs_header_owner(eb));
    1420                 :            :                 btrfs_set_header_level(eb_rewin, btrfs_header_level(eb));
    1421                 :            :         } else {
    1422                 :          0 :                 eb_rewin = btrfs_clone_extent_buffer(eb);
    1423         [ #  # ]:          0 :                 if (!eb_rewin) {
    1424                 :          0 :                         btrfs_tree_read_unlock_blocking(eb);
    1425                 :          0 :                         free_extent_buffer(eb);
    1426                 :          0 :                         return NULL;
    1427                 :            :                 }
    1428                 :            :         }
    1429                 :            : 
    1430                 :          0 :         btrfs_clear_path_blocking(path, NULL, BTRFS_READ_LOCK);
    1431                 :          0 :         btrfs_tree_read_unlock_blocking(eb);
    1432                 :          0 :         free_extent_buffer(eb);
    1433                 :            : 
    1434                 :            :         extent_buffer_get(eb_rewin);
    1435                 :          0 :         btrfs_tree_read_lock(eb_rewin);
    1436                 :          0 :         __tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm);
    1437         [ #  # ]:          0 :         WARN_ON(btrfs_header_nritems(eb_rewin) >
    1438                 :            :                 BTRFS_NODEPTRS_PER_BLOCK(fs_info->tree_root));
    1439                 :            : 
    1440                 :          0 :         return eb_rewin;
    1441                 :            : }
    1442                 :            : 
    1443                 :            : /*
    1444                 :            :  * get_old_root() rewinds the state of @root's root node to the given @time_seq
    1445                 :            :  * value. If there are no changes, the current root->root_node is returned. If
    1446                 :            :  * anything changed in between, there's a fresh buffer allocated on which the
    1447                 :            :  * rewind operations are done. In any case, the returned buffer is read locked.
    1448                 :            :  * Returns NULL on error (with no locks held).
    1449                 :            :  */
    1450                 :            : static inline struct extent_buffer *
    1451                 :          0 : get_old_root(struct btrfs_root *root, u64 time_seq)
    1452                 :            : {
    1453                 :            :         struct tree_mod_elem *tm;
    1454                 :          0 :         struct extent_buffer *eb = NULL;
    1455                 :          0 :         struct extent_buffer *eb_root;
    1456                 :            :         struct extent_buffer *old;
    1457                 :            :         struct tree_mod_root *old_root = NULL;
    1458                 :            :         u64 old_generation = 0;
    1459                 :            :         u64 logical;
    1460                 :            :         u32 blocksize;
    1461                 :            : 
    1462                 :          0 :         eb_root = btrfs_read_lock_root_node(root);
    1463                 :          0 :         tm = __tree_mod_log_oldest_root(root->fs_info, eb_root, time_seq);
    1464         [ #  # ]:          0 :         if (!tm)
    1465                 :            :                 return eb_root;
    1466                 :            : 
    1467         [ #  # ]:          0 :         if (tm->op == MOD_LOG_ROOT_REPLACE) {
    1468                 :          0 :                 old_root = &tm->old_root;
    1469                 :          0 :                 old_generation = tm->generation;
    1470                 :          0 :                 logical = old_root->logical;
    1471                 :            :         } else {
    1472                 :          0 :                 logical = eb_root->start;
    1473                 :            :         }
    1474                 :            : 
    1475                 :          0 :         tm = tree_mod_log_search(root->fs_info, logical, time_seq);
    1476 [ #  # ][ #  # ]:          0 :         if (old_root && tm && tm->op != MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
    1477                 :          0 :                 btrfs_tree_read_unlock(eb_root);
    1478                 :          0 :                 free_extent_buffer(eb_root);
    1479                 :          0 :                 blocksize = btrfs_level_size(root, old_root->level);
    1480                 :          0 :                 old = read_tree_block(root, logical, blocksize, 0);
    1481 [ #  # ][ #  # ]:          0 :                 if (WARN_ON(!old || !extent_buffer_uptodate(old))) {
         [ #  # ][ #  # ]
    1482                 :          0 :                         free_extent_buffer(old);
    1483                 :          0 :                         btrfs_warn(root->fs_info,
    1484                 :            :                                 "failed to read tree block %llu from get_old_root", logical);
    1485                 :            :                 } else {
    1486                 :          0 :                         eb = btrfs_clone_extent_buffer(old);
    1487                 :          0 :                         free_extent_buffer(old);
    1488                 :            :                 }
    1489         [ #  # ]:          0 :         } else if (old_root) {
    1490                 :          0 :                 btrfs_tree_read_unlock(eb_root);
    1491                 :          0 :                 free_extent_buffer(eb_root);
    1492                 :          0 :                 eb = alloc_dummy_extent_buffer(logical, root->nodesize);
    1493                 :            :         } else {
    1494                 :          0 :                 btrfs_set_lock_blocking_rw(eb_root, BTRFS_READ_LOCK);
    1495                 :          0 :                 eb = btrfs_clone_extent_buffer(eb_root);
    1496                 :          0 :                 btrfs_tree_read_unlock_blocking(eb_root);
    1497                 :          0 :                 free_extent_buffer(eb_root);
    1498                 :            :         }
    1499                 :            : 
    1500         [ #  # ]:          0 :         if (!eb)
    1501                 :            :                 return NULL;
    1502                 :            :         extent_buffer_get(eb);
    1503                 :          0 :         btrfs_tree_read_lock(eb);
    1504         [ #  # ]:          0 :         if (old_root) {
    1505                 :          0 :                 btrfs_set_header_bytenr(eb, eb->start);
    1506                 :            :                 btrfs_set_header_backref_rev(eb, BTRFS_MIXED_BACKREF_REV);
    1507                 :            :                 btrfs_set_header_owner(eb, btrfs_header_owner(eb_root));
    1508                 :          0 :                 btrfs_set_header_level(eb, old_root->level);
    1509                 :            :                 btrfs_set_header_generation(eb, old_generation);
    1510                 :            :         }
    1511         [ #  # ]:          0 :         if (tm)
    1512                 :          0 :                 __tree_mod_log_rewind(root->fs_info, eb, time_seq, tm);
    1513                 :            :         else
    1514         [ #  # ]:          0 :                 WARN_ON(btrfs_header_level(eb) != 0);
    1515         [ #  # ]:          0 :         WARN_ON(btrfs_header_nritems(eb) > BTRFS_NODEPTRS_PER_BLOCK(root));
    1516                 :            : 
    1517                 :            :         return eb;
    1518                 :            : }
    1519                 :            : 
    1520                 :          0 : int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq)
    1521                 :            : {
    1522                 :            :         struct tree_mod_elem *tm;
    1523                 :            :         int level;
    1524                 :          0 :         struct extent_buffer *eb_root = btrfs_root_node(root);
    1525                 :            : 
    1526                 :          0 :         tm = __tree_mod_log_oldest_root(root->fs_info, eb_root, time_seq);
    1527 [ #  # ][ #  # ]:          0 :         if (tm && tm->op == MOD_LOG_ROOT_REPLACE) {
    1528                 :          0 :                 level = tm->old_root.level;
    1529                 :            :         } else {
    1530                 :          0 :                 level = btrfs_header_level(eb_root);
    1531                 :            :         }
    1532                 :          0 :         free_extent_buffer(eb_root);
    1533                 :            : 
    1534                 :          0 :         return level;
    1535                 :            : }
    1536                 :            : 
    1537                 :            : static inline int should_cow_block(struct btrfs_trans_handle *trans,
    1538                 :            :                                    struct btrfs_root *root,
    1539                 :          0 :                                    struct extent_buffer *buf)
    1540                 :            : {
    1541                 :            :         /* ensure we can see the force_cow */
    1542                 :          0 :         smp_rmb();
    1543                 :            : 
    1544                 :            :         /*
    1545                 :            :          * We do not need to cow a block if
    1546                 :            :          * 1) this block is not created or changed in this transaction;
    1547                 :            :          * 2) this block does not belong to TREE_RELOC tree;
    1548                 :            :          * 3) the root is not forced COW.
    1549                 :            :          *
    1550                 :            :          * What is forced COW:
    1551                 :            :          *    when we create snapshot during commiting the transaction,
    1552                 :            :          *    after we've finished coping src root, we must COW the shared
    1553                 :            :          *    block to ensure the metadata consistency.
    1554                 :            :          */
    1555   [ #  #  #  #  :          0 :         if (btrfs_header_generation(buf) == trans->transid &&
             #  #  #  # ]
    1556 [ #  # ][ #  # ]:          0 :             !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) &&
    1557   [ #  #  #  # ]:          0 :             !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID &&
    1558 [ #  # ][ #  # ]:          0 :               btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)) &&
    1559                 :          0 :             !root->force_cow)
    1560                 :            :                 return 0;
    1561                 :            :         return 1;
    1562                 :            : }
    1563                 :            : 
    1564                 :            : /*
    1565                 :            :  * cows a single block, see __btrfs_cow_block for the real work.
    1566                 :            :  * This version of it has extra checks so that a block isn't cow'd more than
    1567                 :            :  * once per transaction, as long as it hasn't been written yet
    1568                 :            :  */
    1569                 :          0 : noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,
    1570                 :            :                     struct btrfs_root *root, struct extent_buffer *buf,
    1571                 :            :                     struct extent_buffer *parent, int parent_slot,
    1572                 :            :                     struct extent_buffer **cow_ret)
    1573                 :            : {
    1574                 :            :         u64 search_start;
    1575                 :            :         int ret;
    1576                 :            : 
    1577         [ #  # ]:          0 :         if (trans->transaction != root->fs_info->running_transaction)
    1578                 :          0 :                 WARN(1, KERN_CRIT "trans %llu running %llu\n",
    1579                 :            :                        trans->transid,
    1580                 :            :                        root->fs_info->running_transaction->transid);
    1581                 :            : 
    1582         [ #  # ]:          0 :         if (trans->transid != root->fs_info->generation)
    1583                 :          0 :                 WARN(1, KERN_CRIT "trans %llu running %llu\n",
    1584                 :            :                        trans->transid, root->fs_info->generation);
    1585                 :            : 
    1586         [ #  # ]:          0 :         if (!should_cow_block(trans, root, buf)) {
    1587                 :          0 :                 *cow_ret = buf;
    1588                 :          0 :                 return 0;
    1589                 :            :         }
    1590                 :            : 
    1591                 :          0 :         search_start = buf->start & ~((u64)(1024 * 1024 * 1024) - 1);
    1592                 :            : 
    1593         [ #  # ]:          0 :         if (parent)
    1594                 :            :                 btrfs_set_lock_blocking(parent);
    1595                 :            :         btrfs_set_lock_blocking(buf);
    1596                 :            : 
    1597                 :          0 :         ret = __btrfs_cow_block(trans, root, buf, parent,
    1598                 :            :                                  parent_slot, cow_ret, search_start, 0);
    1599                 :            : 
    1600                 :          0 :         trace_btrfs_cow_block(root, buf, *cow_ret);
    1601                 :            : 
    1602                 :          0 :         return ret;
    1603                 :            : }
    1604                 :            : 
    1605                 :            : /*
    1606                 :            :  * helper function for defrag to decide if two blocks pointed to by a
    1607                 :            :  * node are actually close by
    1608                 :            :  */
    1609                 :            : static int close_blocks(u64 blocknr, u64 other, u32 blocksize)
    1610                 :            : {
    1611         [ #  # ]:          0 :         if (blocknr < other && other - (blocknr + blocksize) < 32768)
           [ #  #  #  # ]
                 [ #  # ]
    1612                 :            :                 return 1;
    1613 [ #  # ][ #  # ]:          0 :         if (blocknr > other && blocknr - (other + blocksize) < 32768)
         [ #  # ][ #  # ]
    1614                 :            :                 return 1;
    1615                 :            :         return 0;
    1616                 :            : }
    1617                 :            : 
    1618                 :            : /*
    1619                 :            :  * compare two keys in a memcmp fashion
    1620                 :            :  */
    1621                 :          0 : static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
    1622                 :            : {
    1623                 :            :         struct btrfs_key k1;
    1624                 :            : 
    1625                 :            :         btrfs_disk_key_to_cpu(&k1, disk);
    1626                 :            : 
    1627                 :          0 :         return btrfs_comp_cpu_keys(&k1, k2);
    1628                 :            : }
    1629                 :            : 
    1630                 :            : /*
    1631                 :            :  * same as comp_keys only with two btrfs_key's
    1632                 :            :  */
    1633                 :          0 : int btrfs_comp_cpu_keys(struct btrfs_key *k1, struct btrfs_key *k2)
    1634                 :            : {
    1635         [ #  # ]:          0 :         if (k1->objectid > k2->objectid)
    1636                 :            :                 return 1;
    1637         [ #  # ]:          0 :         if (k1->objectid < k2->objectid)
    1638                 :            :                 return -1;
    1639         [ #  # ]:          0 :         if (k1->type > k2->type)
    1640                 :            :                 return 1;
    1641         [ #  # ]:          0 :         if (k1->type < k2->type)
    1642                 :            :                 return -1;
    1643         [ #  # ]:          0 :         if (k1->offset > k2->offset)
    1644                 :            :                 return 1;
    1645         [ #  # ]:          0 :         if (k1->offset < k2->offset)
    1646                 :            :                 return -1;
    1647                 :          0 :         return 0;
    1648                 :            : }
    1649                 :            : 
    1650                 :            : /*
    1651                 :            :  * this is used by the defrag code to go through all the
    1652                 :            :  * leaves pointed to by a node and reallocate them so that
    1653                 :            :  * disk order is close to key order
    1654                 :            :  */
    1655                 :          0 : int btrfs_realloc_node(struct btrfs_trans_handle *trans,
    1656                 :          0 :                        struct btrfs_root *root, struct extent_buffer *parent,
    1657                 :            :                        int start_slot, u64 *last_ret,
    1658                 :            :                        struct btrfs_key *progress)
    1659                 :            : {
    1660                 :            :         struct extent_buffer *cur;
    1661                 :            :         u64 blocknr;
    1662                 :            :         u64 gen;
    1663                 :          0 :         u64 search_start = *last_ret;
    1664                 :            :         u64 last_block = 0;
    1665                 :            :         u64 other;
    1666                 :            :         u32 parent_nritems;
    1667                 :            :         int end_slot;
    1668                 :            :         int i;
    1669                 :            :         int err = 0;
    1670                 :            :         int parent_level;
    1671                 :            :         int uptodate;
    1672                 :            :         u32 blocksize;
    1673                 :            :         int progress_passed = 0;
    1674                 :            :         struct btrfs_disk_key disk_key;
    1675                 :            : 
    1676                 :            :         parent_level = btrfs_header_level(parent);
    1677                 :            : 
    1678         [ #  # ]:          0 :         WARN_ON(trans->transaction != root->fs_info->running_transaction);
    1679         [ #  # ]:          0 :         WARN_ON(trans->transid != root->fs_info->generation);
    1680                 :            : 
    1681                 :            :         parent_nritems = btrfs_header_nritems(parent);
    1682                 :            :         blocksize = btrfs_level_size(root, parent_level - 1);
    1683                 :          0 :         end_slot = parent_nritems;
    1684                 :            : 
    1685         [ #  # ]:          0 :         if (parent_nritems == 1)
    1686                 :            :                 return 0;
    1687                 :            : 
    1688                 :            :         btrfs_set_lock_blocking(parent);
    1689                 :            : 
    1690         [ #  # ]:          0 :         for (i = start_slot; i < end_slot; i++) {
    1691                 :            :                 int close = 1;
    1692                 :            : 
    1693                 :          0 :                 btrfs_node_key(parent, &disk_key, i);
    1694 [ #  # ][ #  # ]:          0 :                 if (!progress_passed && comp_keys(&disk_key, progress) < 0)
    1695                 :          0 :                         continue;
    1696                 :            : 
    1697                 :            :                 progress_passed = 1;
    1698                 :            :                 blocknr = btrfs_node_blockptr(parent, i);
    1699                 :            :                 gen = btrfs_node_ptr_generation(parent, i);
    1700         [ #  # ]:          0 :                 if (last_block == 0)
    1701                 :            :                         last_block = blocknr;
    1702                 :            : 
    1703         [ #  # ]:          0 :                 if (i > 0) {
    1704                 :          0 :                         other = btrfs_node_blockptr(parent, i - 1);
    1705                 :            :                         close = close_blocks(blocknr, other, blocksize);
    1706                 :            :                 }
    1707 [ #  # ][ #  # ]:          0 :                 if (!close && i < end_slot - 2) {
    1708                 :          0 :                         other = btrfs_node_blockptr(parent, i + 1);
    1709                 :            :                         close = close_blocks(blocknr, other, blocksize);
    1710                 :            :                 }
    1711         [ #  # ]:          0 :                 if (close) {
    1712                 :            :                         last_block = blocknr;
    1713                 :          0 :                         continue;
    1714                 :            :                 }
    1715                 :            : 
    1716                 :          0 :                 cur = btrfs_find_tree_block(root, blocknr, blocksize);
    1717         [ #  # ]:          0 :                 if (cur)
    1718                 :          0 :                         uptodate = btrfs_buffer_uptodate(cur, gen, 0);
    1719                 :            :                 else
    1720                 :            :                         uptodate = 0;
    1721         [ #  # ]:          0 :                 if (!cur || !uptodate) {
    1722         [ #  # ]:          0 :                         if (!cur) {
    1723                 :          0 :                                 cur = read_tree_block(root, blocknr,
    1724                 :            :                                                          blocksize, gen);
    1725 [ #  # ][ #  # ]:          0 :                                 if (!cur || !extent_buffer_uptodate(cur)) {
    1726                 :          0 :                                         free_extent_buffer(cur);
    1727                 :          0 :                                         return -EIO;
    1728                 :            :                                 }
    1729         [ #  # ]:          0 :                         } else if (!uptodate) {
    1730                 :          0 :                                 err = btrfs_read_buffer(cur, gen);
    1731         [ #  # ]:          0 :                                 if (err) {
    1732                 :          0 :                                         free_extent_buffer(cur);
    1733                 :          0 :                                         return err;
    1734                 :            :                                 }
    1735                 :            :                         }
    1736                 :            :                 }
    1737         [ #  # ]:          0 :                 if (search_start == 0)
    1738                 :            :                         search_start = last_block;
    1739                 :            : 
    1740                 :          0 :                 btrfs_tree_lock(cur);
    1741                 :          0 :                 btrfs_set_lock_blocking(cur);
    1742                 :          0 :                 err = __btrfs_cow_block(trans, root, cur, parent, i,
    1743                 :            :                                         &cur, search_start,
    1744                 :          0 :                                         min(16 * blocksize,
    1745                 :            :                                             (end_slot - i) * blocksize));
    1746         [ #  # ]:          0 :                 if (err) {
    1747                 :          0 :                         btrfs_tree_unlock(cur);
    1748                 :          0 :                         free_extent_buffer(cur);
    1749                 :          0 :                         break;
    1750                 :            :                 }
    1751                 :          0 :                 search_start = cur->start;
    1752                 :            :                 last_block = cur->start;
    1753                 :          0 :                 *last_ret = search_start;
    1754                 :          0 :                 btrfs_tree_unlock(cur);
    1755                 :          0 :                 free_extent_buffer(cur);
    1756                 :            :         }
    1757                 :          0 :         return err;
    1758                 :            : }
    1759                 :            : 
    1760                 :            : /*
    1761                 :            :  * The leaf data grows from end-to-front in the node.
    1762                 :            :  * this returns the address of the start of the last item,
    1763                 :            :  * which is the stop of the leaf data stack
    1764                 :            :  */
    1765                 :            : static inline unsigned int leaf_data_end(struct btrfs_root *root,
    1766                 :          0 :                                          struct extent_buffer *leaf)
    1767                 :            : {
    1768                 :            :         u32 nr = btrfs_header_nritems(leaf);
    1769   [ #  #  #  #  :          0 :         if (nr == 0)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1770                 :          0 :                 return BTRFS_LEAF_DATA_SIZE(root);
    1771                 :          0 :         return btrfs_item_offset_nr(leaf, nr - 1);
    1772                 :            : }
    1773                 :            : 
    1774                 :            : 
    1775                 :            : /*
    1776                 :            :  * search for key in the extent_buffer.  The items start at offset p,
    1777                 :            :  * and they are item_size apart.  There are 'max' items in p.
    1778                 :            :  *
    1779                 :            :  * the slot in the array is returned via slot, and it points to
    1780                 :            :  * the place where you would insert key if it is not found in
    1781                 :            :  * the array.
    1782                 :            :  *
    1783                 :            :  * slot may point to max if the key is bigger than all of the keys
    1784                 :            :  */
    1785                 :          0 : static noinline int generic_bin_search(struct extent_buffer *eb,
    1786                 :            :                                        unsigned long p,
    1787                 :            :                                        int item_size, struct btrfs_key *key,
    1788                 :            :                                        int max, int *slot)
    1789                 :            : {
    1790                 :            :         int low = 0;
    1791                 :            :         int high = max;
    1792                 :            :         int mid;
    1793                 :            :         int ret;
    1794                 :            :         struct btrfs_disk_key *tmp = NULL;
    1795                 :            :         struct btrfs_disk_key unaligned;
    1796                 :            :         unsigned long offset;
    1797                 :          0 :         char *kaddr = NULL;
    1798                 :          0 :         unsigned long map_start = 0;
    1799                 :          0 :         unsigned long map_len = 0;
    1800                 :            :         int err;
    1801                 :            : 
    1802         [ #  # ]:          0 :         while (low < high) {
    1803                 :          0 :                 mid = (low + high) / 2;
    1804                 :          0 :                 offset = p + mid * item_size;
    1805                 :            : 
    1806 [ #  # ][ #  # ]:          0 :                 if (!kaddr || offset < map_start ||
    1807                 :          0 :                     (offset + sizeof(struct btrfs_disk_key)) >
    1808                 :          0 :                     map_start + map_len) {
    1809                 :            : 
    1810                 :          0 :                         err = map_private_extent_buffer(eb, offset,
    1811                 :            :                                                 sizeof(struct btrfs_disk_key),
    1812                 :            :                                                 &kaddr, &map_start, &map_len);
    1813                 :            : 
    1814         [ #  # ]:          0 :                         if (!err) {
    1815                 :          0 :                                 tmp = (struct btrfs_disk_key *)(kaddr + offset -
    1816                 :            :                                                         map_start);
    1817                 :            :                         } else {
    1818                 :          0 :                                 read_extent_buffer(eb, &unaligned,
    1819                 :            :                                                    offset, sizeof(unaligned));
    1820                 :            :                                 tmp = &unaligned;
    1821                 :            :                         }
    1822                 :            : 
    1823                 :            :                 } else {
    1824                 :          0 :                         tmp = (struct btrfs_disk_key *)(kaddr + offset -
    1825                 :            :                                                         map_start);
    1826                 :            :                 }
    1827                 :          0 :                 ret = comp_keys(tmp, key);
    1828                 :            : 
    1829         [ #  # ]:          0 :                 if (ret < 0)
    1830                 :          0 :                         low = mid + 1;
    1831         [ #  # ]:          0 :                 else if (ret > 0)
    1832                 :            :                         high = mid;
    1833                 :            :                 else {
    1834                 :          0 :                         *slot = mid;
    1835                 :          0 :                         return 0;
    1836                 :            :                 }
    1837                 :            :         }
    1838                 :          0 :         *slot = low;
    1839                 :          0 :         return 1;
    1840                 :            : }
    1841                 :            : 
    1842                 :            : /*
    1843                 :            :  * simple bin_search frontend that does the right thing for
    1844                 :            :  * leaves vs nodes
    1845                 :            :  */
    1846                 :          0 : static int bin_search(struct extent_buffer *eb, struct btrfs_key *key,
    1847                 :            :                       int level, int *slot)
    1848                 :            : {
    1849         [ #  # ]:          0 :         if (level == 0)
    1850                 :          0 :                 return generic_bin_search(eb,
    1851                 :            :                                           offsetof(struct btrfs_leaf, items),
    1852                 :            :                                           sizeof(struct btrfs_item),
    1853                 :            :                                           key, btrfs_header_nritems(eb),
    1854                 :            :                                           slot);
    1855                 :            :         else
    1856                 :          0 :                 return generic_bin_search(eb,
    1857                 :            :                                           offsetof(struct btrfs_node, ptrs),
    1858                 :            :                                           sizeof(struct btrfs_key_ptr),
    1859                 :            :                                           key, btrfs_header_nritems(eb),
    1860                 :            :                                           slot);
    1861                 :            : }
    1862                 :            : 
    1863                 :          0 : int btrfs_bin_search(struct extent_buffer *eb, struct btrfs_key *key,
    1864                 :            :                      int level, int *slot)
    1865                 :            : {
    1866                 :          0 :         return bin_search(eb, key, level, slot);
    1867                 :            : }
    1868                 :            : 
    1869                 :          0 : static void root_add_used(struct btrfs_root *root, u32 size)
    1870                 :            : {
    1871                 :            :         spin_lock(&root->accounting_lock);
    1872                 :          0 :         btrfs_set_root_used(&root->root_item,
    1873                 :            :                             btrfs_root_used(&root->root_item) + size);
    1874                 :            :         spin_unlock(&root->accounting_lock);
    1875                 :          0 : }
    1876                 :            : 
    1877                 :          0 : static void root_sub_used(struct btrfs_root *root, u32 size)
    1878                 :            : {
    1879                 :            :         spin_lock(&root->accounting_lock);
    1880                 :          0 :         btrfs_set_root_used(&root->root_item,
    1881                 :            :                             btrfs_root_used(&root->root_item) - size);
    1882                 :            :         spin_unlock(&root->accounting_lock);
    1883                 :          0 : }
    1884                 :            : 
    1885                 :            : /* given a node and slot number, this reads the blocks it points to.  The
    1886                 :            :  * extent buffer is returned with a reference taken (but unlocked).
    1887                 :            :  * NULL is returned on error.
    1888                 :            :  */
    1889                 :          0 : static noinline struct extent_buffer *read_node_slot(struct btrfs_root *root,
    1890                 :          0 :                                    struct extent_buffer *parent, int slot)
    1891                 :            : {
    1892                 :          0 :         int level = btrfs_header_level(parent);
    1893                 :            :         struct extent_buffer *eb;
    1894                 :            : 
    1895         [ #  # ]:          0 :         if (slot < 0)
    1896                 :            :                 return NULL;
    1897         [ #  # ]:          0 :         if (slot >= btrfs_header_nritems(parent))
    1898                 :            :                 return NULL;
    1899                 :            : 
    1900         [ #  # ]:          0 :         BUG_ON(level == 0);
    1901                 :            : 
    1902                 :          0 :         eb = read_tree_block(root, btrfs_node_blockptr(parent, slot),
    1903                 :            :                              btrfs_level_size(root, level - 1),
    1904                 :            :                              btrfs_node_ptr_generation(parent, slot));
    1905 [ #  # ][ #  # ]:          0 :         if (eb && !extent_buffer_uptodate(eb)) {
    1906                 :          0 :                 free_extent_buffer(eb);
    1907                 :            :                 eb = NULL;
    1908                 :            :         }
    1909                 :            : 
    1910                 :          0 :         return eb;
    1911                 :            : }
    1912                 :            : 
    1913                 :            : /*
    1914                 :            :  * node level balancing, used to make sure nodes are in proper order for
    1915                 :            :  * item deletion.  We balance from the top down, so we have to make sure
    1916                 :            :  * that a deletion won't leave an node completely empty later on.
    1917                 :            :  */
    1918                 :          0 : static noinline int balance_level(struct btrfs_trans_handle *trans,
    1919                 :          0 :                          struct btrfs_root *root,
    1920                 :            :                          struct btrfs_path *path, int level)
    1921                 :            : {
    1922                 :          0 :         struct extent_buffer *right = NULL;
    1923                 :          0 :         struct extent_buffer *mid;
    1924                 :          0 :         struct extent_buffer *left = NULL;
    1925                 :            :         struct extent_buffer *parent = NULL;
    1926                 :            :         int ret = 0;
    1927                 :            :         int wret;
    1928                 :            :         int pslot;
    1929                 :          0 :         int orig_slot = path->slots[level];
    1930                 :            :         u64 orig_ptr;
    1931                 :            : 
    1932         [ #  # ]:          0 :         if (level == 0)
    1933                 :            :                 return 0;
    1934                 :            : 
    1935                 :          0 :         mid = path->nodes[level];
    1936                 :            : 
    1937         [ #  # ]:          0 :         WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK &&
    1938                 :            :                 path->locks[level] != BTRFS_WRITE_LOCK_BLOCKING);
    1939         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(mid) != trans->transid);
    1940                 :            : 
    1941                 :            :         orig_ptr = btrfs_node_blockptr(mid, orig_slot);
    1942                 :            : 
    1943         [ #  # ]:          0 :         if (level < BTRFS_MAX_LEVEL - 1) {
    1944                 :          0 :                 parent = path->nodes[level + 1];
    1945                 :          0 :                 pslot = path->slots[level + 1];
    1946                 :            :         }
    1947                 :            : 
    1948                 :            :         /*
    1949                 :            :          * deal with the case where there is only one pointer in the root
    1950                 :            :          * by promoting the node below to a root
    1951                 :            :          */
    1952         [ #  # ]:          0 :         if (!parent) {
    1953                 :            :                 struct extent_buffer *child;
    1954                 :            : 
    1955         [ #  # ]:          0 :                 if (btrfs_header_nritems(mid) != 1)
    1956                 :          0 :                         return 0;
    1957                 :            : 
    1958                 :            :                 /* promote the child to a root */
    1959                 :          0 :                 child = read_node_slot(root, mid, 0);
    1960         [ #  # ]:          0 :                 if (!child) {
    1961                 :            :                         ret = -EROFS;
    1962                 :          0 :                         btrfs_std_error(root->fs_info, ret);
    1963                 :          0 :                         goto enospc;
    1964                 :            :                 }
    1965                 :            : 
    1966                 :          0 :                 btrfs_tree_lock(child);
    1967                 :          0 :                 btrfs_set_lock_blocking(child);
    1968                 :          0 :                 ret = btrfs_cow_block(trans, root, child, mid, 0, &child);
    1969         [ #  # ]:          0 :                 if (ret) {
    1970                 :          0 :                         btrfs_tree_unlock(child);
    1971                 :          0 :                         free_extent_buffer(child);
    1972                 :          0 :                         goto enospc;
    1973                 :            :                 }
    1974                 :            : 
    1975                 :          0 :                 tree_mod_log_set_root_pointer(root, child, 1);
    1976                 :          0 :                 rcu_assign_pointer(root->node, child);
    1977                 :            : 
    1978                 :          0 :                 add_root_to_dirty_list(root);
    1979                 :          0 :                 btrfs_tree_unlock(child);
    1980                 :            : 
    1981                 :          0 :                 path->locks[level] = 0;
    1982                 :          0 :                 path->nodes[level] = NULL;
    1983                 :          0 :                 clean_tree_block(trans, root, mid);
    1984                 :          0 :                 btrfs_tree_unlock(mid);
    1985                 :            :                 /* once for the path */
    1986                 :          0 :                 free_extent_buffer(mid);
    1987                 :            : 
    1988                 :          0 :                 root_sub_used(root, mid->len);
    1989                 :          0 :                 btrfs_free_tree_block(trans, root, mid, 0, 1);
    1990                 :            :                 /* once for the root ptr */
    1991                 :          0 :                 free_extent_buffer_stale(mid);
    1992                 :          0 :                 return 0;
    1993                 :            :         }
    1994         [ #  # ]:          0 :         if (btrfs_header_nritems(mid) >
    1995                 :          0 :             BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
    1996                 :            :                 return 0;
    1997                 :            : 
    1998                 :          0 :         left = read_node_slot(root, parent, pslot - 1);
    1999         [ #  # ]:          0 :         if (left) {
    2000                 :          0 :                 btrfs_tree_lock(left);
    2001                 :          0 :                 btrfs_set_lock_blocking(left);
    2002                 :          0 :                 wret = btrfs_cow_block(trans, root, left,
    2003                 :            :                                        parent, pslot - 1, &left);
    2004         [ #  # ]:          0 :                 if (wret) {
    2005                 :            :                         ret = wret;
    2006                 :            :                         goto enospc;
    2007                 :            :                 }
    2008                 :            :         }
    2009                 :          0 :         right = read_node_slot(root, parent, pslot + 1);
    2010         [ #  # ]:          0 :         if (right) {
    2011                 :          0 :                 btrfs_tree_lock(right);
    2012                 :          0 :                 btrfs_set_lock_blocking(right);
    2013                 :          0 :                 wret = btrfs_cow_block(trans, root, right,
    2014                 :            :                                        parent, pslot + 1, &right);
    2015         [ #  # ]:          0 :                 if (wret) {
    2016                 :            :                         ret = wret;
    2017                 :            :                         goto enospc;
    2018                 :            :                 }
    2019                 :            :         }
    2020                 :            : 
    2021                 :            :         /* first, try to make some room in the middle buffer */
    2022         [ #  # ]:          0 :         if (left) {
    2023                 :          0 :                 orig_slot += btrfs_header_nritems(left);
    2024                 :          0 :                 wret = push_node_left(trans, root, left, mid, 1);
    2025         [ #  # ]:          0 :                 if (wret < 0)
    2026                 :            :                         ret = wret;
    2027                 :            :         }
    2028                 :            : 
    2029                 :            :         /*
    2030                 :            :          * then try to empty the right most buffer into the middle
    2031                 :            :          */
    2032         [ #  # ]:          0 :         if (right) {
    2033                 :          0 :                 wret = push_node_left(trans, root, mid, right, 1);
    2034         [ #  # ]:          0 :                 if (wret < 0 && wret != -ENOSPC)
    2035                 :            :                         ret = wret;
    2036         [ #  # ]:          0 :                 if (btrfs_header_nritems(right) == 0) {
    2037                 :          0 :                         clean_tree_block(trans, root, right);
    2038                 :          0 :                         btrfs_tree_unlock(right);
    2039                 :          0 :                         del_ptr(root, path, level + 1, pslot + 1);
    2040                 :          0 :                         root_sub_used(root, right->len);
    2041                 :          0 :                         btrfs_free_tree_block(trans, root, right, 0, 1);
    2042                 :          0 :                         free_extent_buffer_stale(right);
    2043                 :          0 :                         right = NULL;
    2044                 :            :                 } else {
    2045                 :            :                         struct btrfs_disk_key right_key;
    2046                 :          0 :                         btrfs_node_key(right, &right_key, 0);
    2047                 :          0 :                         tree_mod_log_set_node_key(root->fs_info, parent,
    2048                 :            :                                                   pslot + 1, 0);
    2049                 :            :                         btrfs_set_node_key(parent, &right_key, pslot + 1);
    2050                 :          0 :                         btrfs_mark_buffer_dirty(parent);
    2051                 :            :                 }
    2052                 :            :         }
    2053         [ #  # ]:          0 :         if (btrfs_header_nritems(mid) == 1) {
    2054                 :            :                 /*
    2055                 :            :                  * we're not allowed to leave a node with one item in the
    2056                 :            :                  * tree during a delete.  A deletion from lower in the tree
    2057                 :            :                  * could try to delete the only pointer in this node.
    2058                 :            :                  * So, pull some keys from the left.
    2059                 :            :                  * There has to be a left pointer at this point because
    2060                 :            :                  * otherwise we would have pulled some pointers from the
    2061                 :            :                  * right
    2062                 :            :                  */
    2063         [ #  # ]:          0 :                 if (!left) {
    2064                 :            :                         ret = -EROFS;
    2065                 :          0 :                         btrfs_std_error(root->fs_info, ret);
    2066                 :            :                         goto enospc;
    2067                 :            :                 }
    2068                 :          0 :                 wret = balance_node_right(trans, root, mid, left);
    2069         [ #  # ]:          0 :                 if (wret < 0) {
    2070                 :            :                         ret = wret;
    2071                 :            :                         goto enospc;
    2072                 :            :                 }
    2073         [ #  # ]:          0 :                 if (wret == 1) {
    2074                 :          0 :                         wret = push_node_left(trans, root, left, mid, 1);
    2075         [ #  # ]:          0 :                         if (wret < 0)
    2076                 :            :                                 ret = wret;
    2077                 :            :                 }
    2078         [ #  # ]:          0 :                 BUG_ON(wret == 1);
    2079                 :            :         }
    2080         [ #  # ]:          0 :         if (btrfs_header_nritems(mid) == 0) {
    2081                 :          0 :                 clean_tree_block(trans, root, mid);
    2082                 :          0 :                 btrfs_tree_unlock(mid);
    2083                 :          0 :                 del_ptr(root, path, level + 1, pslot);
    2084                 :          0 :                 root_sub_used(root, mid->len);
    2085                 :          0 :                 btrfs_free_tree_block(trans, root, mid, 0, 1);
    2086                 :          0 :                 free_extent_buffer_stale(mid);
    2087                 :            :                 mid = NULL;
    2088                 :            :         } else {
    2089                 :            :                 /* update the parent key to reflect our changes */
    2090                 :            :                 struct btrfs_disk_key mid_key;
    2091                 :          0 :                 btrfs_node_key(mid, &mid_key, 0);
    2092                 :          0 :                 tree_mod_log_set_node_key(root->fs_info, parent,
    2093                 :            :                                           pslot, 0);
    2094                 :            :                 btrfs_set_node_key(parent, &mid_key, pslot);
    2095                 :          0 :                 btrfs_mark_buffer_dirty(parent);
    2096                 :            :         }
    2097                 :            : 
    2098                 :            :         /* update the path */
    2099         [ #  # ]:          0 :         if (left) {
    2100         [ #  # ]:          0 :                 if (btrfs_header_nritems(left) > orig_slot) {
    2101                 :          0 :                         extent_buffer_get(left);
    2102                 :            :                         /* left was locked after cow */
    2103                 :          0 :                         path->nodes[level] = left;
    2104                 :          0 :                         path->slots[level + 1] -= 1;
    2105                 :          0 :                         path->slots[level] = orig_slot;
    2106         [ #  # ]:          0 :                         if (mid) {
    2107                 :          0 :                                 btrfs_tree_unlock(mid);
    2108                 :          0 :                                 free_extent_buffer(mid);
    2109                 :            :                         }
    2110                 :            :                 } else {
    2111                 :          0 :                         orig_slot -= btrfs_header_nritems(left);
    2112                 :          0 :                         path->slots[level] = orig_slot;
    2113                 :            :                 }
    2114                 :            :         }
    2115                 :            :         /* double check we haven't messed things up */
    2116         [ #  # ]:          0 :         if (orig_ptr !=
    2117                 :          0 :             btrfs_node_blockptr(path->nodes[level], path->slots[level]))
    2118                 :          0 :                 BUG();
    2119                 :            : enospc:
    2120         [ #  # ]:          0 :         if (right) {
    2121                 :          0 :                 btrfs_tree_unlock(right);
    2122                 :          0 :                 free_extent_buffer(right);
    2123                 :            :         }
    2124         [ #  # ]:          0 :         if (left) {
    2125         [ #  # ]:          0 :                 if (path->nodes[level] != left)
    2126                 :          0 :                         btrfs_tree_unlock(left);
    2127                 :          0 :                 free_extent_buffer(left);
    2128                 :            :         }
    2129                 :          0 :         return ret;
    2130                 :            : }
    2131                 :            : 
    2132                 :            : /* Node balancing for insertion.  Here we only split or push nodes around
    2133                 :            :  * when they are completely full.  This is also done top down, so we
    2134                 :            :  * have to be pessimistic.
    2135                 :            :  */
    2136                 :          0 : static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
    2137                 :            :                                           struct btrfs_root *root,
    2138                 :            :                                           struct btrfs_path *path, int level)
    2139                 :            : {
    2140                 :          0 :         struct extent_buffer *right = NULL;
    2141                 :          0 :         struct extent_buffer *mid;
    2142                 :          0 :         struct extent_buffer *left = NULL;
    2143                 :            :         struct extent_buffer *parent = NULL;
    2144                 :            :         int ret = 0;
    2145                 :            :         int wret;
    2146                 :            :         int pslot;
    2147                 :          0 :         int orig_slot = path->slots[level];
    2148                 :            : 
    2149         [ #  # ]:          0 :         if (level == 0)
    2150                 :            :                 return 1;
    2151                 :            : 
    2152                 :          0 :         mid = path->nodes[level];
    2153         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(mid) != trans->transid);
    2154                 :            : 
    2155         [ #  # ]:          0 :         if (level < BTRFS_MAX_LEVEL - 1) {
    2156                 :          0 :                 parent = path->nodes[level + 1];
    2157                 :          0 :                 pslot = path->slots[level + 1];
    2158                 :            :         }
    2159                 :            : 
    2160         [ #  # ]:          0 :         if (!parent)
    2161                 :            :                 return 1;
    2162                 :            : 
    2163                 :          0 :         left = read_node_slot(root, parent, pslot - 1);
    2164                 :            : 
    2165                 :            :         /* first, try to make some room in the middle buffer */
    2166         [ #  # ]:          0 :         if (left) {
    2167                 :            :                 u32 left_nr;
    2168                 :            : 
    2169                 :          0 :                 btrfs_tree_lock(left);
    2170                 :          0 :                 btrfs_set_lock_blocking(left);
    2171                 :            : 
    2172                 :          0 :                 left_nr = btrfs_header_nritems(left);
    2173         [ #  # ]:          0 :                 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
    2174                 :            :                         wret = 1;
    2175                 :            :                 } else {
    2176                 :          0 :                         ret = btrfs_cow_block(trans, root, left, parent,
    2177                 :            :                                               pslot - 1, &left);
    2178         [ #  # ]:          0 :                         if (ret)
    2179                 :            :                                 wret = 1;
    2180                 :            :                         else {
    2181                 :          0 :                                 wret = push_node_left(trans, root,
    2182                 :            :                                                       left, mid, 0);
    2183                 :            :                         }
    2184                 :            :                 }
    2185                 :            :                 if (wret < 0)
    2186                 :            :                         ret = wret;
    2187         [ #  # ]:          0 :                 if (wret == 0) {
    2188                 :            :                         struct btrfs_disk_key disk_key;
    2189                 :          0 :                         orig_slot += left_nr;
    2190                 :          0 :                         btrfs_node_key(mid, &disk_key, 0);
    2191                 :          0 :                         tree_mod_log_set_node_key(root->fs_info, parent,
    2192                 :            :                                                   pslot, 0);
    2193                 :            :                         btrfs_set_node_key(parent, &disk_key, pslot);
    2194                 :          0 :                         btrfs_mark_buffer_dirty(parent);
    2195         [ #  # ]:          0 :                         if (btrfs_header_nritems(left) > orig_slot) {
    2196                 :          0 :                                 path->nodes[level] = left;
    2197                 :          0 :                                 path->slots[level + 1] -= 1;
    2198                 :          0 :                                 path->slots[level] = orig_slot;
    2199                 :          0 :                                 btrfs_tree_unlock(mid);
    2200                 :          0 :                                 free_extent_buffer(mid);
    2201                 :            :                         } else {
    2202                 :          0 :                                 orig_slot -=
    2203                 :          0 :                                         btrfs_header_nritems(left);
    2204                 :          0 :                                 path->slots[level] = orig_slot;
    2205                 :          0 :                                 btrfs_tree_unlock(left);
    2206                 :          0 :                                 free_extent_buffer(left);
    2207                 :            :                         }
    2208                 :            :                         return 0;
    2209                 :            :                 }
    2210                 :          0 :                 btrfs_tree_unlock(left);
    2211                 :          0 :                 free_extent_buffer(left);
    2212                 :            :         }
    2213                 :          0 :         right = read_node_slot(root, parent, pslot + 1);
    2214                 :            : 
    2215                 :            :         /*
    2216                 :            :          * then try to empty the right most buffer into the middle
    2217                 :            :          */
    2218         [ #  # ]:          0 :         if (right) {
    2219                 :            :                 u32 right_nr;
    2220                 :            : 
    2221                 :          0 :                 btrfs_tree_lock(right);
    2222                 :          0 :                 btrfs_set_lock_blocking(right);
    2223                 :            : 
    2224                 :          0 :                 right_nr = btrfs_header_nritems(right);
    2225         [ #  # ]:          0 :                 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
    2226                 :            :                         wret = 1;
    2227                 :            :                 } else {
    2228                 :          0 :                         ret = btrfs_cow_block(trans, root, right,
    2229                 :            :                                               parent, pslot + 1,
    2230                 :            :                                               &right);
    2231         [ #  # ]:          0 :                         if (ret)
    2232                 :            :                                 wret = 1;
    2233                 :            :                         else {
    2234                 :          0 :                                 wret = balance_node_right(trans, root,
    2235                 :            :                                                           right, mid);
    2236                 :            :                         }
    2237                 :            :                 }
    2238                 :            :                 if (wret < 0)
    2239                 :            :                         ret = wret;
    2240         [ #  # ]:          0 :                 if (wret == 0) {
    2241                 :            :                         struct btrfs_disk_key disk_key;
    2242                 :            : 
    2243                 :          0 :                         btrfs_node_key(right, &disk_key, 0);
    2244                 :          0 :                         tree_mod_log_set_node_key(root->fs_info, parent,
    2245                 :            :                                                   pslot + 1, 0);
    2246                 :            :                         btrfs_set_node_key(parent, &disk_key, pslot + 1);
    2247                 :          0 :                         btrfs_mark_buffer_dirty(parent);
    2248                 :            : 
    2249         [ #  # ]:          0 :                         if (btrfs_header_nritems(mid) <= orig_slot) {
    2250                 :          0 :                                 path->nodes[level] = right;
    2251                 :          0 :                                 path->slots[level + 1] += 1;
    2252                 :          0 :                                 path->slots[level] = orig_slot -
    2253                 :            :                                         btrfs_header_nritems(mid);
    2254                 :          0 :                                 btrfs_tree_unlock(mid);
    2255                 :          0 :                                 free_extent_buffer(mid);
    2256                 :            :                         } else {
    2257                 :          0 :                                 btrfs_tree_unlock(right);
    2258                 :          0 :                                 free_extent_buffer(right);
    2259                 :            :                         }
    2260                 :            :                         return 0;
    2261                 :            :                 }
    2262                 :          0 :                 btrfs_tree_unlock(right);
    2263                 :          0 :                 free_extent_buffer(right);
    2264                 :            :         }
    2265                 :            :         return 1;
    2266                 :            : }
    2267                 :            : 
    2268                 :            : /*
    2269                 :            :  * readahead one full node of leaves, finding things that are close
    2270                 :            :  * to the block in 'slot', and triggering ra on them.
    2271                 :            :  */
    2272                 :          0 : static void reada_for_search(struct btrfs_root *root,
    2273                 :            :                              struct btrfs_path *path,
    2274                 :            :                              int level, int slot, u64 objectid)
    2275                 :            : {
    2276                 :          0 :         struct extent_buffer *node;
    2277                 :            :         struct btrfs_disk_key disk_key;
    2278                 :            :         u32 nritems;
    2279                 :            :         u64 search;
    2280                 :            :         u64 target;
    2281                 :            :         u64 nread = 0;
    2282                 :            :         u64 gen;
    2283                 :          0 :         int direction = path->reada;
    2284                 :            :         struct extent_buffer *eb;
    2285                 :            :         u32 nr;
    2286                 :            :         u32 blocksize;
    2287                 :            :         u32 nscan = 0;
    2288                 :            : 
    2289         [ #  # ]:          0 :         if (level != 1)
    2290                 :          0 :                 return;
    2291                 :            : 
    2292         [ #  # ]:          0 :         if (!path->nodes[level])
    2293                 :            :                 return;
    2294                 :            : 
    2295                 :            :         node = path->nodes[level];
    2296                 :            : 
    2297                 :            :         search = btrfs_node_blockptr(node, slot);
    2298                 :            :         blocksize = btrfs_level_size(root, level - 1);
    2299                 :          0 :         eb = btrfs_find_tree_block(root, search, blocksize);
    2300         [ #  # ]:          0 :         if (eb) {
    2301                 :          0 :                 free_extent_buffer(eb);
    2302                 :          0 :                 return;
    2303                 :            :         }
    2304                 :            : 
    2305                 :            :         target = search;
    2306                 :            : 
    2307                 :            :         nritems = btrfs_header_nritems(node);
    2308                 :            :         nr = slot;
    2309                 :            : 
    2310                 :            :         while (1) {
    2311         [ #  # ]:          0 :                 if (direction < 0) {
    2312         [ #  # ]:          0 :                         if (nr == 0)
    2313                 :            :                                 break;
    2314                 :          0 :                         nr--;
    2315         [ #  # ]:          0 :                 } else if (direction > 0) {
    2316                 :          0 :                         nr++;
    2317         [ #  # ]:          0 :                         if (nr >= nritems)
    2318                 :            :                                 break;
    2319                 :            :                 }
    2320 [ #  # ][ #  # ]:          0 :                 if (path->reada < 0 && objectid) {
    2321                 :          0 :                         btrfs_node_key(node, &disk_key, nr);
    2322         [ #  # ]:          0 :                         if (btrfs_disk_key_objectid(&disk_key) != objectid)
    2323                 :            :                                 break;
    2324                 :            :                 }
    2325                 :            :                 search = btrfs_node_blockptr(node, nr);
    2326 [ #  # ][ #  # ]:          0 :                 if ((search <= target && target - search <= 65536) ||
                 [ #  # ]
    2327         [ #  # ]:          0 :                     (search > target && search - target <= 65536)) {
    2328                 :            :                         gen = btrfs_node_ptr_generation(node, nr);
    2329                 :          0 :                         readahead_tree_block(root, search, blocksize, gen);
    2330                 :          0 :                         nread += blocksize;
    2331                 :            :                 }
    2332                 :          0 :                 nscan++;
    2333         [ #  # ]:          0 :                 if ((nread > 65536 || nscan > 32))
    2334                 :            :                         break;
    2335                 :            :         }
    2336                 :            : }
    2337                 :            : 
    2338                 :          0 : static noinline void reada_for_balance(struct btrfs_root *root,
    2339                 :            :                                        struct btrfs_path *path, int level)
    2340                 :            : {
    2341                 :            :         int slot;
    2342                 :            :         int nritems;
    2343                 :          0 :         struct extent_buffer *parent;
    2344                 :            :         struct extent_buffer *eb;
    2345                 :            :         u64 gen;
    2346                 :            :         u64 block1 = 0;
    2347                 :            :         u64 block2 = 0;
    2348                 :            :         int blocksize;
    2349                 :            : 
    2350                 :          0 :         parent = path->nodes[level + 1];
    2351         [ #  # ]:          0 :         if (!parent)
    2352                 :          0 :                 return;
    2353                 :            : 
    2354                 :          0 :         nritems = btrfs_header_nritems(parent);
    2355                 :          0 :         slot = path->slots[level + 1];
    2356                 :            :         blocksize = btrfs_level_size(root, level);
    2357                 :            : 
    2358         [ #  # ]:          0 :         if (slot > 0) {
    2359                 :          0 :                 block1 = btrfs_node_blockptr(parent, slot - 1);
    2360                 :            :                 gen = btrfs_node_ptr_generation(parent, slot - 1);
    2361                 :          0 :                 eb = btrfs_find_tree_block(root, block1, blocksize);
    2362                 :            :                 /*
    2363                 :            :                  * if we get -eagain from btrfs_buffer_uptodate, we
    2364                 :            :                  * don't want to return eagain here.  That will loop
    2365                 :            :                  * forever
    2366                 :            :                  */
    2367 [ #  # ][ #  # ]:          0 :                 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)
    2368                 :            :                         block1 = 0;
    2369                 :          0 :                 free_extent_buffer(eb);
    2370                 :            :         }
    2371         [ #  # ]:          0 :         if (slot + 1 < nritems) {
    2372                 :            :                 block2 = btrfs_node_blockptr(parent, slot + 1);
    2373                 :            :                 gen = btrfs_node_ptr_generation(parent, slot + 1);
    2374                 :          0 :                 eb = btrfs_find_tree_block(root, block2, blocksize);
    2375 [ #  # ][ #  # ]:          0 :                 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)
    2376                 :            :                         block2 = 0;
    2377                 :          0 :                 free_extent_buffer(eb);
    2378                 :            :         }
    2379                 :            : 
    2380         [ #  # ]:          0 :         if (block1)
    2381                 :          0 :                 readahead_tree_block(root, block1, blocksize, 0);
    2382         [ #  # ]:          0 :         if (block2)
    2383                 :          0 :                 readahead_tree_block(root, block2, blocksize, 0);
    2384                 :            : }
    2385                 :            : 
    2386                 :            : 
    2387                 :            : /*
    2388                 :            :  * when we walk down the tree, it is usually safe to unlock the higher layers
    2389                 :            :  * in the tree.  The exceptions are when our path goes through slot 0, because
    2390                 :            :  * operations on the tree might require changing key pointers higher up in the
    2391                 :            :  * tree.
    2392                 :            :  *
    2393                 :            :  * callers might also have set path->keep_locks, which tells this code to keep
    2394                 :            :  * the lock if the path points to the last slot in the block.  This is part of
    2395                 :            :  * walking through the tree, and selecting the next slot in the higher block.
    2396                 :            :  *
    2397                 :            :  * lowest_unlock sets the lowest level in the tree we're allowed to unlock.  so
    2398                 :            :  * if lowest_unlock is 1, level 0 won't be unlocked
    2399                 :            :  */
    2400                 :          0 : static noinline void unlock_up(struct btrfs_path *path, int level,
    2401                 :            :                                int lowest_unlock, int min_write_lock_level,
    2402                 :            :                                int *write_lock_level)
    2403                 :            : {
    2404                 :            :         int i;
    2405                 :            :         int skip_level = level;
    2406                 :            :         int no_skips = 0;
    2407                 :          0 :         struct extent_buffer *t;
    2408                 :            : 
    2409         [ #  # ]:          0 :         for (i = level; i < BTRFS_MAX_LEVEL; i++) {
    2410         [ #  # ]:          0 :                 if (!path->nodes[i])
    2411                 :            :                         break;
    2412         [ #  # ]:          0 :                 if (!path->locks[i])
    2413                 :            :                         break;
    2414 [ #  # ][ #  # ]:          0 :                 if (!no_skips && path->slots[i] == 0) {
    2415                 :          0 :                         skip_level = i + 1;
    2416                 :          0 :                         continue;
    2417                 :            :                 }
    2418 [ #  # ][ #  # ]:          0 :                 if (!no_skips && path->keep_locks) {
    2419                 :            :                         u32 nritems;
    2420                 :            :                         t = path->nodes[i];
    2421                 :            :                         nritems = btrfs_header_nritems(t);
    2422 [ #  # ][ #  # ]:          0 :                         if (nritems < 1 || path->slots[i] >= nritems - 1) {
    2423                 :          0 :                                 skip_level = i + 1;
    2424                 :          0 :                                 continue;
    2425                 :            :                         }
    2426                 :            :                 }
    2427         [ #  # ]:          0 :                 if (skip_level < i && i >= lowest_unlock)
    2428                 :            :                         no_skips = 1;
    2429                 :            : 
    2430                 :          0 :                 t = path->nodes[i];
    2431 [ #  # ][ #  # ]:          0 :                 if (i >= lowest_unlock && i > skip_level && path->locks[i]) {
    2432                 :            :                         btrfs_tree_unlock_rw(t, path->locks[i]);
    2433                 :          0 :                         path->locks[i] = 0;
    2434         [ #  # ]:          0 :                         if (write_lock_level &&
    2435         [ #  # ]:          0 :                             i > min_write_lock_level &&
    2436                 :          0 :                             i <= *write_lock_level) {
    2437                 :          0 :                                 *write_lock_level = i - 1;
    2438                 :            :                         }
    2439                 :            :                 }
    2440                 :            :         }
    2441                 :          0 : }
    2442                 :            : 
    2443                 :            : /*
    2444                 :            :  * This releases any locks held in the path starting at level and
    2445                 :            :  * going all the way up to the root.
    2446                 :            :  *
    2447                 :            :  * btrfs_search_slot will keep the lock held on higher nodes in a few
    2448                 :            :  * corner cases, such as COW of the block at slot zero in the node.  This
    2449                 :            :  * ignores those rules, and it should only be called when there are no
    2450                 :            :  * more updates to be done higher up in the tree.
    2451                 :            :  */
    2452                 :          0 : noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level)
    2453                 :            : {
    2454                 :            :         int i;
    2455                 :            : 
    2456         [ #  # ]:          0 :         if (path->keep_locks)
    2457                 :          0 :                 return;
    2458                 :            : 
    2459         [ #  # ]:          0 :         for (i = level; i < BTRFS_MAX_LEVEL; i++) {
    2460         [ #  # ]:          0 :                 if (!path->nodes[i])
    2461                 :          0 :                         continue;
    2462         [ #  # ]:          0 :                 if (!path->locks[i])
    2463                 :          0 :                         continue;
    2464                 :            :                 btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]);
    2465                 :          0 :                 path->locks[i] = 0;
    2466                 :            :         }
    2467                 :            : }
    2468                 :            : 
    2469                 :            : /*
    2470                 :            :  * helper function for btrfs_search_slot.  The goal is to find a block
    2471                 :            :  * in cache without setting the path to blocking.  If we find the block
    2472                 :            :  * we return zero and the path is unchanged.
    2473                 :            :  *
    2474                 :            :  * If we can't find the block, we set the path blocking and do some
    2475                 :            :  * reada.  -EAGAIN is returned and the search must be repeated.
    2476                 :            :  */
    2477                 :            : static int
    2478                 :          0 : read_block_for_search(struct btrfs_trans_handle *trans,
    2479                 :          0 :                        struct btrfs_root *root, struct btrfs_path *p,
    2480                 :            :                        struct extent_buffer **eb_ret, int level, int slot,
    2481                 :            :                        struct btrfs_key *key, u64 time_seq)
    2482                 :            : {
    2483                 :            :         u64 blocknr;
    2484                 :            :         u64 gen;
    2485                 :            :         u32 blocksize;
    2486                 :          0 :         struct extent_buffer *b = *eb_ret;
    2487                 :            :         struct extent_buffer *tmp;
    2488                 :            :         int ret;
    2489                 :            : 
    2490                 :            :         blocknr = btrfs_node_blockptr(b, slot);
    2491                 :            :         gen = btrfs_node_ptr_generation(b, slot);
    2492                 :            :         blocksize = btrfs_level_size(root, level - 1);
    2493                 :            : 
    2494                 :          0 :         tmp = btrfs_find_tree_block(root, blocknr, blocksize);
    2495         [ #  # ]:          0 :         if (tmp) {
    2496                 :            :                 /* first we do an atomic uptodate check */
    2497         [ #  # ]:          0 :                 if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
    2498                 :          0 :                         *eb_ret = tmp;
    2499                 :            :                         return 0;
    2500                 :            :                 }
    2501                 :            : 
    2502                 :            :                 /* the pages were up to date, but we failed
    2503                 :            :                  * the generation number check.  Do a full
    2504                 :            :                  * read for the generation number that is correct.
    2505                 :            :                  * We must do this without dropping locks so
    2506                 :            :                  * we can trust our generation number
    2507                 :            :                  */
    2508                 :          0 :                 btrfs_set_path_blocking(p);
    2509                 :            : 
    2510                 :            :                 /* now we're allowed to do a blocking uptodate check */
    2511                 :          0 :                 ret = btrfs_read_buffer(tmp, gen);
    2512         [ #  # ]:          0 :                 if (!ret) {
    2513                 :          0 :                         *eb_ret = tmp;
    2514                 :            :                         return 0;
    2515                 :            :                 }
    2516                 :          0 :                 free_extent_buffer(tmp);
    2517                 :          0 :                 btrfs_release_path(p);
    2518                 :            :                 return -EIO;
    2519                 :            :         }
    2520                 :            : 
    2521                 :            :         /*
    2522                 :            :          * reduce lock contention at high levels
    2523                 :            :          * of the btree by dropping locks before
    2524                 :            :          * we read.  Don't release the lock on the current
    2525                 :            :          * level because we need to walk this node to figure
    2526                 :            :          * out which blocks to read.
    2527                 :            :          */
    2528                 :          0 :         btrfs_unlock_up_safe(p, level + 1);
    2529                 :          0 :         btrfs_set_path_blocking(p);
    2530                 :            : 
    2531                 :          0 :         free_extent_buffer(tmp);
    2532         [ #  # ]:          0 :         if (p->reada)
    2533                 :          0 :                 reada_for_search(root, p, level, slot, key->objectid);
    2534                 :            : 
    2535                 :          0 :         btrfs_release_path(p);
    2536                 :            : 
    2537                 :            :         ret = -EAGAIN;
    2538                 :          0 :         tmp = read_tree_block(root, blocknr, blocksize, 0);
    2539         [ #  # ]:          0 :         if (tmp) {
    2540                 :            :                 /*
    2541                 :            :                  * If the read above didn't mark this buffer up to date,
    2542                 :            :                  * it will never end up being up to date.  Set ret to EIO now
    2543                 :            :                  * and give up so that our caller doesn't loop forever
    2544                 :            :                  * on our EAGAINs.
    2545                 :            :                  */
    2546         [ #  # ]:          0 :                 if (!btrfs_buffer_uptodate(tmp, 0, 0))
    2547                 :            :                         ret = -EIO;
    2548                 :          0 :                 free_extent_buffer(tmp);
    2549                 :            :         }
    2550                 :            :         return ret;
    2551                 :            : }
    2552                 :            : 
    2553                 :            : /*
    2554                 :            :  * helper function for btrfs_search_slot.  This does all of the checks
    2555                 :            :  * for node-level blocks and does any balancing required based on
    2556                 :            :  * the ins_len.
    2557                 :            :  *
    2558                 :            :  * If no extra work was required, zero is returned.  If we had to
    2559                 :            :  * drop the path, -EAGAIN is returned and btrfs_search_slot must
    2560                 :            :  * start over
    2561                 :            :  */
    2562                 :            : static int
    2563                 :          0 : setup_nodes_for_search(struct btrfs_trans_handle *trans,
    2564                 :            :                        struct btrfs_root *root, struct btrfs_path *p,
    2565                 :          0 :                        struct extent_buffer *b, int level, int ins_len,
    2566                 :            :                        int *write_lock_level)
    2567                 :            : {
    2568                 :            :         int ret;
    2569         [ #  # ]:          0 :         if ((p->search_for_split || ins_len > 0) && btrfs_header_nritems(b) >=
           [ #  #  #  # ]
    2570                 :          0 :             BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
    2571                 :            :                 int sret;
    2572                 :            : 
    2573         [ #  # ]:          0 :                 if (*write_lock_level < level + 1) {
    2574                 :          0 :                         *write_lock_level = level + 1;
    2575                 :          0 :                         btrfs_release_path(p);
    2576                 :          0 :                         goto again;
    2577                 :            :                 }
    2578                 :            : 
    2579                 :          0 :                 btrfs_set_path_blocking(p);
    2580                 :          0 :                 reada_for_balance(root, p, level);
    2581                 :          0 :                 sret = split_node(trans, root, p, level);
    2582                 :          0 :                 btrfs_clear_path_blocking(p, NULL, 0);
    2583                 :            : 
    2584         [ #  # ]:          0 :                 BUG_ON(sret > 0);
    2585         [ #  # ]:          0 :                 if (sret) {
    2586                 :            :                         ret = sret;
    2587                 :            :                         goto done;
    2588                 :            :                 }
    2589                 :            :                 b = p->nodes[level];
    2590   [ #  #  #  # ]:          0 :         } else if (ins_len < 0 && btrfs_header_nritems(b) <
    2591                 :          0 :                    BTRFS_NODEPTRS_PER_BLOCK(root) / 2) {
    2592                 :            :                 int sret;
    2593                 :            : 
    2594         [ #  # ]:          0 :                 if (*write_lock_level < level + 1) {
    2595                 :          0 :                         *write_lock_level = level + 1;
    2596                 :          0 :                         btrfs_release_path(p);
    2597                 :          0 :                         goto again;
    2598                 :            :                 }
    2599                 :            : 
    2600                 :          0 :                 btrfs_set_path_blocking(p);
    2601                 :          0 :                 reada_for_balance(root, p, level);
    2602                 :          0 :                 sret = balance_level(trans, root, p, level);
    2603                 :          0 :                 btrfs_clear_path_blocking(p, NULL, 0);
    2604                 :            : 
    2605         [ #  # ]:          0 :                 if (sret) {
    2606                 :            :                         ret = sret;
    2607                 :            :                         goto done;
    2608                 :            :                 }
    2609                 :          0 :                 b = p->nodes[level];
    2610         [ #  # ]:          0 :                 if (!b) {
    2611                 :          0 :                         btrfs_release_path(p);
    2612                 :          0 :                         goto again;
    2613                 :            :                 }
    2614         [ #  # ]:          0 :                 BUG_ON(btrfs_header_nritems(b) == 1);
    2615                 :            :         }
    2616                 :            :         return 0;
    2617                 :            : 
    2618                 :            : again:
    2619                 :            :         ret = -EAGAIN;
    2620                 :            : done:
    2621                 :          0 :         return ret;
    2622                 :            : }
    2623                 :            : 
    2624                 :            : static void key_search_validate(struct extent_buffer *b,
    2625                 :            :                                 struct btrfs_key *key,
    2626                 :            :                                 int level)
    2627                 :            : {
    2628                 :            : #ifdef CONFIG_BTRFS_ASSERT
    2629                 :            :         struct btrfs_disk_key disk_key;
    2630                 :            : 
    2631                 :            :         btrfs_cpu_key_to_disk(&disk_key, key);
    2632                 :            : 
    2633                 :            :         if (level == 0)
    2634                 :            :                 ASSERT(!memcmp_extent_buffer(b, &disk_key,
    2635                 :            :                     offsetof(struct btrfs_leaf, items[0].key),
    2636                 :            :                     sizeof(disk_key)));
    2637                 :            :         else
    2638                 :            :                 ASSERT(!memcmp_extent_buffer(b, &disk_key,
    2639                 :            :                     offsetof(struct btrfs_node, ptrs[0].key),
    2640                 :            :                     sizeof(disk_key)));
    2641                 :            : #endif
    2642                 :            : }
    2643                 :            : 
    2644                 :            : static int key_search(struct extent_buffer *b, struct btrfs_key *key,
    2645                 :            :                       int level, int *prev_cmp, int *slot)
    2646                 :            : {
    2647         [ #  # ]:          0 :         if (*prev_cmp != 0) {
    2648                 :          0 :                 *prev_cmp = bin_search(b, key, level, slot);
    2649                 :            :                 return *prev_cmp;
    2650                 :            :         }
    2651                 :            : 
    2652                 :            :         key_search_validate(b, key, level);
    2653                 :          0 :         *slot = 0;
    2654                 :            : 
    2655                 :            :         return 0;
    2656                 :            : }
    2657                 :            : 
    2658                 :          0 : int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *found_path,
    2659                 :            :                 u64 iobjectid, u64 ioff, u8 key_type,
    2660                 :            :                 struct btrfs_key *found_key)
    2661                 :            : {
    2662                 :            :         int ret;
    2663                 :            :         struct btrfs_key key;
    2664                 :          0 :         struct extent_buffer *eb;
    2665                 :            :         struct btrfs_path *path;
    2666                 :            : 
    2667                 :          0 :         key.type = key_type;
    2668                 :          0 :         key.objectid = iobjectid;
    2669                 :          0 :         key.offset = ioff;
    2670                 :            : 
    2671         [ #  # ]:          0 :         if (found_path == NULL) {
    2672                 :            :                 path = btrfs_alloc_path();
    2673         [ #  # ]:          0 :                 if (!path)
    2674                 :            :                         return -ENOMEM;
    2675                 :            :         } else
    2676                 :            :                 path = found_path;
    2677                 :            : 
    2678                 :          0 :         ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
    2679         [ #  # ]:          0 :         if ((ret < 0) || (found_key == NULL)) {
    2680         [ #  # ]:          0 :                 if (path != found_path)
    2681                 :          0 :                         btrfs_free_path(path);
    2682                 :          0 :                 return ret;
    2683                 :            :         }
    2684                 :            : 
    2685                 :          0 :         eb = path->nodes[0];
    2686   [ #  #  #  # ]:          0 :         if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
    2687                 :            :                 ret = btrfs_next_leaf(fs_root, path);
    2688         [ #  # ]:          0 :                 if (ret)
    2689                 :            :                         return ret;
    2690                 :          0 :                 eb = path->nodes[0];
    2691                 :            :         }
    2692                 :            : 
    2693                 :          0 :         btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
    2694 [ #  # ][ #  # ]:          0 :         if (found_key->type != key.type ||
    2695                 :          0 :                         found_key->objectid != key.objectid)
    2696                 :            :                 return 1;
    2697                 :            : 
    2698                 :          0 :         return 0;
    2699                 :            : }
    2700                 :            : 
    2701                 :            : /*
    2702                 :            :  * look for key in the tree.  path is filled in with nodes along the way
    2703                 :            :  * if key is found, we return zero and you can find the item in the leaf
    2704                 :            :  * level of the path (level 0)
    2705                 :            :  *
    2706                 :            :  * If the key isn't found, the path points to the slot where it should
    2707                 :            :  * be inserted, and 1 is returned.  If there are other errors during the
    2708                 :            :  * search a negative error number is returned.
    2709                 :            :  *
    2710                 :            :  * if ins_len > 0, nodes and leaves will be split as we walk down the
    2711                 :            :  * tree.  if ins_len < 0, nodes will be merged as we walk down the tree (if
    2712                 :            :  * possible)
    2713                 :            :  */
    2714                 :          0 : int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
    2715                 :            :                       *root, struct btrfs_key *key, struct btrfs_path *p, int
    2716                 :            :                       ins_len, int cow)
    2717                 :            : {
    2718                 :            :         struct extent_buffer *b;
    2719                 :            :         int slot;
    2720                 :            :         int ret;
    2721                 :            :         int err;
    2722                 :            :         int level;
    2723                 :            :         int lowest_unlock = 1;
    2724                 :            :         int root_lock;
    2725                 :            :         /* everything at write_lock_level or lower must be write locked */
    2726                 :          0 :         int write_lock_level = 0;
    2727                 :            :         u8 lowest_level = 0;
    2728                 :            :         int min_write_lock_level;
    2729                 :            :         int prev_cmp;
    2730                 :            : 
    2731                 :          0 :         lowest_level = p->lowest_level;
    2732         [ #  # ]:          0 :         WARN_ON(lowest_level && ins_len > 0);
    2733         [ #  # ]:          0 :         WARN_ON(p->nodes[0] != NULL);
    2734         [ #  # ]:          0 :         BUG_ON(!cow && ins_len);
    2735                 :            : 
    2736         [ #  # ]:          0 :         if (ins_len < 0) {
    2737                 :            :                 lowest_unlock = 2;
    2738                 :            : 
    2739                 :            :                 /* when we are removing items, we might have to go up to level
    2740                 :            :                  * two as we update tree pointers  Make sure we keep write
    2741                 :            :                  * for those levels as well
    2742                 :            :                  */
    2743                 :          0 :                 write_lock_level = 2;
    2744         [ #  # ]:          0 :         } else if (ins_len > 0) {
    2745                 :            :                 /*
    2746                 :            :                  * for inserting items, make sure we have a write lock on
    2747                 :            :                  * level 1 so we can update keys
    2748                 :            :                  */
    2749                 :          0 :                 write_lock_level = 1;
    2750                 :            :         }
    2751                 :            : 
    2752         [ #  # ]:          0 :         if (!cow)
    2753                 :          0 :                 write_lock_level = -1;
    2754                 :            : 
    2755 [ #  # ][ #  # ]:          0 :         if (cow && (p->keep_locks || p->lowest_level))
                 [ #  # ]
    2756                 :          0 :                 write_lock_level = BTRFS_MAX_LEVEL;
    2757                 :            : 
    2758                 :          0 :         min_write_lock_level = write_lock_level;
    2759                 :            : 
    2760                 :            : again:
    2761                 :            :         prev_cmp = -1;
    2762                 :            :         /*
    2763                 :            :          * we try very hard to do read locks on the root
    2764                 :            :          */
    2765                 :            :         root_lock = BTRFS_READ_LOCK;
    2766                 :            :         level = 0;
    2767         [ #  # ]:          0 :         if (p->search_commit_root) {
    2768                 :            :                 /*
    2769                 :            :                  * the commit roots are read only
    2770                 :            :                  * so we always do read locks
    2771                 :            :                  */
    2772                 :          0 :                 b = root->commit_root;
    2773                 :          0 :                 extent_buffer_get(b);
    2774                 :          0 :                 level = btrfs_header_level(b);
    2775         [ #  # ]:          0 :                 if (!p->skip_locking)
    2776                 :          0 :                         btrfs_tree_read_lock(b);
    2777                 :            :         } else {
    2778         [ #  # ]:          0 :                 if (p->skip_locking) {
    2779                 :          0 :                         b = btrfs_root_node(root);
    2780                 :          0 :                         level = btrfs_header_level(b);
    2781                 :            :                 } else {
    2782                 :            :                         /* we don't know the level of the root node
    2783                 :            :                          * until we actually have it read locked
    2784                 :            :                          */
    2785                 :          0 :                         b = btrfs_read_lock_root_node(root);
    2786                 :          0 :                         level = btrfs_header_level(b);
    2787         [ #  # ]:          0 :                         if (level <= write_lock_level) {
    2788                 :            :                                 /* whoops, must trade for write lock */
    2789                 :          0 :                                 btrfs_tree_read_unlock(b);
    2790                 :          0 :                                 free_extent_buffer(b);
    2791                 :          0 :                                 b = btrfs_lock_root_node(root);
    2792                 :            :                                 root_lock = BTRFS_WRITE_LOCK;
    2793                 :            : 
    2794                 :            :                                 /* the level might have changed, check again */
    2795                 :          0 :                                 level = btrfs_header_level(b);
    2796                 :            :                         }
    2797                 :            :                 }
    2798                 :            :         }
    2799                 :          0 :         p->nodes[level] = b;
    2800         [ #  # ]:          0 :         if (!p->skip_locking)
    2801                 :          0 :                 p->locks[level] = root_lock;
    2802                 :            : 
    2803         [ #  # ]:          0 :         while (b) {
    2804                 :          0 :                 level = btrfs_header_level(b);
    2805                 :            : 
    2806                 :            :                 /*
    2807                 :            :                  * setup the path here so we can release it under lock
    2808                 :            :                  * contention with the cow code
    2809                 :            :                  */
    2810         [ #  # ]:          0 :                 if (cow) {
    2811                 :            :                         /*
    2812                 :            :                          * if we don't really need to cow this block
    2813                 :            :                          * then we don't want to set the path blocking,
    2814                 :            :                          * so we test it here
    2815                 :            :                          */
    2816         [ #  # ]:          0 :                         if (!should_cow_block(trans, root, b))
    2817                 :            :                                 goto cow_done;
    2818                 :            : 
    2819                 :          0 :                         btrfs_set_path_blocking(p);
    2820                 :            : 
    2821                 :            :                         /*
    2822                 :            :                          * must have write locks on this node and the
    2823                 :            :                          * parent
    2824                 :            :                          */
    2825 [ #  # ][ #  # ]:          0 :                         if (level > write_lock_level ||
    2826         [ #  # ]:          0 :                             (level + 1 > write_lock_level &&
    2827         [ #  # ]:          0 :                             level + 1 < BTRFS_MAX_LEVEL &&
    2828                 :          0 :                             p->nodes[level + 1])) {
    2829                 :          0 :                                 write_lock_level = level + 1;
    2830                 :          0 :                                 btrfs_release_path(p);
    2831                 :          0 :                                 goto again;
    2832                 :            :                         }
    2833                 :            : 
    2834                 :          0 :                         err = btrfs_cow_block(trans, root, b,
    2835                 :            :                                               p->nodes[level + 1],
    2836                 :            :                                               p->slots[level + 1], &b);
    2837         [ #  # ]:          0 :                         if (err) {
    2838                 :            :                                 ret = err;
    2839                 :            :                                 goto done;
    2840                 :            :                         }
    2841                 :            :                 }
    2842                 :            : cow_done:
    2843                 :          0 :                 p->nodes[level] = b;
    2844                 :          0 :                 btrfs_clear_path_blocking(p, NULL, 0);
    2845                 :            : 
    2846                 :            :                 /*
    2847                 :            :                  * we have a lock on b and as long as we aren't changing
    2848                 :            :                  * the tree, there is no way to for the items in b to change.
    2849                 :            :                  * It is safe to drop the lock on our parent before we
    2850                 :            :                  * go through the expensive btree search on b.
    2851                 :            :                  *
    2852                 :            :                  * If we're inserting or deleting (ins_len != 0), then we might
    2853                 :            :                  * be changing slot zero, which may require changing the parent.
    2854                 :            :                  * So, we can't drop the lock until after we know which slot
    2855                 :            :                  * we're operating on.
    2856                 :            :                  */
    2857 [ #  # ][ #  # ]:          0 :                 if (!ins_len && !p->keep_locks) {
    2858                 :          0 :                         int u = level + 1;
    2859                 :            : 
    2860 [ #  # ][ #  # ]:          0 :                         if (u < BTRFS_MAX_LEVEL && p->locks[u]) {
    2861                 :          0 :                                 btrfs_tree_unlock_rw(p->nodes[u], p->locks[u]);
    2862                 :          0 :                                 p->locks[u] = 0;
    2863                 :            :                         }
    2864                 :            :                 }
    2865                 :            : 
    2866                 :          0 :                 ret = key_search(b, key, level, &prev_cmp, &slot);
    2867                 :            : 
    2868         [ #  # ]:          0 :                 if (level != 0) {
    2869                 :            :                         int dec = 0;
    2870 [ #  # ][ #  # ]:          0 :                         if (ret && slot > 0) {
    2871                 :            :                                 dec = 1;
    2872                 :          0 :                                 slot -= 1;
    2873                 :            :                         }
    2874                 :          0 :                         p->slots[level] = slot;
    2875                 :          0 :                         err = setup_nodes_for_search(trans, root, p, b, level,
    2876                 :            :                                              ins_len, &write_lock_level);
    2877         [ #  # ]:          0 :                         if (err == -EAGAIN)
    2878                 :            :                                 goto again;
    2879         [ #  # ]:          0 :                         if (err) {
    2880                 :            :                                 ret = err;
    2881                 :            :                                 goto done;
    2882                 :            :                         }
    2883                 :          0 :                         b = p->nodes[level];
    2884                 :          0 :                         slot = p->slots[level];
    2885                 :            : 
    2886                 :            :                         /*
    2887                 :            :                          * slot 0 is special, if we change the key
    2888                 :            :                          * we have to update the parent pointer
    2889                 :            :                          * which means we must have a write lock
    2890                 :            :                          * on the parent
    2891                 :            :                          */
    2892 [ #  # ][ #  # ]:          0 :                         if (slot == 0 && ins_len &&
                 [ #  # ]
    2893                 :          0 :                             write_lock_level < level + 1) {
    2894                 :          0 :                                 write_lock_level = level + 1;
    2895                 :          0 :                                 btrfs_release_path(p);
    2896                 :          0 :                                 goto again;
    2897                 :            :                         }
    2898                 :            : 
    2899                 :          0 :                         unlock_up(p, level, lowest_unlock,
    2900                 :            :                                   min_write_lock_level, &write_lock_level);
    2901                 :            : 
    2902         [ #  # ]:          0 :                         if (level == lowest_level) {
    2903         [ #  # ]:          0 :                                 if (dec)
    2904                 :          0 :                                         p->slots[level]++;
    2905                 :            :                                 goto done;
    2906                 :            :                         }
    2907                 :            : 
    2908                 :          0 :                         err = read_block_for_search(trans, root, p,
    2909                 :            :                                                     &b, level, slot, key, 0);
    2910         [ #  # ]:          0 :                         if (err == -EAGAIN)
    2911                 :            :                                 goto again;
    2912         [ #  # ]:          0 :                         if (err) {
    2913                 :            :                                 ret = err;
    2914                 :            :                                 goto done;
    2915                 :            :                         }
    2916                 :            : 
    2917         [ #  # ]:          0 :                         if (!p->skip_locking) {
    2918                 :          0 :                                 level = btrfs_header_level(b);
    2919         [ #  # ]:          0 :                                 if (level <= write_lock_level) {
    2920                 :          0 :                                         err = btrfs_try_tree_write_lock(b);
    2921         [ #  # ]:          0 :                                         if (!err) {
    2922                 :          0 :                                                 btrfs_set_path_blocking(p);
    2923                 :          0 :                                                 btrfs_tree_lock(b);
    2924                 :          0 :                                                 btrfs_clear_path_blocking(p, b,
    2925                 :            :                                                                   BTRFS_WRITE_LOCK);
    2926                 :            :                                         }
    2927                 :          0 :                                         p->locks[level] = BTRFS_WRITE_LOCK;
    2928                 :            :                                 } else {
    2929                 :          0 :                                         err = btrfs_try_tree_read_lock(b);
    2930         [ #  # ]:          0 :                                         if (!err) {
    2931                 :          0 :                                                 btrfs_set_path_blocking(p);
    2932                 :          0 :                                                 btrfs_tree_read_lock(b);
    2933                 :          0 :                                                 btrfs_clear_path_blocking(p, b,
    2934                 :            :                                                                   BTRFS_READ_LOCK);
    2935                 :            :                                         }
    2936                 :          0 :                                         p->locks[level] = BTRFS_READ_LOCK;
    2937                 :            :                                 }
    2938                 :          0 :                                 p->nodes[level] = b;
    2939                 :            :                         }
    2940                 :            :                 } else {
    2941                 :          0 :                         p->slots[level] = slot;
    2942   [ #  #  #  # ]:          0 :                         if (ins_len > 0 &&
    2943                 :          0 :                             btrfs_leaf_free_space(root, b) < ins_len) {
    2944         [ #  # ]:          0 :                                 if (write_lock_level < 1) {
    2945                 :          0 :                                         write_lock_level = 1;
    2946                 :          0 :                                         btrfs_release_path(p);
    2947                 :          0 :                                         goto again;
    2948                 :            :                                 }
    2949                 :            : 
    2950                 :          0 :                                 btrfs_set_path_blocking(p);
    2951                 :          0 :                                 err = split_leaf(trans, root, key,
    2952                 :            :                                                  p, ins_len, ret == 0);
    2953                 :          0 :                                 btrfs_clear_path_blocking(p, NULL, 0);
    2954                 :            : 
    2955         [ #  # ]:          0 :                                 BUG_ON(err > 0);
    2956         [ #  # ]:          0 :                                 if (err) {
    2957                 :            :                                         ret = err;
    2958                 :            :                                         goto done;
    2959                 :            :                                 }
    2960                 :            :                         }
    2961         [ #  # ]:          0 :                         if (!p->search_for_split)
    2962                 :          0 :                                 unlock_up(p, level, lowest_unlock,
    2963                 :            :                                           min_write_lock_level, &write_lock_level);
    2964                 :            :                         goto done;
    2965                 :            :                 }
    2966                 :            :         }
    2967                 :            :         ret = 1;
    2968                 :            : done:
    2969                 :            :         /*
    2970                 :            :          * we don't really know what they plan on doing with the path
    2971                 :            :          * from here on, so for now just mark it as blocking
    2972                 :            :          */
    2973         [ #  # ]:          0 :         if (!p->leave_spinning)
    2974                 :          0 :                 btrfs_set_path_blocking(p);
    2975         [ #  # ]:          0 :         if (ret < 0)
    2976                 :          0 :                 btrfs_release_path(p);
    2977                 :          0 :         return ret;
    2978                 :            : }
    2979                 :            : 
    2980                 :            : /*
    2981                 :            :  * Like btrfs_search_slot, this looks for a key in the given tree. It uses the
    2982                 :            :  * current state of the tree together with the operations recorded in the tree
    2983                 :            :  * modification log to search for the key in a previous version of this tree, as
    2984                 :            :  * denoted by the time_seq parameter.
    2985                 :            :  *
    2986                 :            :  * Naturally, there is no support for insert, delete or cow operations.
    2987                 :            :  *
    2988                 :            :  * The resulting path and return value will be set up as if we called
    2989                 :            :  * btrfs_search_slot at that point in time with ins_len and cow both set to 0.
    2990                 :            :  */
    2991                 :          0 : int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key,
    2992                 :            :                           struct btrfs_path *p, u64 time_seq)
    2993                 :            : {
    2994                 :            :         struct extent_buffer *b;
    2995                 :            :         int slot;
    2996                 :            :         int ret;
    2997                 :            :         int err;
    2998                 :            :         int level;
    2999                 :            :         int lowest_unlock = 1;
    3000                 :            :         u8 lowest_level = 0;
    3001                 :            :         int prev_cmp = -1;
    3002                 :            : 
    3003                 :          0 :         lowest_level = p->lowest_level;
    3004         [ #  # ]:          0 :         WARN_ON(p->nodes[0] != NULL);
    3005                 :            : 
    3006         [ #  # ]:          0 :         if (p->search_commit_root) {
    3007         [ #  # ]:          0 :                 BUG_ON(time_seq);
    3008                 :          0 :                 return btrfs_search_slot(NULL, root, key, p, 0, 0);
    3009                 :            :         }
    3010                 :            : 
    3011                 :            : again:
    3012                 :          0 :         b = get_old_root(root, time_seq);
    3013                 :          0 :         level = btrfs_header_level(b);
    3014                 :          0 :         p->locks[level] = BTRFS_READ_LOCK;
    3015                 :            : 
    3016         [ #  # ]:          0 :         while (b) {
    3017                 :          0 :                 level = btrfs_header_level(b);
    3018                 :          0 :                 p->nodes[level] = b;
    3019                 :          0 :                 btrfs_clear_path_blocking(p, NULL, 0);
    3020                 :            : 
    3021                 :            :                 /*
    3022                 :            :                  * we have a lock on b and as long as we aren't changing
    3023                 :            :                  * the tree, there is no way to for the items in b to change.
    3024                 :            :                  * It is safe to drop the lock on our parent before we
    3025                 :            :                  * go through the expensive btree search on b.
    3026                 :            :                  */
    3027                 :          0 :                 btrfs_unlock_up_safe(p, level + 1);
    3028                 :            : 
    3029                 :            :                 /*
    3030                 :            :                  * Since we can unwind eb's we want to do a real search every
    3031                 :            :                  * time.
    3032                 :            :                  */
    3033                 :            :                 prev_cmp = -1;
    3034                 :          0 :                 ret = key_search(b, key, level, &prev_cmp, &slot);
    3035                 :            : 
    3036         [ #  # ]:          0 :                 if (level != 0) {
    3037                 :            :                         int dec = 0;
    3038 [ #  # ][ #  # ]:          0 :                         if (ret && slot > 0) {
    3039                 :            :                                 dec = 1;
    3040                 :          0 :                                 slot -= 1;
    3041                 :            :                         }
    3042                 :          0 :                         p->slots[level] = slot;
    3043                 :          0 :                         unlock_up(p, level, lowest_unlock, 0, NULL);
    3044                 :            : 
    3045         [ #  # ]:          0 :                         if (level == lowest_level) {
    3046         [ #  # ]:          0 :                                 if (dec)
    3047                 :          0 :                                         p->slots[level]++;
    3048                 :            :                                 goto done;
    3049                 :            :                         }
    3050                 :            : 
    3051                 :          0 :                         err = read_block_for_search(NULL, root, p, &b, level,
    3052                 :            :                                                     slot, key, time_seq);
    3053         [ #  # ]:          0 :                         if (err == -EAGAIN)
    3054                 :            :                                 goto again;
    3055         [ #  # ]:          0 :                         if (err) {
    3056                 :            :                                 ret = err;
    3057                 :            :                                 goto done;
    3058                 :            :                         }
    3059                 :            : 
    3060                 :          0 :                         level = btrfs_header_level(b);
    3061                 :          0 :                         err = btrfs_try_tree_read_lock(b);
    3062         [ #  # ]:          0 :                         if (!err) {
    3063                 :          0 :                                 btrfs_set_path_blocking(p);
    3064                 :          0 :                                 btrfs_tree_read_lock(b);
    3065                 :          0 :                                 btrfs_clear_path_blocking(p, b,
    3066                 :            :                                                           BTRFS_READ_LOCK);
    3067                 :            :                         }
    3068                 :          0 :                         b = tree_mod_log_rewind(root->fs_info, p, b, time_seq);
    3069         [ #  # ]:          0 :                         if (!b) {
    3070                 :            :                                 ret = -ENOMEM;
    3071                 :            :                                 goto done;
    3072                 :            :                         }
    3073                 :          0 :                         p->locks[level] = BTRFS_READ_LOCK;
    3074                 :          0 :                         p->nodes[level] = b;
    3075                 :            :                 } else {
    3076                 :          0 :                         p->slots[level] = slot;
    3077                 :          0 :                         unlock_up(p, level, lowest_unlock, 0, NULL);
    3078                 :          0 :                         goto done;
    3079                 :            :                 }
    3080                 :            :         }
    3081                 :            :         ret = 1;
    3082                 :            : done:
    3083         [ #  # ]:          0 :         if (!p->leave_spinning)
    3084                 :          0 :                 btrfs_set_path_blocking(p);
    3085         [ #  # ]:          0 :         if (ret < 0)
    3086                 :          0 :                 btrfs_release_path(p);
    3087                 :            : 
    3088                 :          0 :         return ret;
    3089                 :            : }
    3090                 :            : 
    3091                 :            : /*
    3092                 :            :  * helper to use instead of search slot if no exact match is needed but
    3093                 :            :  * instead the next or previous item should be returned.
    3094                 :            :  * When find_higher is true, the next higher item is returned, the next lower
    3095                 :            :  * otherwise.
    3096                 :            :  * When return_any and find_higher are both true, and no higher item is found,
    3097                 :            :  * return the next lower instead.
    3098                 :            :  * When return_any is true and find_higher is false, and no lower item is found,
    3099                 :            :  * return the next higher instead.
    3100                 :            :  * It returns 0 if any item is found, 1 if none is found (tree empty), and
    3101                 :            :  * < 0 on error
    3102                 :            :  */
    3103                 :          0 : int btrfs_search_slot_for_read(struct btrfs_root *root,
    3104                 :            :                                struct btrfs_key *key, struct btrfs_path *p,
    3105                 :            :                                int find_higher, int return_any)
    3106                 :            : {
    3107                 :            :         int ret;
    3108                 :          0 :         struct extent_buffer *leaf;
    3109                 :            : 
    3110                 :            : again:
    3111                 :          0 :         ret = btrfs_search_slot(NULL, root, key, p, 0, 0);
    3112         [ #  # ]:          0 :         if (ret <= 0)
    3113                 :            :                 return ret;
    3114                 :            :         /*
    3115                 :            :          * a return value of 1 means the path is at the position where the
    3116                 :            :          * item should be inserted. Normally this is the next bigger item,
    3117                 :            :          * but in case the previous item is the last in a leaf, path points
    3118                 :            :          * to the first free slot in the previous leaf, i.e. at an invalid
    3119                 :            :          * item.
    3120                 :            :          */
    3121                 :          0 :         leaf = p->nodes[0];
    3122                 :            : 
    3123         [ #  # ]:          0 :         if (find_higher) {
    3124         [ #  # ]:          0 :                 if (p->slots[0] >= btrfs_header_nritems(leaf)) {
    3125                 :            :                         ret = btrfs_next_leaf(root, p);
    3126         [ #  # ]:          0 :                         if (ret <= 0)
    3127                 :            :                                 return ret;
    3128         [ #  # ]:          0 :                         if (!return_any)
    3129                 :            :                                 return 1;
    3130                 :            :                         /*
    3131                 :            :                          * no higher item found, return the next
    3132                 :            :                          * lower instead
    3133                 :            :                          */
    3134                 :            :                         return_any = 0;
    3135                 :            :                         find_higher = 0;
    3136                 :          0 :                         btrfs_release_path(p);
    3137                 :          0 :                         goto again;
    3138                 :            :                 }
    3139                 :            :         } else {
    3140         [ #  # ]:          0 :                 if (p->slots[0] == 0) {
    3141                 :          0 :                         ret = btrfs_prev_leaf(root, p);
    3142         [ #  # ]:          0 :                         if (ret < 0)
    3143                 :            :                                 return ret;
    3144         [ #  # ]:          0 :                         if (!ret) {
    3145                 :          0 :                                 leaf = p->nodes[0];
    3146         [ #  # ]:          0 :                                 if (p->slots[0] == btrfs_header_nritems(leaf))
    3147                 :          0 :                                         p->slots[0]--;
    3148                 :            :                                 return 0;
    3149                 :            :                         }
    3150         [ #  # ]:          0 :                         if (!return_any)
    3151                 :            :                                 return 1;
    3152                 :            :                         /*
    3153                 :            :                          * no lower item found, return the next
    3154                 :            :                          * higher instead
    3155                 :            :                          */
    3156                 :            :                         return_any = 0;
    3157                 :            :                         find_higher = 1;
    3158                 :          0 :                         btrfs_release_path(p);
    3159                 :          0 :                         goto again;
    3160                 :            :                 } else {
    3161                 :          0 :                         --p->slots[0];
    3162                 :            :                 }
    3163                 :            :         }
    3164                 :            :         return 0;
    3165                 :            : }
    3166                 :            : 
    3167                 :            : /*
    3168                 :            :  * adjust the pointers going up the tree, starting at level
    3169                 :            :  * making sure the right key of each node is points to 'key'.
    3170                 :            :  * This is used after shifting pointers to the left, so it stops
    3171                 :            :  * fixing up pointers when a given leaf/node is not in slot 0 of the
    3172                 :            :  * higher levels
    3173                 :            :  *
    3174                 :            :  */
    3175                 :          0 : static void fixup_low_keys(struct btrfs_root *root, struct btrfs_path *path,
    3176                 :            :                            struct btrfs_disk_key *key, int level)
    3177                 :            : {
    3178                 :            :         int i;
    3179                 :            :         struct extent_buffer *t;
    3180                 :            : 
    3181         [ #  # ]:          0 :         for (i = level; i < BTRFS_MAX_LEVEL; i++) {
    3182                 :          0 :                 int tslot = path->slots[i];
    3183         [ #  # ]:          0 :                 if (!path->nodes[i])
    3184                 :            :                         break;
    3185                 :            :                 t = path->nodes[i];
    3186                 :          0 :                 tree_mod_log_set_node_key(root->fs_info, t, tslot, 1);
    3187                 :            :                 btrfs_set_node_key(t, key, tslot);
    3188                 :          0 :                 btrfs_mark_buffer_dirty(path->nodes[i]);
    3189         [ #  # ]:          0 :                 if (tslot != 0)
    3190                 :            :                         break;
    3191                 :            :         }
    3192                 :          0 : }
    3193                 :            : 
    3194                 :            : /*
    3195                 :            :  * update item key.
    3196                 :            :  *
    3197                 :            :  * This function isn't completely safe. It's the caller's responsibility
    3198                 :            :  * that the new key won't break the order
    3199                 :            :  */
    3200                 :          0 : void btrfs_set_item_key_safe(struct btrfs_root *root, struct btrfs_path *path,
    3201                 :            :                              struct btrfs_key *new_key)
    3202                 :            : {
    3203                 :            :         struct btrfs_disk_key disk_key;
    3204                 :          0 :         struct extent_buffer *eb;
    3205                 :            :         int slot;
    3206                 :            : 
    3207                 :          0 :         eb = path->nodes[0];
    3208                 :          0 :         slot = path->slots[0];
    3209         [ #  # ]:          0 :         if (slot > 0) {
    3210                 :          0 :                 btrfs_item_key(eb, &disk_key, slot - 1);
    3211         [ #  # ]:          0 :                 BUG_ON(comp_keys(&disk_key, new_key) >= 0);
    3212                 :            :         }
    3213         [ #  # ]:          0 :         if (slot < btrfs_header_nritems(eb) - 1) {
    3214                 :          0 :                 btrfs_item_key(eb, &disk_key, slot + 1);
    3215         [ #  # ]:          0 :                 BUG_ON(comp_keys(&disk_key, new_key) <= 0);
    3216                 :            :         }
    3217                 :            : 
    3218                 :            :         btrfs_cpu_key_to_disk(&disk_key, new_key);
    3219                 :            :         btrfs_set_item_key(eb, &disk_key, slot);
    3220                 :          0 :         btrfs_mark_buffer_dirty(eb);
    3221         [ #  # ]:          0 :         if (slot == 0)
    3222                 :          0 :                 fixup_low_keys(root, path, &disk_key, 1);
    3223                 :          0 : }
    3224                 :            : 
    3225                 :            : /*
    3226                 :            :  * try to push data from one node into the next node left in the
    3227                 :            :  * tree.
    3228                 :            :  *
    3229                 :            :  * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
    3230                 :            :  * error, and > 0 if there was no room in the left hand block.
    3231                 :            :  */
    3232                 :          0 : static int push_node_left(struct btrfs_trans_handle *trans,
    3233                 :          0 :                           struct btrfs_root *root, struct extent_buffer *dst,
    3234                 :          0 :                           struct extent_buffer *src, int empty)
    3235                 :            : {
    3236                 :            :         int push_items = 0;
    3237                 :            :         int src_nritems;
    3238                 :            :         int dst_nritems;
    3239                 :            :         int ret = 0;
    3240                 :            : 
    3241                 :          0 :         src_nritems = btrfs_header_nritems(src);
    3242                 :          0 :         dst_nritems = btrfs_header_nritems(dst);
    3243                 :          0 :         push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
    3244         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(src) != trans->transid);
    3245         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(dst) != trans->transid);
    3246                 :            : 
    3247         [ #  # ]:          0 :         if (!empty && src_nritems <= 8)
    3248                 :            :                 return 1;
    3249                 :            : 
    3250         [ #  # ]:          0 :         if (push_items <= 0)
    3251                 :            :                 return 1;
    3252                 :            : 
    3253         [ #  # ]:          0 :         if (empty) {
    3254                 :          0 :                 push_items = min(src_nritems, push_items);
    3255         [ #  # ]:          0 :                 if (push_items < src_nritems) {
    3256                 :            :                         /* leave at least 8 pointers in the node if
    3257                 :            :                          * we aren't going to empty it
    3258                 :            :                          */
    3259         [ #  # ]:          0 :                         if (src_nritems - push_items < 8) {
    3260         [ #  # ]:          0 :                                 if (push_items <= 8)
    3261                 :            :                                         return 1;
    3262                 :          0 :                                 push_items -= 8;
    3263                 :            :                         }
    3264                 :            :                 }
    3265                 :            :         } else
    3266                 :          0 :                 push_items = min(src_nritems - 8, push_items);
    3267                 :            : 
    3268                 :          0 :         ret = tree_mod_log_eb_copy(root->fs_info, dst, src, dst_nritems, 0,
    3269                 :            :                                    push_items);
    3270         [ #  # ]:          0 :         if (ret) {
    3271                 :          0 :                 btrfs_abort_transaction(trans, root, ret);
    3272                 :          0 :                 return ret;
    3273                 :            :         }
    3274                 :          0 :         copy_extent_buffer(dst, src,
    3275                 :            :                            btrfs_node_key_ptr_offset(dst_nritems),
    3276                 :            :                            btrfs_node_key_ptr_offset(0),
    3277                 :          0 :                            push_items * sizeof(struct btrfs_key_ptr));
    3278                 :            : 
    3279         [ #  # ]:          0 :         if (push_items < src_nritems) {
    3280                 :            :                 /*
    3281                 :            :                  * don't call tree_mod_log_eb_move here, key removal was already
    3282                 :            :                  * fully logged by tree_mod_log_eb_copy above.
    3283                 :            :                  */
    3284                 :          0 :                 memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0),
    3285                 :            :                                       btrfs_node_key_ptr_offset(push_items),
    3286                 :          0 :                                       (src_nritems - push_items) *
    3287                 :            :                                       sizeof(struct btrfs_key_ptr));
    3288                 :            :         }
    3289                 :          0 :         btrfs_set_header_nritems(src, src_nritems - push_items);
    3290                 :          0 :         btrfs_set_header_nritems(dst, dst_nritems + push_items);
    3291                 :          0 :         btrfs_mark_buffer_dirty(src);
    3292                 :          0 :         btrfs_mark_buffer_dirty(dst);
    3293                 :            : 
    3294                 :          0 :         return ret;
    3295                 :            : }
    3296                 :            : 
    3297                 :            : /*
    3298                 :            :  * try to push data from one node into the next node right in the
    3299                 :            :  * tree.
    3300                 :            :  *
    3301                 :            :  * returns 0 if some ptrs were pushed, < 0 if there was some horrible
    3302                 :            :  * error, and > 0 if there was no room in the right hand block.
    3303                 :            :  *
    3304                 :            :  * this will  only push up to 1/2 the contents of the left node over
    3305                 :            :  */
    3306                 :          0 : static int balance_node_right(struct btrfs_trans_handle *trans,
    3307                 :            :                               struct btrfs_root *root,
    3308                 :          0 :                               struct extent_buffer *dst,
    3309                 :          0 :                               struct extent_buffer *src)
    3310                 :            : {
    3311                 :            :         int push_items = 0;
    3312                 :            :         int max_push;
    3313                 :            :         int src_nritems;
    3314                 :            :         int dst_nritems;
    3315                 :            :         int ret = 0;
    3316                 :            : 
    3317         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(src) != trans->transid);
    3318         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(dst) != trans->transid);
    3319                 :            : 
    3320                 :          0 :         src_nritems = btrfs_header_nritems(src);
    3321                 :          0 :         dst_nritems = btrfs_header_nritems(dst);
    3322                 :          0 :         push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
    3323         [ #  # ]:          0 :         if (push_items <= 0)
    3324                 :            :                 return 1;
    3325                 :            : 
    3326         [ #  # ]:          0 :         if (src_nritems < 4)
    3327                 :            :                 return 1;
    3328                 :            : 
    3329                 :          0 :         max_push = src_nritems / 2 + 1;
    3330                 :            :         /* don't try to empty the node */
    3331         [ #  # ]:          0 :         if (max_push >= src_nritems)
    3332                 :            :                 return 1;
    3333                 :            : 
    3334         [ #  # ]:          0 :         if (max_push < push_items)
    3335                 :            :                 push_items = max_push;
    3336                 :            : 
    3337                 :          0 :         tree_mod_log_eb_move(root->fs_info, dst, push_items, 0, dst_nritems);
    3338                 :          0 :         memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items),
    3339                 :            :                                       btrfs_node_key_ptr_offset(0),
    3340                 :          0 :                                       (dst_nritems) *
    3341                 :            :                                       sizeof(struct btrfs_key_ptr));
    3342                 :            : 
    3343                 :          0 :         ret = tree_mod_log_eb_copy(root->fs_info, dst, src, 0,
    3344                 :          0 :                                    src_nritems - push_items, push_items);
    3345         [ #  # ]:          0 :         if (ret) {
    3346                 :          0 :                 btrfs_abort_transaction(trans, root, ret);
    3347                 :          0 :                 return ret;
    3348                 :            :         }
    3349                 :          0 :         copy_extent_buffer(dst, src,
    3350                 :            :                            btrfs_node_key_ptr_offset(0),
    3351                 :            :                            btrfs_node_key_ptr_offset(src_nritems - push_items),
    3352                 :            :                            push_items * sizeof(struct btrfs_key_ptr));
    3353                 :            : 
    3354                 :            :         btrfs_set_header_nritems(src, src_nritems - push_items);
    3355                 :          0 :         btrfs_set_header_nritems(dst, dst_nritems + push_items);
    3356                 :            : 
    3357                 :          0 :         btrfs_mark_buffer_dirty(src);
    3358                 :          0 :         btrfs_mark_buffer_dirty(dst);
    3359                 :            : 
    3360                 :          0 :         return ret;
    3361                 :            : }
    3362                 :            : 
    3363                 :            : /*
    3364                 :            :  * helper function to insert a new root level in the tree.
    3365                 :            :  * A new node is allocated, and a single item is inserted to
    3366                 :            :  * point to the existing root
    3367                 :            :  *
    3368                 :            :  * returns zero on success or < 0 on failure.
    3369                 :            :  */
    3370                 :          0 : static noinline int insert_new_root(struct btrfs_trans_handle *trans,
    3371                 :          0 :                            struct btrfs_root *root,
    3372                 :            :                            struct btrfs_path *path, int level)
    3373                 :            : {
    3374                 :            :         u64 lower_gen;
    3375                 :          0 :         struct extent_buffer *lower;
    3376                 :          0 :         struct extent_buffer *c;
    3377                 :            :         struct extent_buffer *old;
    3378                 :            :         struct btrfs_disk_key lower_key;
    3379                 :            : 
    3380         [ #  # ]:          0 :         BUG_ON(path->nodes[level]);
    3381         [ #  # ]:          0 :         BUG_ON(path->nodes[level-1] != root->node);
    3382                 :            : 
    3383                 :            :         lower = path->nodes[level-1];
    3384         [ #  # ]:          0 :         if (level == 1)
    3385                 :            :                 btrfs_item_key(lower, &lower_key, 0);
    3386                 :            :         else
    3387                 :          0 :                 btrfs_node_key(lower, &lower_key, 0);
    3388                 :            : 
    3389                 :          0 :         c = btrfs_alloc_free_block(trans, root, root->nodesize, 0,
    3390                 :            :                                    root->root_key.objectid, &lower_key,
    3391                 :          0 :                                    level, root->node->start, 0);
    3392         [ #  # ]:          0 :         if (IS_ERR(c))
    3393                 :          0 :                 return PTR_ERR(c);
    3394                 :            : 
    3395                 :          0 :         root_add_used(root, root->nodesize);
    3396                 :            : 
    3397                 :          0 :         memset_extent_buffer(c, 0, 0, sizeof(struct btrfs_header));
    3398                 :            :         btrfs_set_header_nritems(c, 1);
    3399                 :          0 :         btrfs_set_header_level(c, level);
    3400                 :          0 :         btrfs_set_header_bytenr(c, c->start);
    3401                 :          0 :         btrfs_set_header_generation(c, trans->transid);
    3402                 :            :         btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV);
    3403                 :          0 :         btrfs_set_header_owner(c, root->root_key.objectid);
    3404                 :            : 
    3405                 :          0 :         write_extent_buffer(c, root->fs_info->fsid, btrfs_header_fsid(),
    3406                 :            :                             BTRFS_FSID_SIZE);
    3407                 :            : 
    3408                 :          0 :         write_extent_buffer(c, root->fs_info->chunk_tree_uuid,
    3409                 :            :                             btrfs_header_chunk_tree_uuid(c), BTRFS_UUID_SIZE);
    3410                 :            : 
    3411                 :            :         btrfs_set_node_key(c, &lower_key, 0);
    3412                 :          0 :         btrfs_set_node_blockptr(c, 0, lower->start);
    3413                 :            :         lower_gen = btrfs_header_generation(lower);
    3414         [ #  # ]:          0 :         WARN_ON(lower_gen != trans->transid);
    3415                 :            : 
    3416                 :            :         btrfs_set_node_ptr_generation(c, 0, lower_gen);
    3417                 :            : 
    3418                 :          0 :         btrfs_mark_buffer_dirty(c);
    3419                 :            : 
    3420                 :          0 :         old = root->node;
    3421                 :          0 :         tree_mod_log_set_root_pointer(root, c, 0);
    3422                 :          0 :         rcu_assign_pointer(root->node, c);
    3423                 :            : 
    3424                 :            :         /* the super has an extra ref to root->node */
    3425                 :          0 :         free_extent_buffer(old);
    3426                 :            : 
    3427                 :          0 :         add_root_to_dirty_list(root);
    3428                 :            :         extent_buffer_get(c);
    3429                 :          0 :         path->nodes[level] = c;
    3430                 :          0 :         path->locks[level] = BTRFS_WRITE_LOCK;
    3431                 :          0 :         path->slots[level] = 0;
    3432                 :          0 :         return 0;
    3433                 :            : }
    3434                 :            : 
    3435                 :            : /*
    3436                 :            :  * worker function to insert a single pointer in a node.
    3437                 :            :  * the node should have enough room for the pointer already
    3438                 :            :  *
    3439                 :            :  * slot and level indicate where you want the key to go, and
    3440                 :            :  * blocknr is the block the key points to.
    3441                 :            :  */
    3442                 :          0 : static void insert_ptr(struct btrfs_trans_handle *trans,
    3443                 :            :                        struct btrfs_root *root, struct btrfs_path *path,
    3444                 :            :                        struct btrfs_disk_key *key, u64 bytenr,
    3445                 :            :                        int slot, int level)
    3446                 :            : {
    3447                 :          0 :         struct extent_buffer *lower;
    3448                 :            :         int nritems;
    3449                 :            :         int ret;
    3450                 :            : 
    3451         [ #  # ]:          0 :         BUG_ON(!path->nodes[level]);
    3452                 :          0 :         btrfs_assert_tree_locked(path->nodes[level]);
    3453                 :          0 :         lower = path->nodes[level];
    3454                 :          0 :         nritems = btrfs_header_nritems(lower);
    3455         [ #  # ]:          0 :         BUG_ON(slot > nritems);
    3456         [ #  # ]:          0 :         BUG_ON(nritems == BTRFS_NODEPTRS_PER_BLOCK(root));
    3457         [ #  # ]:          0 :         if (slot != nritems) {
    3458         [ #  # ]:          0 :                 if (level)
    3459                 :          0 :                         tree_mod_log_eb_move(root->fs_info, lower, slot + 1,
    3460                 :            :                                              slot, nritems - slot);
    3461                 :          0 :                 memmove_extent_buffer(lower,
    3462                 :            :                               btrfs_node_key_ptr_offset(slot + 1),
    3463                 :            :                               btrfs_node_key_ptr_offset(slot),
    3464                 :          0 :                               (nritems - slot) * sizeof(struct btrfs_key_ptr));
    3465                 :            :         }
    3466         [ #  # ]:          0 :         if (level) {
    3467                 :          0 :                 ret = tree_mod_log_insert_key(root->fs_info, lower, slot,
    3468                 :            :                                               MOD_LOG_KEY_ADD, GFP_NOFS);
    3469         [ #  # ]:          0 :                 BUG_ON(ret < 0);
    3470                 :            :         }
    3471                 :            :         btrfs_set_node_key(lower, key, slot);
    3472                 :            :         btrfs_set_node_blockptr(lower, slot, bytenr);
    3473         [ #  # ]:          0 :         WARN_ON(trans->transid == 0);
    3474                 :          0 :         btrfs_set_node_ptr_generation(lower, slot, trans->transid);
    3475                 :          0 :         btrfs_set_header_nritems(lower, nritems + 1);
    3476                 :          0 :         btrfs_mark_buffer_dirty(lower);
    3477                 :          0 : }
    3478                 :            : 
    3479                 :            : /*
    3480                 :            :  * split the node at the specified level in path in two.
    3481                 :            :  * The path is corrected to point to the appropriate node after the split
    3482                 :            :  *
    3483                 :            :  * Before splitting this tries to make some room in the node by pushing
    3484                 :            :  * left and right, if either one works, it returns right away.
    3485                 :            :  *
    3486                 :            :  * returns 0 on success and < 0 on failure
    3487                 :            :  */
    3488                 :          0 : static noinline int split_node(struct btrfs_trans_handle *trans,
    3489                 :            :                                struct btrfs_root *root,
    3490                 :            :                                struct btrfs_path *path, int level)
    3491                 :            : {
    3492                 :          0 :         struct extent_buffer *c;
    3493                 :          0 :         struct extent_buffer *split;
    3494                 :            :         struct btrfs_disk_key disk_key;
    3495                 :            :         int mid;
    3496                 :            :         int ret;
    3497                 :            :         u32 c_nritems;
    3498                 :            : 
    3499                 :          0 :         c = path->nodes[level];
    3500         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(c) != trans->transid);
    3501         [ #  # ]:          0 :         if (c == root->node) {
    3502                 :            :                 /*
    3503                 :            :                  * trying to split the root, lets make a new one
    3504                 :            :                  *
    3505                 :            :                  * tree mod log: We don't log_removal old root in
    3506                 :            :                  * insert_new_root, because that root buffer will be kept as a
    3507                 :            :                  * normal node. We are going to log removal of half of the
    3508                 :            :                  * elements below with tree_mod_log_eb_copy. We're holding a
    3509                 :            :                  * tree lock on the buffer, which is why we cannot race with
    3510                 :            :                  * other tree_mod_log users.
    3511                 :            :                  */
    3512                 :          0 :                 ret = insert_new_root(trans, root, path, level + 1);
    3513         [ #  # ]:          0 :                 if (ret)
    3514                 :            :                         return ret;
    3515                 :            :         } else {
    3516                 :          0 :                 ret = push_nodes_for_insert(trans, root, path, level);
    3517                 :          0 :                 c = path->nodes[level];
    3518   [ #  #  #  # ]:          0 :                 if (!ret && btrfs_header_nritems(c) <
    3519                 :          0 :                     BTRFS_NODEPTRS_PER_BLOCK(root) - 3)
    3520                 :            :                         return 0;
    3521         [ #  # ]:          0 :                 if (ret < 0)
    3522                 :            :                         return ret;
    3523                 :            :         }
    3524                 :            : 
    3525                 :            :         c_nritems = btrfs_header_nritems(c);
    3526                 :          0 :         mid = (c_nritems + 1) / 2;
    3527                 :          0 :         btrfs_node_key(c, &disk_key, mid);
    3528                 :            : 
    3529                 :          0 :         split = btrfs_alloc_free_block(trans, root, root->nodesize, 0,
    3530                 :            :                                         root->root_key.objectid,
    3531                 :            :                                         &disk_key, level, c->start, 0);
    3532         [ #  # ]:          0 :         if (IS_ERR(split))
    3533                 :          0 :                 return PTR_ERR(split);
    3534                 :            : 
    3535                 :          0 :         root_add_used(root, root->nodesize);
    3536                 :            : 
    3537                 :          0 :         memset_extent_buffer(split, 0, 0, sizeof(struct btrfs_header));
    3538                 :            :         btrfs_set_header_level(split, btrfs_header_level(c));
    3539                 :          0 :         btrfs_set_header_bytenr(split, split->start);
    3540                 :          0 :         btrfs_set_header_generation(split, trans->transid);
    3541                 :            :         btrfs_set_header_backref_rev(split, BTRFS_MIXED_BACKREF_REV);
    3542                 :          0 :         btrfs_set_header_owner(split, root->root_key.objectid);
    3543                 :          0 :         write_extent_buffer(split, root->fs_info->fsid,
    3544                 :            :                             btrfs_header_fsid(), BTRFS_FSID_SIZE);
    3545                 :          0 :         write_extent_buffer(split, root->fs_info->chunk_tree_uuid,
    3546                 :            :                             btrfs_header_chunk_tree_uuid(split),
    3547                 :            :                             BTRFS_UUID_SIZE);
    3548                 :            : 
    3549                 :          0 :         ret = tree_mod_log_eb_copy(root->fs_info, split, c, 0,
    3550                 :          0 :                                    mid, c_nritems - mid);
    3551         [ #  # ]:          0 :         if (ret) {
    3552                 :          0 :                 btrfs_abort_transaction(trans, root, ret);
    3553                 :          0 :                 return ret;
    3554                 :            :         }
    3555                 :          0 :         copy_extent_buffer(split, c,
    3556                 :            :                            btrfs_node_key_ptr_offset(0),
    3557                 :            :                            btrfs_node_key_ptr_offset(mid),
    3558                 :          0 :                            (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
    3559                 :            :         btrfs_set_header_nritems(split, c_nritems - mid);
    3560                 :            :         btrfs_set_header_nritems(c, mid);
    3561                 :            :         ret = 0;
    3562                 :            : 
    3563                 :          0 :         btrfs_mark_buffer_dirty(c);
    3564                 :          0 :         btrfs_mark_buffer_dirty(split);
    3565                 :            : 
    3566                 :          0 :         insert_ptr(trans, root, path, &disk_key, split->start,
    3567                 :          0 :                    path->slots[level + 1] + 1, level + 1);
    3568                 :            : 
    3569         [ #  # ]:          0 :         if (path->slots[level] >= mid) {
    3570                 :          0 :                 path->slots[level] -= mid;
    3571                 :          0 :                 btrfs_tree_unlock(c);
    3572                 :          0 :                 free_extent_buffer(c);
    3573                 :          0 :                 path->nodes[level] = split;
    3574                 :          0 :                 path->slots[level + 1] += 1;
    3575                 :            :         } else {
    3576                 :          0 :                 btrfs_tree_unlock(split);
    3577                 :          0 :                 free_extent_buffer(split);
    3578                 :            :         }
    3579                 :            :         return ret;
    3580                 :            : }
    3581                 :            : 
    3582                 :            : /*
    3583                 :            :  * how many bytes are required to store the items in a leaf.  start
    3584                 :            :  * and nr indicate which items in the leaf to check.  This totals up the
    3585                 :            :  * space used both by the item structs and the item data
    3586                 :            :  */
    3587                 :          0 : static int leaf_space_used(struct extent_buffer *l, int start, int nr)
    3588                 :            : {
    3589                 :            :         struct btrfs_item *start_item;
    3590                 :            :         struct btrfs_item *end_item;
    3591                 :            :         struct btrfs_map_token token;
    3592                 :            :         int data_len;
    3593                 :          0 :         int nritems = btrfs_header_nritems(l);
    3594                 :          0 :         int end = min(nritems, start + nr) - 1;
    3595                 :            : 
    3596         [ #  # ]:          0 :         if (!nr)
    3597                 :            :                 return 0;
    3598                 :            :         btrfs_init_map_token(&token);
    3599                 :            :         start_item = btrfs_item_nr(start);
    3600                 :            :         end_item = btrfs_item_nr(end);
    3601                 :          0 :         data_len = btrfs_token_item_offset(l, start_item, &token) +
    3602                 :            :                 btrfs_token_item_size(l, start_item, &token);
    3603                 :          0 :         data_len = data_len - btrfs_token_item_offset(l, end_item, &token);
    3604                 :          0 :         data_len += sizeof(struct btrfs_item) * nr;
    3605         [ #  # ]:          0 :         WARN_ON(data_len < 0);
    3606                 :          0 :         return data_len;
    3607                 :            : }
    3608                 :            : 
    3609                 :            : /*
    3610                 :            :  * The space between the end of the leaf items and
    3611                 :            :  * the start of the leaf data.  IOW, how much room
    3612                 :            :  * the leaf has left for both items and data
    3613                 :            :  */
    3614                 :          0 : noinline int btrfs_leaf_free_space(struct btrfs_root *root,
    3615                 :          0 :                                    struct extent_buffer *leaf)
    3616                 :            : {
    3617                 :          0 :         int nritems = btrfs_header_nritems(leaf);
    3618                 :            :         int ret;
    3619                 :          0 :         ret = BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems);
    3620         [ #  # ]:          0 :         if (ret < 0) {
    3621                 :          0 :                 btrfs_crit(root->fs_info,
    3622                 :            :                         "leaf free space ret %d, leaf data size %lu, used %d nritems %d",
    3623                 :            :                        ret, (unsigned long) BTRFS_LEAF_DATA_SIZE(root),
    3624                 :            :                        leaf_space_used(leaf, 0, nritems), nritems);
    3625                 :            :         }
    3626                 :          0 :         return ret;
    3627                 :            : }
    3628                 :            : 
    3629                 :            : /*
    3630                 :            :  * min slot controls the lowest index we're willing to push to the
    3631                 :            :  * right.  We'll push up to and including min_slot, but no lower
    3632                 :            :  */
    3633                 :          0 : static noinline int __push_leaf_right(struct btrfs_trans_handle *trans,
    3634                 :            :                                       struct btrfs_root *root,
    3635                 :            :                                       struct btrfs_path *path,
    3636                 :            :                                       int data_size, int empty,
    3637                 :          0 :                                       struct extent_buffer *right,
    3638                 :            :                                       int free_space, u32 left_nritems,
    3639                 :            :                                       u32 min_slot)
    3640                 :            : {
    3641                 :          0 :         struct extent_buffer *left = path->nodes[0];
    3642                 :          0 :         struct extent_buffer *upper = path->nodes[1];
    3643                 :            :         struct btrfs_map_token token;
    3644                 :            :         struct btrfs_disk_key disk_key;
    3645                 :            :         int slot;
    3646                 :            :         u32 i;
    3647                 :            :         int push_space = 0;
    3648                 :            :         int push_items = 0;
    3649                 :            :         struct btrfs_item *item;
    3650                 :            :         u32 nr;
    3651                 :            :         u32 right_nritems;
    3652                 :            :         u32 data_end;
    3653                 :            :         u32 this_item_size;
    3654                 :            : 
    3655                 :            :         btrfs_init_map_token(&token);
    3656                 :            : 
    3657         [ #  # ]:          0 :         if (empty)
    3658                 :            :                 nr = 0;
    3659                 :            :         else
    3660                 :          0 :                 nr = max_t(u32, 1, min_slot);
    3661                 :            : 
    3662         [ #  # ]:          0 :         if (path->slots[0] >= left_nritems)
    3663                 :            :                 push_space += data_size;
    3664                 :            : 
    3665                 :          0 :         slot = path->slots[1];
    3666                 :          0 :         i = left_nritems - 1;
    3667         [ #  # ]:          0 :         while (i >= nr) {
    3668                 :            :                 item = btrfs_item_nr(i);
    3669                 :            : 
    3670         [ #  # ]:          0 :                 if (!empty && push_items > 0) {
    3671         [ #  # ]:          0 :                         if (path->slots[0] > i)
    3672                 :            :                                 break;
    3673         [ #  # ]:          0 :                         if (path->slots[0] == i) {
    3674                 :          0 :                                 int space = btrfs_leaf_free_space(root, left);
    3675         [ #  # ]:          0 :                                 if (space + push_space * 2 > free_space)
    3676                 :            :                                         break;
    3677                 :            :                         }
    3678                 :            :                 }
    3679                 :            : 
    3680         [ #  # ]:          0 :                 if (path->slots[0] == i)
    3681                 :          0 :                         push_space += data_size;
    3682                 :            : 
    3683                 :            :                 this_item_size = btrfs_item_size(left, item);
    3684         [ #  # ]:          0 :                 if (this_item_size + sizeof(*item) + push_space > free_space)
    3685                 :            :                         break;
    3686                 :            : 
    3687                 :          0 :                 push_items++;
    3688                 :          0 :                 push_space += this_item_size + sizeof(*item);
    3689         [ #  # ]:          0 :                 if (i == 0)
    3690                 :            :                         break;
    3691                 :          0 :                 i--;
    3692                 :            :         }
    3693                 :            : 
    3694         [ #  # ]:          0 :         if (push_items == 0)
    3695                 :            :                 goto out_unlock;
    3696                 :            : 
    3697         [ #  # ]:          0 :         WARN_ON(!empty && push_items == left_nritems);
    3698                 :            : 
    3699                 :            :         /* push left to right */
    3700                 :            :         right_nritems = btrfs_header_nritems(right);
    3701                 :            : 
    3702                 :          0 :         push_space = btrfs_item_end_nr(left, left_nritems - push_items);
    3703                 :          0 :         push_space -= leaf_data_end(root, left);
    3704                 :            : 
    3705                 :            :         /* make room in the right data area */
    3706                 :            :         data_end = leaf_data_end(root, right);
    3707                 :          0 :         memmove_extent_buffer(right,
    3708                 :          0 :                               btrfs_leaf_data(right) + data_end - push_space,
    3709                 :            :                               btrfs_leaf_data(right) + data_end,
    3710                 :          0 :                               BTRFS_LEAF_DATA_SIZE(root) - data_end);
    3711                 :            : 
    3712                 :            :         /* copy from the left data area */
    3713                 :          0 :         copy_extent_buffer(right, left, btrfs_leaf_data(right) +
    3714                 :          0 :                      BTRFS_LEAF_DATA_SIZE(root) - push_space,
    3715                 :            :                      btrfs_leaf_data(left) + leaf_data_end(root, left),
    3716                 :            :                      push_space);
    3717                 :            : 
    3718                 :          0 :         memmove_extent_buffer(right, btrfs_item_nr_offset(push_items),
    3719                 :            :                               btrfs_item_nr_offset(0),
    3720                 :          0 :                               right_nritems * sizeof(struct btrfs_item));
    3721                 :            : 
    3722                 :            :         /* copy the items from left to right */
    3723                 :          0 :         copy_extent_buffer(right, left, btrfs_item_nr_offset(0),
    3724                 :            :                    btrfs_item_nr_offset(left_nritems - push_items),
    3725                 :            :                    push_items * sizeof(struct btrfs_item));
    3726                 :            : 
    3727                 :            :         /* update the item pointers */
    3728                 :          0 :         right_nritems += push_items;
    3729                 :            :         btrfs_set_header_nritems(right, right_nritems);
    3730                 :          0 :         push_space = BTRFS_LEAF_DATA_SIZE(root);
    3731         [ #  # ]:          0 :         for (i = 0; i < right_nritems; i++) {
    3732                 :            :                 item = btrfs_item_nr(i);
    3733                 :          0 :                 push_space -= btrfs_token_item_size(right, item, &token);
    3734                 :            :                 btrfs_set_token_item_offset(right, item, push_space, &token);
    3735                 :            :         }
    3736                 :            : 
    3737                 :            :         left_nritems -= push_items;
    3738                 :            :         btrfs_set_header_nritems(left, left_nritems);
    3739                 :            : 
    3740         [ #  # ]:          0 :         if (left_nritems)
    3741                 :          0 :                 btrfs_mark_buffer_dirty(left);
    3742                 :            :         else
    3743                 :          0 :                 clean_tree_block(trans, root, left);
    3744                 :            : 
    3745                 :          0 :         btrfs_mark_buffer_dirty(right);
    3746                 :            : 
    3747                 :            :         btrfs_item_key(right, &disk_key, 0);
    3748                 :          0 :         btrfs_set_node_key(upper, &disk_key, slot + 1);
    3749                 :          0 :         btrfs_mark_buffer_dirty(upper);
    3750                 :            : 
    3751                 :            :         /* then fixup the leaf pointer in the path */
    3752         [ #  # ]:          0 :         if (path->slots[0] >= left_nritems) {
    3753                 :          0 :                 path->slots[0] -= left_nritems;
    3754         [ #  # ]:          0 :                 if (btrfs_header_nritems(path->nodes[0]) == 0)
    3755                 :          0 :                         clean_tree_block(trans, root, path->nodes[0]);
    3756                 :          0 :                 btrfs_tree_unlock(path->nodes[0]);
    3757                 :          0 :                 free_extent_buffer(path->nodes[0]);
    3758                 :          0 :                 path->nodes[0] = right;
    3759                 :          0 :                 path->slots[1] += 1;
    3760                 :            :         } else {
    3761                 :          0 :                 btrfs_tree_unlock(right);
    3762                 :          0 :                 free_extent_buffer(right);
    3763                 :            :         }
    3764                 :            :         return 0;
    3765                 :            : 
    3766                 :            : out_unlock:
    3767                 :          0 :         btrfs_tree_unlock(right);
    3768                 :          0 :         free_extent_buffer(right);
    3769                 :          0 :         return 1;
    3770                 :            : }
    3771                 :            : 
    3772                 :            : /*
    3773                 :            :  * push some data in the path leaf to the right, trying to free up at
    3774                 :            :  * least data_size bytes.  returns zero if the push worked, nonzero otherwise
    3775                 :            :  *
    3776                 :            :  * returns 1 if the push failed because the other node didn't have enough
    3777                 :            :  * room, 0 if everything worked out and < 0 if there were major errors.
    3778                 :            :  *
    3779                 :            :  * this will push starting from min_slot to the end of the leaf.  It won't
    3780                 :            :  * push any slot lower than min_slot
    3781                 :            :  */
    3782                 :          0 : static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
    3783                 :            :                            *root, struct btrfs_path *path,
    3784                 :            :                            int min_data_size, int data_size,
    3785                 :            :                            int empty, u32 min_slot)
    3786                 :            : {
    3787                 :          0 :         struct extent_buffer *left = path->nodes[0];
    3788                 :            :         struct extent_buffer *right;
    3789                 :          0 :         struct extent_buffer *upper;
    3790                 :            :         int slot;
    3791                 :            :         int free_space;
    3792                 :            :         u32 left_nritems;
    3793                 :            :         int ret;
    3794                 :            : 
    3795         [ #  # ]:          0 :         if (!path->nodes[1])
    3796                 :            :                 return 1;
    3797                 :            : 
    3798                 :          0 :         slot = path->slots[1];
    3799                 :            :         upper = path->nodes[1];
    3800         [ #  # ]:          0 :         if (slot >= btrfs_header_nritems(upper) - 1)
    3801                 :            :                 return 1;
    3802                 :            : 
    3803                 :          0 :         btrfs_assert_tree_locked(path->nodes[1]);
    3804                 :            : 
    3805                 :          0 :         right = read_node_slot(root, upper, slot + 1);
    3806         [ #  # ]:          0 :         if (right == NULL)
    3807                 :            :                 return 1;
    3808                 :            : 
    3809                 :          0 :         btrfs_tree_lock(right);
    3810                 :          0 :         btrfs_set_lock_blocking(right);
    3811                 :            : 
    3812                 :          0 :         free_space = btrfs_leaf_free_space(root, right);
    3813         [ #  # ]:          0 :         if (free_space < data_size)
    3814                 :            :                 goto out_unlock;
    3815                 :            : 
    3816                 :            :         /* cow and double check */
    3817                 :          0 :         ret = btrfs_cow_block(trans, root, right, upper,
    3818                 :            :                               slot + 1, &right);
    3819         [ #  # ]:          0 :         if (ret)
    3820                 :            :                 goto out_unlock;
    3821                 :            : 
    3822                 :          0 :         free_space = btrfs_leaf_free_space(root, right);
    3823         [ #  # ]:          0 :         if (free_space < data_size)
    3824                 :            :                 goto out_unlock;
    3825                 :            : 
    3826                 :            :         left_nritems = btrfs_header_nritems(left);
    3827         [ #  # ]:          0 :         if (left_nritems == 0)
    3828                 :            :                 goto out_unlock;
    3829                 :            : 
    3830 [ #  # ][ #  # ]:          0 :         if (path->slots[0] == left_nritems && !empty) {
    3831                 :            :                 /* Key greater than all keys in the leaf, right neighbor has
    3832                 :            :                  * enough room for it and we're not emptying our leaf to delete
    3833                 :            :                  * it, therefore use right neighbor to insert the new item and
    3834                 :            :                  * no need to touch/dirty our left leaft. */
    3835                 :          0 :                 btrfs_tree_unlock(left);
    3836                 :          0 :                 free_extent_buffer(left);
    3837                 :          0 :                 path->nodes[0] = right;
    3838                 :          0 :                 path->slots[0] = 0;
    3839                 :          0 :                 path->slots[1]++;
    3840                 :          0 :                 return 0;
    3841                 :            :         }
    3842                 :            : 
    3843                 :          0 :         return __push_leaf_right(trans, root, path, min_data_size, empty,
    3844                 :            :                                 right, free_space, left_nritems, min_slot);
    3845                 :            : out_unlock:
    3846                 :          0 :         btrfs_tree_unlock(right);
    3847                 :          0 :         free_extent_buffer(right);
    3848                 :          0 :         return 1;
    3849                 :            : }
    3850                 :            : 
    3851                 :            : /*
    3852                 :            :  * push some data in the path leaf to the left, trying to free up at
    3853                 :            :  * least data_size bytes.  returns zero if the push worked, nonzero otherwise
    3854                 :            :  *
    3855                 :            :  * max_slot can put a limit on how far into the leaf we'll push items.  The
    3856                 :            :  * item at 'max_slot' won't be touched.  Use (u32)-1 to make us do all the
    3857                 :            :  * items
    3858                 :            :  */
    3859                 :          0 : static noinline int __push_leaf_left(struct btrfs_trans_handle *trans,
    3860                 :            :                                      struct btrfs_root *root,
    3861                 :            :                                      struct btrfs_path *path, int data_size,
    3862                 :          0 :                                      int empty, struct extent_buffer *left,
    3863                 :            :                                      int free_space, u32 right_nritems,
    3864                 :            :                                      u32 max_slot)
    3865                 :            : {
    3866                 :            :         struct btrfs_disk_key disk_key;
    3867                 :          0 :         struct extent_buffer *right = path->nodes[0];
    3868                 :            :         int i;
    3869                 :            :         int push_space = 0;
    3870                 :            :         int push_items = 0;
    3871                 :            :         struct btrfs_item *item;
    3872                 :            :         u32 old_left_nritems;
    3873                 :            :         u32 nr;
    3874                 :            :         int ret = 0;
    3875                 :            :         u32 this_item_size;
    3876                 :            :         u32 old_left_item_size;
    3877                 :            :         struct btrfs_map_token token;
    3878                 :            : 
    3879                 :            :         btrfs_init_map_token(&token);
    3880                 :            : 
    3881         [ #  # ]:          0 :         if (empty)
    3882                 :          0 :                 nr = min(right_nritems, max_slot);
    3883                 :            :         else
    3884                 :          0 :                 nr = min(right_nritems - 1, max_slot);
    3885                 :            : 
    3886         [ #  # ]:          0 :         for (i = 0; i < nr; i++) {
    3887                 :            :                 item = btrfs_item_nr(i);
    3888                 :            : 
    3889         [ #  # ]:          0 :                 if (!empty && push_items > 0) {
    3890         [ #  # ]:          0 :                         if (path->slots[0] < i)
    3891                 :            :                                 break;
    3892         [ #  # ]:          0 :                         if (path->slots[0] == i) {
    3893                 :          0 :                                 int space = btrfs_leaf_free_space(root, right);
    3894         [ #  # ]:          0 :                                 if (space + push_space * 2 > free_space)
    3895                 :            :                                         break;
    3896                 :            :                         }
    3897                 :            :                 }
    3898                 :            : 
    3899         [ #  # ]:          0 :                 if (path->slots[0] == i)
    3900                 :          0 :                         push_space += data_size;
    3901                 :            : 
    3902                 :            :                 this_item_size = btrfs_item_size(right, item);
    3903         [ #  # ]:          0 :                 if (this_item_size + sizeof(*item) + push_space > free_space)
    3904                 :            :                         break;
    3905                 :            : 
    3906                 :          0 :                 push_items++;
    3907                 :          0 :                 push_space += this_item_size + sizeof(*item);
    3908                 :            :         }
    3909                 :            : 
    3910         [ #  # ]:          0 :         if (push_items == 0) {
    3911                 :            :                 ret = 1;
    3912                 :            :                 goto out;
    3913                 :            :         }
    3914   [ #  #  #  # ]:          0 :         WARN_ON(!empty && push_items == btrfs_header_nritems(right));
                 [ #  # ]
    3915                 :            : 
    3916                 :            :         /* push data from right to left */
    3917                 :          0 :         copy_extent_buffer(left, right,
    3918                 :            :                            btrfs_item_nr_offset(btrfs_header_nritems(left)),
    3919                 :            :                            btrfs_item_nr_offset(0),
    3920                 :          0 :                            push_items * sizeof(struct btrfs_item));
    3921                 :            : 
    3922                 :          0 :         push_space = BTRFS_LEAF_DATA_SIZE(root) -
    3923                 :          0 :                      btrfs_item_offset_nr(right, push_items - 1);
    3924                 :            : 
    3925                 :          0 :         copy_extent_buffer(left, right, btrfs_leaf_data(left) +
    3926                 :            :                      leaf_data_end(root, left) - push_space,
    3927                 :            :                      btrfs_leaf_data(right) +
    3928                 :            :                      btrfs_item_offset_nr(right, push_items - 1),
    3929                 :            :                      push_space);
    3930                 :            :         old_left_nritems = btrfs_header_nritems(left);
    3931         [ #  # ]:          0 :         BUG_ON(old_left_nritems <= 0);
    3932                 :            : 
    3933                 :          0 :         old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
    3934         [ #  # ]:          0 :         for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
    3935                 :            :                 u32 ioff;
    3936                 :            : 
    3937                 :            :                 item = btrfs_item_nr(i);
    3938                 :            : 
    3939                 :            :                 ioff = btrfs_token_item_offset(left, item, &token);
    3940                 :          0 :                 btrfs_set_token_item_offset(left, item,
    3941                 :          0 :                       ioff - (BTRFS_LEAF_DATA_SIZE(root) - old_left_item_size),
    3942                 :            :                       &token);
    3943                 :            :         }
    3944                 :            :         btrfs_set_header_nritems(left, old_left_nritems + push_items);
    3945                 :            : 
    3946                 :            :         /* fixup right node */
    3947         [ #  # ]:          0 :         if (push_items > right_nritems)
    3948                 :          0 :                 WARN(1, KERN_CRIT "push items %d nr %u\n", push_items,
    3949                 :            :                        right_nritems);
    3950                 :            : 
    3951         [ #  # ]:          0 :         if (push_items < right_nritems) {
    3952                 :          0 :                 push_space = btrfs_item_offset_nr(right, push_items - 1) -
    3953                 :            :                                                   leaf_data_end(root, right);
    3954                 :          0 :                 memmove_extent_buffer(right, btrfs_leaf_data(right) +
    3955                 :          0 :                                       BTRFS_LEAF_DATA_SIZE(root) - push_space,
    3956                 :            :                                       btrfs_leaf_data(right) +
    3957                 :            :                                       leaf_data_end(root, right), push_space);
    3958                 :            : 
    3959                 :          0 :                 memmove_extent_buffer(right, btrfs_item_nr_offset(0),
    3960                 :            :                               btrfs_item_nr_offset(push_items),
    3961                 :          0 :                              (btrfs_header_nritems(right) - push_items) *
    3962                 :            :                              sizeof(struct btrfs_item));
    3963                 :            :         }
    3964                 :          0 :         right_nritems -= push_items;
    3965                 :            :         btrfs_set_header_nritems(right, right_nritems);
    3966                 :          0 :         push_space = BTRFS_LEAF_DATA_SIZE(root);
    3967         [ #  # ]:          0 :         for (i = 0; i < right_nritems; i++) {
    3968                 :            :                 item = btrfs_item_nr(i);
    3969                 :            : 
    3970                 :          0 :                 push_space = push_space - btrfs_token_item_size(right,
    3971                 :            :                                                                 item, &token);
    3972                 :            :                 btrfs_set_token_item_offset(right, item, push_space, &token);
    3973                 :            :         }
    3974                 :            : 
    3975                 :          0 :         btrfs_mark_buffer_dirty(left);
    3976         [ #  # ]:          0 :         if (right_nritems)
    3977                 :          0 :                 btrfs_mark_buffer_dirty(right);
    3978                 :            :         else
    3979                 :          0 :                 clean_tree_block(trans, root, right);
    3980                 :            : 
    3981                 :            :         btrfs_item_key(right, &disk_key, 0);
    3982                 :          0 :         fixup_low_keys(root, path, &disk_key, 1);
    3983                 :            : 
    3984                 :            :         /* then fixup the leaf pointer in the path */
    3985         [ #  # ]:          0 :         if (path->slots[0] < push_items) {
    3986                 :          0 :                 path->slots[0] += old_left_nritems;
    3987                 :          0 :                 btrfs_tree_unlock(path->nodes[0]);
    3988                 :          0 :                 free_extent_buffer(path->nodes[0]);
    3989                 :          0 :                 path->nodes[0] = left;
    3990                 :          0 :                 path->slots[1] -= 1;
    3991                 :            :         } else {
    3992                 :          0 :                 btrfs_tree_unlock(left);
    3993                 :          0 :                 free_extent_buffer(left);
    3994                 :          0 :                 path->slots[0] -= push_items;
    3995                 :            :         }
    3996         [ #  # ]:          0 :         BUG_ON(path->slots[0] < 0);
    3997                 :            :         return ret;
    3998                 :            : out:
    3999                 :          0 :         btrfs_tree_unlock(left);
    4000                 :          0 :         free_extent_buffer(left);
    4001                 :          0 :         return ret;
    4002                 :            : }
    4003                 :            : 
    4004                 :            : /*
    4005                 :            :  * push some data in the path leaf to the left, trying to free up at
    4006                 :            :  * least data_size bytes.  returns zero if the push worked, nonzero otherwise
    4007                 :            :  *
    4008                 :            :  * max_slot can put a limit on how far into the leaf we'll push items.  The
    4009                 :            :  * item at 'max_slot' won't be touched.  Use (u32)-1 to make us push all the
    4010                 :            :  * items
    4011                 :            :  */
    4012                 :          0 : static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
    4013                 :            :                           *root, struct btrfs_path *path, int min_data_size,
    4014                 :            :                           int data_size, int empty, u32 max_slot)
    4015                 :            : {
    4016                 :          0 :         struct extent_buffer *right = path->nodes[0];
    4017                 :            :         struct extent_buffer *left;
    4018                 :            :         int slot;
    4019                 :            :         int free_space;
    4020                 :            :         u32 right_nritems;
    4021                 :            :         int ret = 0;
    4022                 :            : 
    4023                 :          0 :         slot = path->slots[1];
    4024         [ #  # ]:          0 :         if (slot == 0)
    4025                 :            :                 return 1;
    4026         [ #  # ]:          0 :         if (!path->nodes[1])
    4027                 :            :                 return 1;
    4028                 :            : 
    4029                 :            :         right_nritems = btrfs_header_nritems(right);
    4030         [ #  # ]:          0 :         if (right_nritems == 0)
    4031                 :            :                 return 1;
    4032                 :            : 
    4033                 :          0 :         btrfs_assert_tree_locked(path->nodes[1]);
    4034                 :            : 
    4035                 :          0 :         left = read_node_slot(root, path->nodes[1], slot - 1);
    4036         [ #  # ]:          0 :         if (left == NULL)
    4037                 :            :                 return 1;
    4038                 :            : 
    4039                 :          0 :         btrfs_tree_lock(left);
    4040                 :          0 :         btrfs_set_lock_blocking(left);
    4041                 :            : 
    4042                 :          0 :         free_space = btrfs_leaf_free_space(root, left);
    4043         [ #  # ]:          0 :         if (free_space < data_size) {
    4044                 :            :                 ret = 1;
    4045                 :            :                 goto out;
    4046                 :            :         }
    4047                 :            : 
    4048                 :            :         /* cow and double check */
    4049                 :          0 :         ret = btrfs_cow_block(trans, root, left,
    4050                 :            :                               path->nodes[1], slot - 1, &left);
    4051         [ #  # ]:          0 :         if (ret) {
    4052                 :            :                 /* we hit -ENOSPC, but it isn't fatal here */
    4053         [ #  # ]:          0 :                 if (ret == -ENOSPC)
    4054                 :            :                         ret = 1;
    4055                 :            :                 goto out;
    4056                 :            :         }
    4057                 :            : 
    4058                 :          0 :         free_space = btrfs_leaf_free_space(root, left);
    4059         [ #  # ]:          0 :         if (free_space < data_size) {
    4060                 :            :                 ret = 1;
    4061                 :            :                 goto out;
    4062                 :            :         }
    4063                 :            : 
    4064                 :          0 :         return __push_leaf_left(trans, root, path, min_data_size,
    4065                 :            :                                empty, left, free_space, right_nritems,
    4066                 :            :                                max_slot);
    4067                 :            : out:
    4068                 :          0 :         btrfs_tree_unlock(left);
    4069                 :          0 :         free_extent_buffer(left);
    4070                 :          0 :         return ret;
    4071                 :            : }
    4072                 :            : 
    4073                 :            : /*
    4074                 :            :  * split the path's leaf in two, making sure there is at least data_size
    4075                 :            :  * available for the resulting leaf level of the path.
    4076                 :            :  */
    4077                 :          0 : static noinline void copy_for_split(struct btrfs_trans_handle *trans,
    4078                 :            :                                     struct btrfs_root *root,
    4079                 :            :                                     struct btrfs_path *path,
    4080                 :          0 :                                     struct extent_buffer *l,
    4081                 :          0 :                                     struct extent_buffer *right,
    4082                 :            :                                     int slot, int mid, int nritems)
    4083                 :            : {
    4084                 :            :         int data_copy_size;
    4085                 :            :         int rt_data_off;
    4086                 :            :         int i;
    4087                 :            :         struct btrfs_disk_key disk_key;
    4088                 :            :         struct btrfs_map_token token;
    4089                 :            : 
    4090                 :            :         btrfs_init_map_token(&token);
    4091                 :            : 
    4092                 :          0 :         nritems = nritems - mid;
    4093                 :          0 :         btrfs_set_header_nritems(right, nritems);
    4094                 :          0 :         data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(root, l);
    4095                 :            : 
    4096                 :          0 :         copy_extent_buffer(right, l, btrfs_item_nr_offset(0),
    4097                 :            :                            btrfs_item_nr_offset(mid),
    4098                 :          0 :                            nritems * sizeof(struct btrfs_item));
    4099                 :            : 
    4100                 :          0 :         copy_extent_buffer(right, l,
    4101                 :          0 :                      btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
    4102                 :            :                      data_copy_size, btrfs_leaf_data(l) +
    4103                 :            :                      leaf_data_end(root, l), data_copy_size);
    4104                 :            : 
    4105                 :          0 :         rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
    4106                 :            :                       btrfs_item_end_nr(l, mid);
    4107                 :            : 
    4108         [ #  # ]:          0 :         for (i = 0; i < nritems; i++) {
    4109                 :            :                 struct btrfs_item *item = btrfs_item_nr(i);
    4110                 :            :                 u32 ioff;
    4111                 :            : 
    4112                 :            :                 ioff = btrfs_token_item_offset(right, item, &token);
    4113                 :          0 :                 btrfs_set_token_item_offset(right, item,
    4114                 :            :                                             ioff + rt_data_off, &token);
    4115                 :            :         }
    4116                 :            : 
    4117                 :            :         btrfs_set_header_nritems(l, mid);
    4118                 :            :         btrfs_item_key(right, &disk_key, 0);
    4119                 :          0 :         insert_ptr(trans, root, path, &disk_key, right->start,
    4120                 :          0 :                    path->slots[1] + 1, 1);
    4121                 :            : 
    4122                 :          0 :         btrfs_mark_buffer_dirty(right);
    4123                 :          0 :         btrfs_mark_buffer_dirty(l);
    4124         [ #  # ]:          0 :         BUG_ON(path->slots[0] != slot);
    4125                 :            : 
    4126         [ #  # ]:          0 :         if (mid <= slot) {
    4127                 :          0 :                 btrfs_tree_unlock(path->nodes[0]);
    4128                 :          0 :                 free_extent_buffer(path->nodes[0]);
    4129                 :          0 :                 path->nodes[0] = right;
    4130                 :          0 :                 path->slots[0] -= mid;
    4131                 :          0 :                 path->slots[1] += 1;
    4132                 :            :         } else {
    4133                 :          0 :                 btrfs_tree_unlock(right);
    4134                 :          0 :                 free_extent_buffer(right);
    4135                 :            :         }
    4136                 :            : 
    4137         [ #  # ]:          0 :         BUG_ON(path->slots[0] < 0);
    4138                 :          0 : }
    4139                 :            : 
    4140                 :            : /*
    4141                 :            :  * double splits happen when we need to insert a big item in the middle
    4142                 :            :  * of a leaf.  A double split can leave us with 3 mostly empty leaves:
    4143                 :            :  * leaf: [ slots 0 - N] [ our target ] [ N + 1 - total in leaf ]
    4144                 :            :  *          A                 B                 C
    4145                 :            :  *
    4146                 :            :  * We avoid this by trying to push the items on either side of our target
    4147                 :            :  * into the adjacent leaves.  If all goes well we can avoid the double split
    4148                 :            :  * completely.
    4149                 :            :  */
    4150                 :          0 : static noinline int push_for_double_split(struct btrfs_trans_handle *trans,
    4151                 :            :                                           struct btrfs_root *root,
    4152                 :            :                                           struct btrfs_path *path,
    4153                 :            :                                           int data_size)
    4154                 :            : {
    4155                 :            :         int ret;
    4156                 :            :         int progress = 0;
    4157                 :            :         int slot;
    4158                 :            :         u32 nritems;
    4159                 :            :         int space_needed = data_size;
    4160                 :            : 
    4161                 :          0 :         slot = path->slots[0];
    4162         [ #  # ]:          0 :         if (slot < btrfs_header_nritems(path->nodes[0]))
    4163                 :          0 :                 space_needed -= btrfs_leaf_free_space(root, path->nodes[0]);
    4164                 :            : 
    4165                 :            :         /*
    4166                 :            :          * try to push all the items after our slot into the
    4167                 :            :          * right leaf
    4168                 :            :          */
    4169                 :          0 :         ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot);
    4170         [ #  # ]:          0 :         if (ret < 0)
    4171                 :            :                 return ret;
    4172                 :            : 
    4173         [ #  # ]:          0 :         if (ret == 0)
    4174                 :            :                 progress++;
    4175                 :            : 
    4176                 :          0 :         nritems = btrfs_header_nritems(path->nodes[0]);
    4177                 :            :         /*
    4178                 :            :          * our goal is to get our slot at the start or end of a leaf.  If
    4179                 :            :          * we've done so we're done
    4180                 :            :          */
    4181 [ #  # ][ #  # ]:          0 :         if (path->slots[0] == 0 || path->slots[0] == nritems)
    4182                 :            :                 return 0;
    4183                 :            : 
    4184         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size)
    4185                 :            :                 return 0;
    4186                 :            : 
    4187                 :            :         /* try to push all the items before our slot into the next leaf */
    4188                 :          0 :         slot = path->slots[0];
    4189                 :          0 :         ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot);
    4190         [ #  # ]:          0 :         if (ret < 0)
    4191                 :            :                 return ret;
    4192                 :            : 
    4193         [ #  # ]:          0 :         if (ret == 0)
    4194                 :          0 :                 progress++;
    4195                 :            : 
    4196         [ #  # ]:          0 :         if (progress)
    4197                 :            :                 return 0;
    4198                 :          0 :         return 1;
    4199                 :            : }
    4200                 :            : 
    4201                 :            : /*
    4202                 :            :  * split the path's leaf in two, making sure there is at least data_size
    4203                 :            :  * available for the resulting leaf level of the path.
    4204                 :            :  *
    4205                 :            :  * returns 0 if all went well and < 0 on failure.
    4206                 :            :  */
    4207                 :          0 : static noinline int split_leaf(struct btrfs_trans_handle *trans,
    4208                 :            :                                struct btrfs_root *root,
    4209                 :            :                                struct btrfs_key *ins_key,
    4210                 :            :                                struct btrfs_path *path, int data_size,
    4211                 :            :                                int extend)
    4212                 :            : {
    4213                 :            :         struct btrfs_disk_key disk_key;
    4214                 :          0 :         struct extent_buffer *l;
    4215                 :            :         u32 nritems;
    4216                 :            :         int mid;
    4217                 :            :         int slot;
    4218                 :          0 :         struct extent_buffer *right;
    4219                 :            :         int ret = 0;
    4220                 :            :         int wret;
    4221                 :            :         int split;
    4222                 :            :         int num_doubles = 0;
    4223                 :            :         int tried_avoid_double = 0;
    4224                 :            : 
    4225                 :          0 :         l = path->nodes[0];
    4226                 :          0 :         slot = path->slots[0];
    4227   [ #  #  #  # ]:          0 :         if (extend && data_size + btrfs_item_size_nr(l, slot) +
    4228                 :          0 :             sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root))
    4229                 :            :                 return -EOVERFLOW;
    4230                 :            : 
    4231                 :            :         /* first try to make some room by pushing left and right */
    4232 [ #  # ][ #  # ]:          0 :         if (data_size && path->nodes[1]) {
    4233                 :            :                 int space_needed = data_size;
    4234                 :            : 
    4235         [ #  # ]:          0 :                 if (slot < btrfs_header_nritems(l))
    4236                 :          0 :                         space_needed -= btrfs_leaf_free_space(root, l);
    4237                 :            : 
    4238                 :          0 :                 wret = push_leaf_right(trans, root, path, space_needed,
    4239                 :            :                                        space_needed, 0, 0);
    4240         [ #  # ]:          0 :                 if (wret < 0)
    4241                 :            :                         return wret;
    4242         [ #  # ]:          0 :                 if (wret) {
    4243                 :          0 :                         wret = push_leaf_left(trans, root, path, space_needed,
    4244                 :            :                                               space_needed, 0, (u32)-1);
    4245         [ #  # ]:          0 :                         if (wret < 0)
    4246                 :            :                                 return wret;
    4247                 :            :                 }
    4248                 :          0 :                 l = path->nodes[0];
    4249                 :            : 
    4250                 :            :                 /* did the pushes work? */
    4251         [ #  # ]:          0 :                 if (btrfs_leaf_free_space(root, l) >= data_size)
    4252                 :            :                         return 0;
    4253                 :            :         }
    4254                 :            : 
    4255         [ #  # ]:          0 :         if (!path->nodes[1]) {
    4256                 :          0 :                 ret = insert_new_root(trans, root, path, 1);
    4257         [ #  # ]:          0 :                 if (ret)
    4258                 :            :                         return ret;
    4259                 :            :         }
    4260                 :            : again:
    4261                 :            :         split = 1;
    4262                 :          0 :         l = path->nodes[0];
    4263                 :          0 :         slot = path->slots[0];
    4264                 :            :         nritems = btrfs_header_nritems(l);
    4265                 :          0 :         mid = (nritems + 1) / 2;
    4266                 :            : 
    4267         [ #  # ]:          0 :         if (mid <= slot) {
    4268   [ #  #  #  # ]:          0 :                 if (nritems == 1 ||
    4269                 :          0 :                     leaf_space_used(l, mid, nritems - mid) + data_size >
    4270                 :          0 :                         BTRFS_LEAF_DATA_SIZE(root)) {
    4271         [ #  # ]:          0 :                         if (slot >= nritems) {
    4272                 :            :                                 split = 0;
    4273                 :            :                         } else {
    4274                 :            :                                 mid = slot;
    4275   [ #  #  #  # ]:          0 :                                 if (mid != nritems &&
    4276                 :          0 :                                     leaf_space_used(l, mid, nritems - mid) +
    4277                 :          0 :                                     data_size > BTRFS_LEAF_DATA_SIZE(root)) {
    4278         [ #  # ]:          0 :                                         if (data_size && !tried_avoid_double)
    4279                 :            :                                                 goto push_for_double;
    4280                 :            :                                         split = 2;
    4281                 :            :                                 }
    4282                 :            :                         }
    4283                 :            :                 }
    4284                 :            :         } else {
    4285         [ #  # ]:          0 :                 if (leaf_space_used(l, 0, mid) + data_size >
    4286                 :          0 :                         BTRFS_LEAF_DATA_SIZE(root)) {
    4287 [ #  # ][ #  # ]:          0 :                         if (!extend && data_size && slot == 0) {
    4288                 :            :                                 split = 0;
    4289 [ #  # ][ #  # ]:          0 :                         } else if ((extend || !data_size) && slot == 0) {
    4290                 :            :                                 mid = 1;
    4291                 :            :                         } else {
    4292                 :            :                                 mid = slot;
    4293   [ #  #  #  # ]:          0 :                                 if (mid != nritems &&
    4294                 :          0 :                                     leaf_space_used(l, mid, nritems - mid) +
    4295                 :          0 :                                     data_size > BTRFS_LEAF_DATA_SIZE(root)) {
    4296         [ #  # ]:          0 :                                         if (data_size && !tried_avoid_double)
    4297                 :            :                                                 goto push_for_double;
    4298                 :            :                                         split = 2;
    4299                 :            :                                 }
    4300                 :            :                         }
    4301                 :            :                 }
    4302                 :            :         }
    4303                 :            : 
    4304         [ #  # ]:          0 :         if (split == 0)
    4305                 :            :                 btrfs_cpu_key_to_disk(&disk_key, ins_key);
    4306                 :            :         else
    4307                 :            :                 btrfs_item_key(l, &disk_key, mid);
    4308                 :            : 
    4309                 :          0 :         right = btrfs_alloc_free_block(trans, root, root->leafsize, 0,
    4310                 :            :                                         root->root_key.objectid,
    4311                 :            :                                         &disk_key, 0, l->start, 0);
    4312         [ #  # ]:          0 :         if (IS_ERR(right))
    4313                 :          0 :                 return PTR_ERR(right);
    4314                 :            : 
    4315                 :          0 :         root_add_used(root, root->leafsize);
    4316                 :            : 
    4317                 :          0 :         memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
    4318                 :          0 :         btrfs_set_header_bytenr(right, right->start);
    4319                 :          0 :         btrfs_set_header_generation(right, trans->transid);
    4320                 :            :         btrfs_set_header_backref_rev(right, BTRFS_MIXED_BACKREF_REV);
    4321                 :          0 :         btrfs_set_header_owner(right, root->root_key.objectid);
    4322                 :            :         btrfs_set_header_level(right, 0);
    4323                 :          0 :         write_extent_buffer(right, root->fs_info->fsid,
    4324                 :            :                             btrfs_header_fsid(), BTRFS_FSID_SIZE);
    4325                 :            : 
    4326                 :          0 :         write_extent_buffer(right, root->fs_info->chunk_tree_uuid,
    4327                 :            :                             btrfs_header_chunk_tree_uuid(right),
    4328                 :            :                             BTRFS_UUID_SIZE);
    4329                 :            : 
    4330         [ #  # ]:          0 :         if (split == 0) {
    4331         [ #  # ]:          0 :                 if (mid <= slot) {
    4332                 :            :                         btrfs_set_header_nritems(right, 0);
    4333                 :          0 :                         insert_ptr(trans, root, path, &disk_key, right->start,
    4334                 :          0 :                                    path->slots[1] + 1, 1);
    4335                 :          0 :                         btrfs_tree_unlock(path->nodes[0]);
    4336                 :          0 :                         free_extent_buffer(path->nodes[0]);
    4337                 :          0 :                         path->nodes[0] = right;
    4338                 :          0 :                         path->slots[0] = 0;
    4339                 :          0 :                         path->slots[1] += 1;
    4340                 :            :                 } else {
    4341                 :            :                         btrfs_set_header_nritems(right, 0);
    4342                 :          0 :                         insert_ptr(trans, root, path, &disk_key, right->start,
    4343                 :            :                                           path->slots[1], 1);
    4344                 :          0 :                         btrfs_tree_unlock(path->nodes[0]);
    4345                 :          0 :                         free_extent_buffer(path->nodes[0]);
    4346                 :          0 :                         path->nodes[0] = right;
    4347                 :          0 :                         path->slots[0] = 0;
    4348         [ #  # ]:          0 :                         if (path->slots[1] == 0)
    4349                 :          0 :                                 fixup_low_keys(root, path, &disk_key, 1);
    4350                 :            :                 }
    4351                 :          0 :                 btrfs_mark_buffer_dirty(right);
    4352                 :          0 :                 return ret;
    4353                 :            :         }
    4354                 :            : 
    4355                 :          0 :         copy_for_split(trans, root, path, l, right, slot, mid, nritems);
    4356                 :            : 
    4357         [ #  # ]:          0 :         if (split == 2) {
    4358         [ #  # ]:          0 :                 BUG_ON(num_doubles != 0);
    4359                 :          0 :                 num_doubles++;
    4360                 :          0 :                 goto again;
    4361                 :            :         }
    4362                 :            : 
    4363                 :            :         return 0;
    4364                 :            : 
    4365                 :            : push_for_double:
    4366                 :          0 :         push_for_double_split(trans, root, path, data_size);
    4367                 :            :         tried_avoid_double = 1;
    4368         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size)
    4369                 :            :                 return 0;
    4370                 :            :         goto again;
    4371                 :            : }
    4372                 :            : 
    4373                 :          0 : static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans,
    4374                 :            :                                          struct btrfs_root *root,
    4375                 :            :                                          struct btrfs_path *path, int ins_len)
    4376                 :            : {
    4377                 :            :         struct btrfs_key key;
    4378                 :            :         struct extent_buffer *leaf;
    4379                 :            :         struct btrfs_file_extent_item *fi;
    4380                 :            :         u64 extent_len = 0;
    4381                 :            :         u32 item_size;
    4382                 :            :         int ret;
    4383                 :            : 
    4384                 :          0 :         leaf = path->nodes[0];
    4385                 :          0 :         btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
    4386                 :            : 
    4387         [ #  # ]:          0 :         BUG_ON(key.type != BTRFS_EXTENT_DATA_KEY &&
    4388                 :            :                key.type != BTRFS_EXTENT_CSUM_KEY);
    4389                 :            : 
    4390         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) >= ins_len)
    4391                 :            :                 return 0;
    4392                 :            : 
    4393                 :          0 :         item_size = btrfs_item_size_nr(leaf, path->slots[0]);
    4394         [ #  # ]:          0 :         if (key.type == BTRFS_EXTENT_DATA_KEY) {
    4395                 :          0 :                 fi = btrfs_item_ptr(leaf, path->slots[0],
    4396                 :            :                                     struct btrfs_file_extent_item);
    4397                 :            :                 extent_len = btrfs_file_extent_num_bytes(leaf, fi);
    4398                 :            :         }
    4399                 :          0 :         btrfs_release_path(path);
    4400                 :            : 
    4401                 :          0 :         path->keep_locks = 1;
    4402                 :          0 :         path->search_for_split = 1;
    4403                 :          0 :         ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
    4404                 :          0 :         path->search_for_split = 0;
    4405         [ #  # ]:          0 :         if (ret < 0)
    4406                 :            :                 goto err;
    4407                 :            : 
    4408                 :            :         ret = -EAGAIN;
    4409                 :          0 :         leaf = path->nodes[0];
    4410                 :            :         /* if our item isn't there or got smaller, return now */
    4411         [ #  # ]:          0 :         if (ret > 0 || item_size != btrfs_item_size_nr(leaf, path->slots[0]))
    4412                 :            :                 goto err;
    4413                 :            : 
    4414                 :            :         /* the leaf has  changed, it now has room.  return now */
    4415         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, path->nodes[0]) >= ins_len)
    4416                 :            :                 goto err;
    4417                 :            : 
    4418         [ #  # ]:          0 :         if (key.type == BTRFS_EXTENT_DATA_KEY) {
    4419                 :          0 :                 fi = btrfs_item_ptr(leaf, path->slots[0],
    4420                 :            :                                     struct btrfs_file_extent_item);
    4421         [ #  # ]:          0 :                 if (extent_len != btrfs_file_extent_num_bytes(leaf, fi))
    4422                 :            :                         goto err;
    4423                 :            :         }
    4424                 :            : 
    4425                 :          0 :         btrfs_set_path_blocking(path);
    4426                 :          0 :         ret = split_leaf(trans, root, &key, path, ins_len, 1);
    4427         [ #  # ]:          0 :         if (ret)
    4428                 :            :                 goto err;
    4429                 :            : 
    4430                 :          0 :         path->keep_locks = 0;
    4431                 :          0 :         btrfs_unlock_up_safe(path, 1);
    4432                 :          0 :         return 0;
    4433                 :            : err:
    4434                 :          0 :         path->keep_locks = 0;
    4435                 :          0 :         return ret;
    4436                 :            : }
    4437                 :            : 
    4438                 :          0 : static noinline int split_item(struct btrfs_trans_handle *trans,
    4439                 :            :                                struct btrfs_root *root,
    4440                 :            :                                struct btrfs_path *path,
    4441                 :            :                                struct btrfs_key *new_key,
    4442                 :            :                                unsigned long split_offset)
    4443                 :            : {
    4444                 :          0 :         struct extent_buffer *leaf;
    4445                 :            :         struct btrfs_item *item;
    4446                 :            :         struct btrfs_item *new_item;
    4447                 :            :         int slot;
    4448                 :            :         char *buf;
    4449                 :            :         u32 nritems;
    4450                 :            :         u32 item_size;
    4451                 :            :         u32 orig_offset;
    4452                 :            :         struct btrfs_disk_key disk_key;
    4453                 :            : 
    4454                 :          0 :         leaf = path->nodes[0];
    4455         [ #  # ]:          0 :         BUG_ON(btrfs_leaf_free_space(root, leaf) < sizeof(struct btrfs_item));
    4456                 :            : 
    4457                 :          0 :         btrfs_set_path_blocking(path);
    4458                 :            : 
    4459                 :          0 :         item = btrfs_item_nr(path->slots[0]);
    4460                 :            :         orig_offset = btrfs_item_offset(leaf, item);
    4461                 :            :         item_size = btrfs_item_size(leaf, item);
    4462                 :            : 
    4463                 :            :         buf = kmalloc(item_size, GFP_NOFS);
    4464         [ #  # ]:          0 :         if (!buf)
    4465                 :            :                 return -ENOMEM;
    4466                 :            : 
    4467                 :          0 :         read_extent_buffer(leaf, buf, btrfs_item_ptr_offset(leaf,
    4468                 :            :                             path->slots[0]), item_size);
    4469                 :            : 
    4470                 :          0 :         slot = path->slots[0] + 1;
    4471                 :            :         nritems = btrfs_header_nritems(leaf);
    4472         [ #  # ]:          0 :         if (slot != nritems) {
    4473                 :            :                 /* shift the items */
    4474                 :          0 :                 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + 1),
    4475                 :            :                                 btrfs_item_nr_offset(slot),
    4476                 :          0 :                                 (nritems - slot) * sizeof(struct btrfs_item));
    4477                 :            :         }
    4478                 :            : 
    4479                 :            :         btrfs_cpu_key_to_disk(&disk_key, new_key);
    4480                 :            :         btrfs_set_item_key(leaf, &disk_key, slot);
    4481                 :            : 
    4482                 :            :         new_item = btrfs_item_nr(slot);
    4483                 :            : 
    4484                 :            :         btrfs_set_item_offset(leaf, new_item, orig_offset);
    4485                 :          0 :         btrfs_set_item_size(leaf, new_item, item_size - split_offset);
    4486                 :            : 
    4487                 :            :         btrfs_set_item_offset(leaf, item,
    4488                 :          0 :                               orig_offset + item_size - split_offset);
    4489                 :            :         btrfs_set_item_size(leaf, item, split_offset);
    4490                 :            : 
    4491                 :          0 :         btrfs_set_header_nritems(leaf, nritems + 1);
    4492                 :            : 
    4493                 :            :         /* write the data for the start of the original item */
    4494                 :          0 :         write_extent_buffer(leaf, buf,
    4495                 :          0 :                             btrfs_item_ptr_offset(leaf, path->slots[0]),
    4496                 :            :                             split_offset);
    4497                 :            : 
    4498                 :            :         /* write the data for the new item */
    4499                 :          0 :         write_extent_buffer(leaf, buf + split_offset,
    4500                 :            :                             btrfs_item_ptr_offset(leaf, slot),
    4501                 :            :                             item_size - split_offset);
    4502                 :          0 :         btrfs_mark_buffer_dirty(leaf);
    4503                 :            : 
    4504         [ #  # ]:          0 :         BUG_ON(btrfs_leaf_free_space(root, leaf) < 0);
    4505                 :          0 :         kfree(buf);
    4506                 :            :         return 0;
    4507                 :            : }
    4508                 :            : 
    4509                 :            : /*
    4510                 :            :  * This function splits a single item into two items,
    4511                 :            :  * giving 'new_key' to the new item and splitting the
    4512                 :            :  * old one at split_offset (from the start of the item).
    4513                 :            :  *
    4514                 :            :  * The path may be released by this operation.  After
    4515                 :            :  * the split, the path is pointing to the old item.  The
    4516                 :            :  * new item is going to be in the same node as the old one.
    4517                 :            :  *
    4518                 :            :  * Note, the item being split must be smaller enough to live alone on
    4519                 :            :  * a tree block with room for one extra struct btrfs_item
    4520                 :            :  *
    4521                 :            :  * This allows us to split the item in place, keeping a lock on the
    4522                 :            :  * leaf the entire time.
    4523                 :            :  */
    4524                 :          0 : int btrfs_split_item(struct btrfs_trans_handle *trans,
    4525                 :            :                      struct btrfs_root *root,
    4526                 :            :                      struct btrfs_path *path,
    4527                 :            :                      struct btrfs_key *new_key,
    4528                 :            :                      unsigned long split_offset)
    4529                 :            : {
    4530                 :            :         int ret;
    4531                 :          0 :         ret = setup_leaf_for_split(trans, root, path,
    4532                 :            :                                    sizeof(struct btrfs_item));
    4533         [ #  # ]:          0 :         if (ret)
    4534                 :            :                 return ret;
    4535                 :            : 
    4536                 :          0 :         ret = split_item(trans, root, path, new_key, split_offset);
    4537                 :          0 :         return ret;
    4538                 :            : }
    4539                 :            : 
    4540                 :            : /*
    4541                 :            :  * This function duplicate a item, giving 'new_key' to the new item.
    4542                 :            :  * It guarantees both items live in the same tree leaf and the new item
    4543                 :            :  * is contiguous with the original item.
    4544                 :            :  *
    4545                 :            :  * This allows us to split file extent in place, keeping a lock on the
    4546                 :            :  * leaf the entire time.
    4547                 :            :  */
    4548                 :          0 : int btrfs_duplicate_item(struct btrfs_trans_handle *trans,
    4549                 :            :                          struct btrfs_root *root,
    4550                 :            :                          struct btrfs_path *path,
    4551                 :            :                          struct btrfs_key *new_key)
    4552                 :            : {
    4553                 :            :         struct extent_buffer *leaf;
    4554                 :            :         int ret;
    4555                 :            :         u32 item_size;
    4556                 :            : 
    4557                 :          0 :         leaf = path->nodes[0];
    4558                 :          0 :         item_size = btrfs_item_size_nr(leaf, path->slots[0]);
    4559                 :          0 :         ret = setup_leaf_for_split(trans, root, path,
    4560                 :          0 :                                    item_size + sizeof(struct btrfs_item));
    4561         [ #  # ]:          0 :         if (ret)
    4562                 :            :                 return ret;
    4563                 :            : 
    4564                 :          0 :         path->slots[0]++;
    4565                 :          0 :         setup_items_for_insert(root, path, new_key, &item_size,
    4566                 :            :                                item_size, item_size +
    4567                 :            :                                sizeof(struct btrfs_item), 1);
    4568                 :          0 :         leaf = path->nodes[0];
    4569                 :          0 :         memcpy_extent_buffer(leaf,
    4570                 :          0 :                              btrfs_item_ptr_offset(leaf, path->slots[0]),
    4571                 :          0 :                              btrfs_item_ptr_offset(leaf, path->slots[0] - 1),
    4572                 :            :                              item_size);
    4573                 :          0 :         return 0;
    4574                 :            : }
    4575                 :            : 
    4576                 :            : /*
    4577                 :            :  * make the item pointed to by the path smaller.  new_size indicates
    4578                 :            :  * how small to make it, and from_end tells us if we just chop bytes
    4579                 :            :  * off the end of the item or if we shift the item to chop bytes off
    4580                 :            :  * the front.
    4581                 :            :  */
    4582                 :          0 : void btrfs_truncate_item(struct btrfs_root *root, struct btrfs_path *path,
    4583                 :            :                          u32 new_size, int from_end)
    4584                 :            : {
    4585                 :            :         int slot;
    4586                 :          0 :         struct extent_buffer *leaf;
    4587                 :            :         struct btrfs_item *item;
    4588                 :            :         u32 nritems;
    4589                 :            :         unsigned int data_end;
    4590                 :            :         unsigned int old_data_start;
    4591                 :            :         unsigned int old_size;
    4592                 :            :         unsigned int size_diff;
    4593                 :            :         int i;
    4594                 :            :         struct btrfs_map_token token;
    4595                 :            : 
    4596                 :            :         btrfs_init_map_token(&token);
    4597                 :            : 
    4598                 :          0 :         leaf = path->nodes[0];
    4599                 :          0 :         slot = path->slots[0];
    4600                 :            : 
    4601                 :            :         old_size = btrfs_item_size_nr(leaf, slot);
    4602         [ #  # ]:          0 :         if (old_size == new_size)
    4603                 :          0 :                 return;
    4604                 :            : 
    4605                 :            :         nritems = btrfs_header_nritems(leaf);
    4606                 :            :         data_end = leaf_data_end(root, leaf);
    4607                 :            : 
    4608                 :            :         old_data_start = btrfs_item_offset_nr(leaf, slot);
    4609                 :            : 
    4610                 :          0 :         size_diff = old_size - new_size;
    4611                 :            : 
    4612         [ #  # ]:          0 :         BUG_ON(slot < 0);
    4613         [ #  # ]:          0 :         BUG_ON(slot >= nritems);
    4614                 :            : 
    4615                 :            :         /*
    4616                 :            :          * item0..itemN ... dataN.offset..dataN.size .. data0.size
    4617                 :            :          */
    4618                 :            :         /* first correct the data pointers */
    4619         [ #  # ]:          0 :         for (i = slot; i < nritems; i++) {
    4620                 :            :                 u32 ioff;
    4621                 :            :                 item = btrfs_item_nr(i);
    4622                 :            : 
    4623                 :            :                 ioff = btrfs_token_item_offset(leaf, item, &token);
    4624                 :          0 :                 btrfs_set_token_item_offset(leaf, item,
    4625                 :            :                                             ioff + size_diff, &token);
    4626                 :            :         }
    4627                 :            : 
    4628                 :            :         /* shift the data */
    4629         [ #  # ]:          0 :         if (from_end) {
    4630                 :          0 :                 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
    4631                 :            :                               data_end + size_diff, btrfs_leaf_data(leaf) +
    4632                 :          0 :                               data_end, old_data_start + new_size - data_end);
    4633                 :            :         } else {
    4634                 :            :                 struct btrfs_disk_key disk_key;
    4635                 :            :                 u64 offset;
    4636                 :            : 
    4637                 :            :                 btrfs_item_key(leaf, &disk_key, slot);
    4638                 :            : 
    4639         [ #  # ]:          0 :                 if (btrfs_disk_key_type(&disk_key) == BTRFS_EXTENT_DATA_KEY) {
    4640                 :            :                         unsigned long ptr;
    4641                 :            :                         struct btrfs_file_extent_item *fi;
    4642                 :            : 
    4643                 :          0 :                         fi = btrfs_item_ptr(leaf, slot,
    4644                 :            :                                             struct btrfs_file_extent_item);
    4645                 :          0 :                         fi = (struct btrfs_file_extent_item *)(
    4646                 :          0 :                              (unsigned long)fi - size_diff);
    4647                 :            : 
    4648         [ #  # ]:          0 :                         if (btrfs_file_extent_type(leaf, fi) ==
    4649                 :            :                             BTRFS_FILE_EXTENT_INLINE) {
    4650                 :          0 :                                 ptr = btrfs_item_ptr_offset(leaf, slot);
    4651                 :          0 :                                 memmove_extent_buffer(leaf, ptr,
    4652                 :            :                                       (unsigned long)fi,
    4653                 :            :                                       offsetof(struct btrfs_file_extent_item,
    4654                 :            :                                                  disk_bytenr));
    4655                 :            :                         }
    4656                 :            :                 }
    4657                 :            : 
    4658                 :          0 :                 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
    4659                 :            :                               data_end + size_diff, btrfs_leaf_data(leaf) +
    4660                 :          0 :                               data_end, old_data_start - data_end);
    4661                 :            : 
    4662                 :            :                 offset = btrfs_disk_key_offset(&disk_key);
    4663                 :          0 :                 btrfs_set_disk_key_offset(&disk_key, offset + size_diff);
    4664                 :            :                 btrfs_set_item_key(leaf, &disk_key, slot);
    4665         [ #  # ]:          0 :                 if (slot == 0)
    4666                 :          0 :                         fixup_low_keys(root, path, &disk_key, 1);
    4667                 :            :         }
    4668                 :            : 
    4669                 :            :         item = btrfs_item_nr(slot);
    4670                 :            :         btrfs_set_item_size(leaf, item, new_size);
    4671                 :          0 :         btrfs_mark_buffer_dirty(leaf);
    4672                 :            : 
    4673         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) < 0) {
    4674                 :          0 :                 btrfs_print_leaf(root, leaf);
    4675                 :          0 :                 BUG();
    4676                 :            :         }
    4677                 :            : }
    4678                 :            : 
    4679                 :            : /*
    4680                 :            :  * make the item pointed to by the path bigger, data_size is the added size.
    4681                 :            :  */
    4682                 :          0 : void btrfs_extend_item(struct btrfs_root *root, struct btrfs_path *path,
    4683                 :            :                        u32 data_size)
    4684                 :            : {
    4685                 :            :         int slot;
    4686                 :          0 :         struct extent_buffer *leaf;
    4687                 :            :         struct btrfs_item *item;
    4688                 :            :         u32 nritems;
    4689                 :            :         unsigned int data_end;
    4690                 :            :         unsigned int old_data;
    4691                 :            :         unsigned int old_size;
    4692                 :            :         int i;
    4693                 :            :         struct btrfs_map_token token;
    4694                 :            : 
    4695                 :            :         btrfs_init_map_token(&token);
    4696                 :            : 
    4697                 :          0 :         leaf = path->nodes[0];
    4698                 :            : 
    4699                 :            :         nritems = btrfs_header_nritems(leaf);
    4700                 :            :         data_end = leaf_data_end(root, leaf);
    4701                 :            : 
    4702         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) < data_size) {
    4703                 :          0 :                 btrfs_print_leaf(root, leaf);
    4704                 :          0 :                 BUG();
    4705                 :            :         }
    4706                 :          0 :         slot = path->slots[0];
    4707                 :            :         old_data = btrfs_item_end_nr(leaf, slot);
    4708                 :            : 
    4709         [ #  # ]:          0 :         BUG_ON(slot < 0);
    4710         [ #  # ]:          0 :         if (slot >= nritems) {
    4711                 :          0 :                 btrfs_print_leaf(root, leaf);
    4712                 :          0 :                 btrfs_crit(root->fs_info, "slot %d too large, nritems %d",
    4713                 :            :                        slot, nritems);
    4714                 :          0 :                 BUG_ON(1);
    4715                 :            :         }
    4716                 :            : 
    4717                 :            :         /*
    4718                 :            :          * item0..itemN ... dataN.offset..dataN.size .. data0.size
    4719                 :            :          */
    4720                 :            :         /* first correct the data pointers */
    4721         [ #  # ]:          0 :         for (i = slot; i < nritems; i++) {
    4722                 :            :                 u32 ioff;
    4723                 :            :                 item = btrfs_item_nr(i);
    4724                 :            : 
    4725                 :            :                 ioff = btrfs_token_item_offset(leaf, item, &token);
    4726                 :          0 :                 btrfs_set_token_item_offset(leaf, item,
    4727                 :            :                                             ioff - data_size, &token);
    4728                 :            :         }
    4729                 :            : 
    4730                 :            :         /* shift the data */
    4731                 :          0 :         memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
    4732                 :            :                       data_end - data_size, btrfs_leaf_data(leaf) +
    4733                 :          0 :                       data_end, old_data - data_end);
    4734                 :            : 
    4735                 :            :         data_end = old_data;
    4736                 :            :         old_size = btrfs_item_size_nr(leaf, slot);
    4737                 :            :         item = btrfs_item_nr(slot);
    4738                 :          0 :         btrfs_set_item_size(leaf, item, old_size + data_size);
    4739                 :          0 :         btrfs_mark_buffer_dirty(leaf);
    4740                 :            : 
    4741         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) < 0) {
    4742                 :          0 :                 btrfs_print_leaf(root, leaf);
    4743                 :          0 :                 BUG();
    4744                 :            :         }
    4745                 :          0 : }
    4746                 :            : 
    4747                 :            : /*
    4748                 :            :  * this is a helper for btrfs_insert_empty_items, the main goal here is
    4749                 :            :  * to save stack depth by doing the bulk of the work in a function
    4750                 :            :  * that doesn't call btrfs_search_slot
    4751                 :            :  */
    4752                 :          0 : void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
    4753                 :            :                             struct btrfs_key *cpu_key, u32 *data_size,
    4754                 :            :                             u32 total_data, u32 total_size, int nr)
    4755                 :            : {
    4756                 :            :         struct btrfs_item *item;
    4757                 :            :         int i;
    4758                 :            :         u32 nritems;
    4759                 :            :         unsigned int data_end;
    4760                 :            :         struct btrfs_disk_key disk_key;
    4761                 :          0 :         struct extent_buffer *leaf;
    4762                 :            :         int slot;
    4763                 :            :         struct btrfs_map_token token;
    4764                 :            : 
    4765                 :            :         btrfs_init_map_token(&token);
    4766                 :            : 
    4767                 :          0 :         leaf = path->nodes[0];
    4768                 :          0 :         slot = path->slots[0];
    4769                 :            : 
    4770                 :            :         nritems = btrfs_header_nritems(leaf);
    4771                 :            :         data_end = leaf_data_end(root, leaf);
    4772                 :            : 
    4773         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) < total_size) {
    4774                 :          0 :                 btrfs_print_leaf(root, leaf);
    4775                 :          0 :                 btrfs_crit(root->fs_info, "not enough freespace need %u have %d",
    4776                 :            :                        total_size, btrfs_leaf_free_space(root, leaf));
    4777                 :          0 :                 BUG();
    4778                 :            :         }
    4779                 :            : 
    4780         [ #  # ]:          0 :         if (slot != nritems) {
    4781                 :            :                 unsigned int old_data = btrfs_item_end_nr(leaf, slot);
    4782                 :            : 
    4783         [ #  # ]:          0 :                 if (old_data < data_end) {
    4784                 :          0 :                         btrfs_print_leaf(root, leaf);
    4785                 :          0 :                         btrfs_crit(root->fs_info, "slot %d old_data %d data_end %d",
    4786                 :            :                                slot, old_data, data_end);
    4787                 :          0 :                         BUG_ON(1);
    4788                 :            :                 }
    4789                 :            :                 /*
    4790                 :            :                  * item0..itemN ... dataN.offset..dataN.size .. data0.size
    4791                 :            :                  */
    4792                 :            :                 /* first correct the data pointers */
    4793         [ #  # ]:          0 :                 for (i = slot; i < nritems; i++) {
    4794                 :            :                         u32 ioff;
    4795                 :            : 
    4796                 :            :                         item = btrfs_item_nr( i);
    4797                 :            :                         ioff = btrfs_token_item_offset(leaf, item, &token);
    4798                 :          0 :                         btrfs_set_token_item_offset(leaf, item,
    4799                 :            :                                                     ioff - total_data, &token);
    4800                 :            :                 }
    4801                 :            :                 /* shift the items */
    4802                 :          0 :                 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr),
    4803                 :            :                               btrfs_item_nr_offset(slot),
    4804                 :          0 :                               (nritems - slot) * sizeof(struct btrfs_item));
    4805                 :            : 
    4806                 :            :                 /* shift the data */
    4807                 :          0 :                 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
    4808                 :            :                               data_end - total_data, btrfs_leaf_data(leaf) +
    4809                 :          0 :                               data_end, old_data - data_end);
    4810                 :            :                 data_end = old_data;
    4811                 :            :         }
    4812                 :            : 
    4813                 :            :         /* setup the item for the new data */
    4814         [ #  # ]:          0 :         for (i = 0; i < nr; i++) {
    4815                 :          0 :                 btrfs_cpu_key_to_disk(&disk_key, cpu_key + i);
    4816                 :          0 :                 btrfs_set_item_key(leaf, &disk_key, slot + i);
    4817                 :            :                 item = btrfs_item_nr(slot + i);
    4818                 :          0 :                 btrfs_set_token_item_offset(leaf, item,
    4819                 :          0 :                                             data_end - data_size[i], &token);
    4820                 :          0 :                 data_end -= data_size[i];
    4821                 :            :                 btrfs_set_token_item_size(leaf, item, data_size[i], &token);
    4822                 :            :         }
    4823                 :            : 
    4824                 :          0 :         btrfs_set_header_nritems(leaf, nritems + nr);
    4825                 :            : 
    4826         [ #  # ]:          0 :         if (slot == 0) {
    4827                 :            :                 btrfs_cpu_key_to_disk(&disk_key, cpu_key);
    4828                 :          0 :                 fixup_low_keys(root, path, &disk_key, 1);
    4829                 :            :         }
    4830                 :          0 :         btrfs_unlock_up_safe(path, 1);
    4831                 :          0 :         btrfs_mark_buffer_dirty(leaf);
    4832                 :            : 
    4833         [ #  # ]:          0 :         if (btrfs_leaf_free_space(root, leaf) < 0) {
    4834                 :          0 :                 btrfs_print_leaf(root, leaf);
    4835                 :          0 :                 BUG();
    4836                 :            :         }
    4837                 :          0 : }
    4838                 :            : 
    4839                 :            : /*
    4840                 :            :  * Given a key and some data, insert items into the tree.
    4841                 :            :  * This does all the path init required, making room in the tree if needed.
    4842                 :            :  */
    4843                 :          0 : int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
    4844                 :            :                             struct btrfs_root *root,
    4845                 :            :                             struct btrfs_path *path,
    4846                 :            :                             struct btrfs_key *cpu_key, u32 *data_size,
    4847                 :            :                             int nr)
    4848                 :            : {
    4849                 :            :         int ret = 0;
    4850                 :            :         int slot;
    4851                 :            :         int i;
    4852                 :            :         u32 total_size = 0;
    4853                 :            :         u32 total_data = 0;
    4854                 :            : 
    4855         [ #  # ]:          0 :         for (i = 0; i < nr; i++)
    4856                 :          0 :                 total_data += data_size[i];
    4857                 :            : 
    4858                 :          0 :         total_size = total_data + (nr * sizeof(struct btrfs_item));
    4859                 :          0 :         ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1);
    4860         [ #  # ]:          0 :         if (ret == 0)
    4861                 :            :                 return -EEXIST;
    4862         [ #  # ]:          0 :         if (ret < 0)
    4863                 :            :                 return ret;
    4864                 :            : 
    4865                 :          0 :         slot = path->slots[0];
    4866         [ #  # ]:          0 :         BUG_ON(slot < 0);
    4867                 :            : 
    4868                 :          0 :         setup_items_for_insert(root, path, cpu_key, data_size,
    4869                 :            :                                total_data, total_size, nr);
    4870                 :          0 :         return 0;
    4871                 :            : }
    4872                 :            : 
    4873                 :            : /*
    4874                 :            :  * Given a key and some data, insert an item into the tree.
    4875                 :            :  * This does all the path init required, making room in the tree if needed.
    4876                 :            :  */
    4877                 :          0 : int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
    4878                 :            :                       *root, struct btrfs_key *cpu_key, void *data, u32
    4879                 :            :                       data_size)
    4880                 :            : {
    4881                 :            :         int ret = 0;
    4882                 :            :         struct btrfs_path *path;
    4883                 :            :         struct extent_buffer *leaf;
    4884                 :            :         unsigned long ptr;
    4885                 :            : 
    4886                 :            :         path = btrfs_alloc_path();
    4887         [ #  # ]:          0 :         if (!path)
    4888                 :            :                 return -ENOMEM;
    4889                 :            :         ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
    4890         [ #  # ]:          0 :         if (!ret) {
    4891                 :          0 :                 leaf = path->nodes[0];
    4892                 :          0 :                 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
    4893                 :          0 :                 write_extent_buffer(leaf, data, ptr, data_size);
    4894                 :          0 :                 btrfs_mark_buffer_dirty(leaf);
    4895                 :            :         }
    4896                 :          0 :         btrfs_free_path(path);
    4897                 :          0 :         return ret;
    4898                 :            : }
    4899                 :            : 
    4900                 :            : /*
    4901                 :            :  * delete the pointer from a given node.
    4902                 :            :  *
    4903                 :            :  * the tree should have been previously balanced so the deletion does not
    4904                 :            :  * empty a node.
    4905                 :            :  */
    4906                 :          0 : static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
    4907                 :            :                     int level, int slot)
    4908                 :            : {
    4909                 :          0 :         struct extent_buffer *parent = path->nodes[level];
    4910                 :            :         u32 nritems;
    4911                 :            :         int ret;
    4912                 :            : 
    4913                 :            :         nritems = btrfs_header_nritems(parent);
    4914         [ #  # ]:          0 :         if (slot != nritems - 1) {
    4915         [ #  # ]:          0 :                 if (level)
    4916                 :          0 :                         tree_mod_log_eb_move(root->fs_info, parent, slot,
    4917                 :          0 :                                              slot + 1, nritems - slot - 1);
    4918                 :          0 :                 memmove_extent_buffer(parent,
    4919                 :            :                               btrfs_node_key_ptr_offset(slot),
    4920                 :            :                               btrfs_node_key_ptr_offset(slot + 1),
    4921                 :            :                               sizeof(struct btrfs_key_ptr) *
    4922                 :          0 :                               (nritems - slot - 1));
    4923         [ #  # ]:          0 :         } else if (level) {
    4924                 :          0 :                 ret = tree_mod_log_insert_key(root->fs_info, parent, slot,
    4925                 :            :                                               MOD_LOG_KEY_REMOVE, GFP_NOFS);
    4926         [ #  # ]:          0 :                 BUG_ON(ret < 0);
    4927                 :            :         }
    4928                 :            : 
    4929                 :            :         nritems--;
    4930                 :            :         btrfs_set_header_nritems(parent, nritems);
    4931 [ #  # ][ #  # ]:          0 :         if (nritems == 0 && parent == root->node) {
    4932         [ #  # ]:          0 :                 BUG_ON(btrfs_header_level(root->node) != 1);
    4933                 :            :                 /* just turn the root into a leaf and break */
    4934                 :          0 :                 btrfs_set_header_level(root->node, 0);
    4935         [ #  # ]:          0 :         } else if (slot == 0) {
    4936                 :            :                 struct btrfs_disk_key disk_key;
    4937                 :            : 
    4938                 :          0 :                 btrfs_node_key(parent, &disk_key, 0);
    4939                 :          0 :                 fixup_low_keys(root, path, &disk_key, level + 1);
    4940                 :            :         }
    4941                 :          0 :         btrfs_mark_buffer_dirty(parent);
    4942                 :          0 : }
    4943                 :            : 
    4944                 :            : /*
    4945                 :            :  * a helper function to delete the leaf pointed to by path->slots[1] and
    4946                 :            :  * path->nodes[1].
    4947                 :            :  *
    4948                 :            :  * This deletes the pointer in path->nodes[1] and frees the leaf
    4949                 :            :  * block extent.  zero is returned if it all worked out, < 0 otherwise.
    4950                 :            :  *
    4951                 :            :  * The path must have already been setup for deleting the leaf, including
    4952                 :            :  * all the proper balancing.  path->nodes[1] must be locked.
    4953                 :            :  */
    4954                 :          0 : static noinline void btrfs_del_leaf(struct btrfs_trans_handle *trans,
    4955                 :            :                                     struct btrfs_root *root,
    4956                 :            :                                     struct btrfs_path *path,
    4957                 :          0 :                                     struct extent_buffer *leaf)
    4958                 :            : {
    4959         [ #  # ]:          0 :         WARN_ON(btrfs_header_generation(leaf) != trans->transid);
    4960                 :          0 :         del_ptr(root, path, 1, path->slots[1]);
    4961                 :            : 
    4962                 :            :         /*
    4963                 :            :          * btrfs_free_extent is expensive, we want to make sure we
    4964                 :            :          * aren't holding any locks when we call it
    4965                 :            :          */
    4966                 :          0 :         btrfs_unlock_up_safe(path, 0);
    4967                 :            : 
    4968                 :          0 :         root_sub_used(root, leaf->len);
    4969                 :            : 
    4970                 :            :         extent_buffer_get(leaf);
    4971                 :          0 :         btrfs_free_tree_block(trans, root, leaf, 0, 1);
    4972                 :          0 :         free_extent_buffer_stale(leaf);
    4973                 :          0 : }
    4974                 :            : /*
    4975                 :            :  * delete the item at the leaf level in path.  If that empties
    4976                 :            :  * the leaf, remove it from the tree
    4977                 :            :  */
    4978                 :          0 : int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
    4979                 :            :                     struct btrfs_path *path, int slot, int nr)
    4980                 :            : {
    4981                 :          0 :         struct extent_buffer *leaf;
    4982                 :            :         struct btrfs_item *item;
    4983                 :            :         int last_off;
    4984                 :            :         int dsize = 0;
    4985                 :            :         int ret = 0;
    4986                 :            :         int wret;
    4987                 :            :         int i;
    4988                 :            :         u32 nritems;
    4989                 :            :         struct btrfs_map_token token;
    4990                 :            : 
    4991                 :            :         btrfs_init_map_token(&token);
    4992                 :            : 
    4993                 :          0 :         leaf = path->nodes[0];
    4994                 :          0 :         last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);
    4995                 :            : 
    4996         [ #  # ]:          0 :         for (i = 0; i < nr; i++)
    4997                 :          0 :                 dsize += btrfs_item_size_nr(leaf, slot + i);
    4998                 :            : 
    4999                 :            :         nritems = btrfs_header_nritems(leaf);
    5000                 :            : 
    5001         [ #  # ]:          0 :         if (slot + nr != nritems) {
    5002                 :          0 :                 int data_end = leaf_data_end(root, leaf);
    5003                 :            : 
    5004                 :          0 :                 memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) +
    5005                 :            :                               data_end + dsize,
    5006                 :            :                               btrfs_leaf_data(leaf) + data_end,
    5007                 :          0 :                               last_off - data_end);
    5008                 :            : 
    5009         [ #  # ]:          0 :                 for (i = slot + nr; i < nritems; i++) {
    5010                 :            :                         u32 ioff;
    5011                 :            : 
    5012                 :            :                         item = btrfs_item_nr(i);
    5013                 :            :                         ioff = btrfs_token_item_offset(leaf, item, &token);
    5014                 :          0 :                         btrfs_set_token_item_offset(leaf, item,
    5015                 :            :                                                     ioff + dsize, &token);
    5016                 :            :                 }
    5017                 :            : 
    5018                 :          0 :                 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
    5019                 :            :                               btrfs_item_nr_offset(slot + nr),
    5020                 :          0 :                               sizeof(struct btrfs_item) *
    5021                 :          0 :                               (nritems - slot - nr));
    5022                 :            :         }
    5023                 :          0 :         btrfs_set_header_nritems(leaf, nritems - nr);
    5024                 :            :         nritems -= nr;
    5025                 :            : 
    5026                 :            :         /* delete the leaf if we've emptied it */
    5027         [ #  # ]:          0 :         if (nritems == 0) {
    5028         [ #  # ]:          0 :                 if (leaf == root->node) {
    5029                 :            :                         btrfs_set_header_level(leaf, 0);
    5030                 :            :                 } else {
    5031                 :          0 :                         btrfs_set_path_blocking(path);
    5032                 :          0 :                         clean_tree_block(trans, root, leaf);
    5033                 :          0 :                         btrfs_del_leaf(trans, root, path, leaf);
    5034                 :            :                 }
    5035                 :            :         } else {
    5036                 :          0 :                 int used = leaf_space_used(leaf, 0, nritems);
    5037         [ #  # ]:          0 :                 if (slot == 0) {
    5038                 :            :                         struct btrfs_disk_key disk_key;
    5039                 :            : 
    5040                 :            :                         btrfs_item_key(leaf, &disk_key, 0);
    5041                 :          0 :                         fixup_low_keys(root, path, &disk_key, 1);
    5042                 :            :                 }
    5043                 :            : 
    5044                 :            :                 /* delete the leaf if it is mostly empty */
    5045         [ #  # ]:          0 :                 if (used < BTRFS_LEAF_DATA_SIZE(root) / 3) {
    5046                 :            :                         /* push_leaf_left fixes the path.
    5047                 :            :                          * make sure the path still points to our leaf
    5048                 :            :                          * for possible call to del_ptr below
    5049                 :            :                          */
    5050                 :          0 :                         slot = path->slots[1];
    5051                 :            :                         extent_buffer_get(leaf);
    5052                 :            : 
    5053                 :          0 :                         btrfs_set_path_blocking(path);
    5054                 :          0 :                         wret = push_leaf_left(trans, root, path, 1, 1,
    5055                 :            :                                               1, (u32)-1);
    5056         [ #  # ]:          0 :                         if (wret < 0 && wret != -ENOSPC)
    5057                 :            :                                 ret = wret;
    5058                 :            : 
    5059   [ #  #  #  # ]:          0 :                         if (path->nodes[0] == leaf &&
    5060                 :            :                             btrfs_header_nritems(leaf)) {
    5061                 :          0 :                                 wret = push_leaf_right(trans, root, path, 1,
    5062                 :            :                                                        1, 1, 0);
    5063         [ #  # ]:          0 :                                 if (wret < 0 && wret != -ENOSPC)
    5064                 :            :                                         ret = wret;
    5065                 :            :                         }
    5066                 :            : 
    5067         [ #  # ]:          0 :                         if (btrfs_header_nritems(leaf) == 0) {
    5068                 :          0 :                                 path->slots[1] = slot;
    5069                 :          0 :                                 btrfs_del_leaf(trans, root, path, leaf);
    5070                 :          0 :                                 free_extent_buffer(leaf);
    5071                 :            :                                 ret = 0;
    5072                 :            :                         } else {
    5073                 :            :                                 /* if we're still in the path, make sure
    5074                 :            :                                  * we're dirty.  Otherwise, one of the
    5075                 :            :                                  * push_leaf functions must have already
    5076                 :            :                                  * dirtied this buffer
    5077                 :            :                                  */
    5078         [ #  # ]:          0 :                                 if (path->nodes[0] == leaf)
    5079                 :          0 :                                         btrfs_mark_buffer_dirty(leaf);
    5080                 :          0 :                                 free_extent_buffer(leaf);
    5081                 :            :                         }
    5082                 :            :                 } else {
    5083                 :          0 :                         btrfs_mark_buffer_dirty(leaf);
    5084                 :            :                 }
    5085                 :            :         }
    5086                 :          0 :         return ret;
    5087                 :            : }
    5088                 :            : 
    5089                 :            : /*
    5090                 :            :  * search the tree again to find a leaf with lesser keys
    5091                 :            :  * returns 0 if it found something or 1 if there are no lesser leaves.
    5092                 :            :  * returns < 0 on io errors.
    5093                 :            :  *
    5094                 :            :  * This may release the path, and so you may lose any locks held at the
    5095                 :            :  * time you call it.
    5096                 :            :  */
    5097                 :          0 : int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
    5098                 :            : {
    5099                 :            :         struct btrfs_key key;
    5100                 :            :         struct btrfs_disk_key found_key;
    5101                 :            :         int ret;
    5102                 :            : 
    5103                 :          0 :         btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
    5104                 :            : 
    5105         [ #  # ]:          0 :         if (key.offset > 0) {
    5106                 :          0 :                 key.offset--;
    5107         [ #  # ]:          0 :         } else if (key.type > 0) {
    5108                 :          0 :                 key.type--;
    5109                 :          0 :                 key.offset = (u64)-1;
    5110         [ #  # ]:          0 :         } else if (key.objectid > 0) {
    5111                 :          0 :                 key.objectid--;
    5112                 :          0 :                 key.type = (u8)-1;
    5113                 :          0 :                 key.offset = (u64)-1;
    5114                 :            :         } else {
    5115                 :            :                 return 1;
    5116                 :            :         }
    5117                 :            : 
    5118                 :          0 :         btrfs_release_path(path);
    5119                 :          0 :         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
    5120         [ #  # ]:          0 :         if (ret < 0)
    5121                 :            :                 return ret;
    5122                 :          0 :         btrfs_item_key(path->nodes[0], &found_key, 0);
    5123                 :          0 :         ret = comp_keys(&found_key, &key);
    5124         [ #  # ]:          0 :         if (ret < 0)
    5125                 :            :                 return 0;
    5126                 :          0 :         return 1;
    5127                 :            : }
    5128                 :            : 
    5129                 :            : /*
    5130                 :            :  * A helper function to walk down the tree starting at min_key, and looking
    5131                 :            :  * for nodes or leaves that are have a minimum transaction id.
    5132                 :            :  * This is used by the btree defrag code, and tree logging
    5133                 :            :  *
    5134                 :            :  * This does not cow, but it does stuff the starting key it finds back
    5135                 :            :  * into min_key, so you can call btrfs_search_slot with cow=1 on the
    5136                 :            :  * key and get a writable path.
    5137                 :            :  *
    5138                 :            :  * This does lock as it descends, and path->keep_locks should be set
    5139                 :            :  * to 1 by the caller.
    5140                 :            :  *
    5141                 :            :  * This honors path->lowest_level to prevent descent past a given level
    5142                 :            :  * of the tree.
    5143                 :            :  *
    5144                 :            :  * min_trans indicates the oldest transaction that you are interested
    5145                 :            :  * in walking through.  Any nodes or leaves older than min_trans are
    5146                 :            :  * skipped over (without reading them).
    5147                 :            :  *
    5148                 :            :  * returns zero if something useful was found, < 0 on error and 1 if there
    5149                 :            :  * was nothing in the tree that matched the search criteria.
    5150                 :            :  */
    5151                 :          0 : int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
    5152                 :            :                          struct btrfs_path *path,
    5153                 :            :                          u64 min_trans)
    5154                 :            : {
    5155                 :          0 :         struct extent_buffer *cur;
    5156                 :            :         struct btrfs_key found_key;
    5157                 :            :         int slot;
    5158                 :            :         int sret;
    5159                 :            :         u32 nritems;
    5160                 :            :         int level;
    5161                 :            :         int ret = 1;
    5162                 :            : 
    5163         [ #  # ]:          0 :         WARN_ON(!path->keep_locks);
    5164                 :            : again:
    5165                 :          0 :         cur = btrfs_read_lock_root_node(root);
    5166                 :          0 :         level = btrfs_header_level(cur);
    5167         [ #  # ]:          0 :         WARN_ON(path->nodes[level]);
    5168                 :          0 :         path->nodes[level] = cur;
    5169                 :          0 :         path->locks[level] = BTRFS_READ_LOCK;
    5170                 :            : 
    5171         [ #  # ]:          0 :         if (btrfs_header_generation(cur) < min_trans) {
    5172                 :            :                 ret = 1;
    5173                 :            :                 goto out;
    5174                 :            :         }
    5175                 :            :         while (1) {
    5176                 :            :                 nritems = btrfs_header_nritems(cur);
    5177                 :          0 :                 level = btrfs_header_level(cur);
    5178                 :          0 :                 sret = bin_search(cur, min_key, level, &slot);
    5179                 :            : 
    5180                 :            :                 /* at the lowest level, we're done, setup the path and exit */
    5181         [ #  # ]:          0 :                 if (level == path->lowest_level) {
    5182         [ #  # ]:          0 :                         if (slot >= nritems)
    5183                 :            :                                 goto find_next_key;
    5184                 :            :                         ret = 0;
    5185                 :          0 :                         path->slots[level] = slot;
    5186                 :            :                         btrfs_item_key_to_cpu(cur, &found_key, slot);
    5187                 :            :                         goto out;
    5188                 :            :                 }
    5189 [ #  # ][ #  # ]:          0 :                 if (sret && slot > 0)
    5190                 :          0 :                         slot--;
    5191                 :            :                 /*
    5192                 :            :                  * check this node pointer against the min_trans parameters.
    5193                 :            :                  * If it is too old, old, skip to the next one.
    5194                 :            :                  */
    5195         [ #  # ]:          0 :                 while (slot < nritems) {
    5196                 :            :                         u64 gen;
    5197                 :            : 
    5198                 :            :                         gen = btrfs_node_ptr_generation(cur, slot);
    5199         [ #  # ]:          0 :                         if (gen < min_trans) {
    5200                 :          0 :                                 slot++;
    5201                 :          0 :                                 continue;
    5202                 :            :                         }
    5203                 :            :                         break;
    5204                 :            :                 }
    5205                 :            : find_next_key:
    5206                 :            :                 /*
    5207                 :            :                  * we didn't find a candidate key in this node, walk forward
    5208                 :            :                  * and find another one
    5209                 :            :                  */
    5210         [ #  # ]:          0 :                 if (slot >= nritems) {
    5211                 :          0 :                         path->slots[level] = slot;
    5212                 :          0 :                         btrfs_set_path_blocking(path);
    5213                 :          0 :                         sret = btrfs_find_next_key(root, path, min_key, level,
    5214                 :            :                                                   min_trans);
    5215         [ #  # ]:          0 :                         if (sret == 0) {
    5216                 :          0 :                                 btrfs_release_path(path);
    5217                 :          0 :                                 goto again;
    5218                 :            :                         } else {
    5219                 :            :                                 goto out;
    5220                 :            :                         }
    5221                 :            :                 }
    5222                 :            :                 /* save our key for returning back */
    5223                 :            :                 btrfs_node_key_to_cpu(cur, &found_key, slot);
    5224                 :          0 :                 path->slots[level] = slot;
    5225         [ #  # ]:          0 :                 if (level == path->lowest_level) {
    5226                 :            :                         ret = 0;
    5227                 :          0 :                         unlock_up(path, level, 1, 0, NULL);
    5228                 :          0 :                         goto out;
    5229                 :            :                 }
    5230                 :          0 :                 btrfs_set_path_blocking(path);
    5231                 :          0 :                 cur = read_node_slot(root, cur, slot);
    5232         [ #  # ]:          0 :                 BUG_ON(!cur); /* -ENOMEM */
    5233                 :            : 
    5234                 :          0 :                 btrfs_tree_read_lock(cur);
    5235                 :            : 
    5236                 :          0 :                 path->locks[level - 1] = BTRFS_READ_LOCK;
    5237                 :          0 :                 path->nodes[level - 1] = cur;
    5238                 :          0 :                 unlock_up(path, level, 1, 0, NULL);
    5239                 :          0 :                 btrfs_clear_path_blocking(path, NULL, 0);
    5240                 :          0 :         }
    5241                 :            : out:
    5242         [ #  # ]:          0 :         if (ret == 0)
    5243                 :          0 :                 memcpy(min_key, &found_key, sizeof(found_key));
    5244                 :          0 :         btrfs_set_path_blocking(path);
    5245                 :          0 :         return ret;
    5246                 :            : }
    5247                 :            : 
    5248                 :          0 : static void tree_move_down(struct btrfs_root *root,
    5249                 :            :                            struct btrfs_path *path,
    5250                 :            :                            int *level, int root_level)
    5251                 :            : {
    5252         [ #  # ]:          0 :         BUG_ON(*level == 0);
    5253                 :          0 :         path->nodes[*level - 1] = read_node_slot(root, path->nodes[*level],
    5254                 :            :                                         path->slots[*level]);
    5255                 :          0 :         path->slots[*level - 1] = 0;
    5256                 :          0 :         (*level)--;
    5257                 :          0 : }
    5258                 :            : 
    5259                 :          0 : static int tree_move_next_or_upnext(struct btrfs_root *root,
    5260                 :            :                                     struct btrfs_path *path,
    5261                 :            :                                     int *level, int root_level)
    5262                 :            : {
    5263                 :            :         int ret = 0;
    5264                 :            :         int nritems;
    5265                 :          0 :         nritems = btrfs_header_nritems(path->nodes[*level]);
    5266                 :            : 
    5267                 :          0 :         path->slots[*level]++;
    5268                 :            : 
    5269         [ #  # ]:          0 :         while (path->slots[*level] >= nritems) {
    5270         [ #  # ]:          0 :                 if (*level == root_level)
    5271                 :            :                         return -1;
    5272                 :            : 
    5273                 :            :                 /* move upnext */
    5274                 :          0 :                 path->slots[*level] = 0;
    5275                 :          0 :                 free_extent_buffer(path->nodes[*level]);
    5276                 :          0 :                 path->nodes[*level] = NULL;
    5277                 :          0 :                 (*level)++;
    5278                 :          0 :                 path->slots[*level]++;
    5279                 :            : 
    5280                 :          0 :                 nritems = btrfs_header_nritems(path->nodes[*level]);
    5281                 :            :                 ret = 1;
    5282                 :            :         }
    5283                 :            :         return ret;
    5284                 :            : }
    5285                 :            : 
    5286                 :            : /*
    5287                 :            :  * Returns 1 if it had to move up and next. 0 is returned if it moved only next
    5288                 :            :  * or down.
    5289                 :            :  */
    5290                 :          0 : static int tree_advance(struct btrfs_root *root,
    5291                 :            :                         struct btrfs_path *path,
    5292                 :            :                         int *level, int root_level,
    5293                 :            :                         int allow_down,
    5294                 :            :                         struct btrfs_key *key)
    5295                 :            : {
    5296                 :            :         int ret;
    5297                 :            : 
    5298 [ #  # ][ #  # ]:          0 :         if (*level == 0 || !allow_down) {
    5299                 :          0 :                 ret = tree_move_next_or_upnext(root, path, level, root_level);
    5300                 :            :         } else {
    5301                 :          0 :                 tree_move_down(root, path, level, root_level);
    5302                 :            :                 ret = 0;
    5303                 :            :         }
    5304         [ #  # ]:          0 :         if (ret >= 0) {
    5305         [ #  # ]:          0 :                 if (*level == 0)
    5306                 :          0 :                         btrfs_item_key_to_cpu(path->nodes[*level], key,
    5307                 :            :                                         path->slots[*level]);
    5308                 :            :                 else
    5309                 :          0 :                         btrfs_node_key_to_cpu(path->nodes[*level], key,
    5310                 :            :                                         path->slots[*level]);
    5311                 :            :         }
    5312                 :          0 :         return ret;
    5313                 :            : }
    5314                 :            : 
    5315                 :          0 : static int tree_compare_item(struct btrfs_root *left_root,
    5316                 :            :                              struct btrfs_path *left_path,
    5317                 :            :                              struct btrfs_path *right_path,
    5318                 :            :                              char *tmp_buf)
    5319                 :            : {
    5320                 :            :         int cmp;
    5321                 :            :         int len1, len2;
    5322                 :            :         unsigned long off1, off2;
    5323                 :            : 
    5324                 :          0 :         len1 = btrfs_item_size_nr(left_path->nodes[0], left_path->slots[0]);
    5325                 :          0 :         len2 = btrfs_item_size_nr(right_path->nodes[0], right_path->slots[0]);
    5326         [ #  # ]:          0 :         if (len1 != len2)
    5327                 :            :                 return 1;
    5328                 :            : 
    5329                 :          0 :         off1 = btrfs_item_ptr_offset(left_path->nodes[0], left_path->slots[0]);
    5330                 :          0 :         off2 = btrfs_item_ptr_offset(right_path->nodes[0],
    5331                 :            :                                 right_path->slots[0]);
    5332                 :            : 
    5333                 :          0 :         read_extent_buffer(left_path->nodes[0], tmp_buf, off1, len1);
    5334                 :            : 
    5335                 :          0 :         cmp = memcmp_extent_buffer(right_path->nodes[0], tmp_buf, off2, len1);
    5336         [ #  # ]:          0 :         if (cmp)
    5337                 :            :                 return 1;
    5338                 :            :         return 0;
    5339                 :            : }
    5340                 :            : 
    5341                 :            : #define ADVANCE 1
    5342                 :            : #define ADVANCE_ONLY_NEXT -1
    5343                 :            : 
    5344                 :            : /*
    5345                 :            :  * This function compares two trees and calls the provided callback for
    5346                 :            :  * every changed/new/deleted item it finds.
    5347                 :            :  * If shared tree blocks are encountered, whole subtrees are skipped, making
    5348                 :            :  * the compare pretty fast on snapshotted subvolumes.
    5349                 :            :  *
    5350                 :            :  * This currently works on commit roots only. As commit roots are read only,
    5351                 :            :  * we don't do any locking. The commit roots are protected with transactions.
    5352                 :            :  * Transactions are ended and rejoined when a commit is tried in between.
    5353                 :            :  *
    5354                 :            :  * This function checks for modifications done to the trees while comparing.
    5355                 :            :  * If it detects a change, it aborts immediately.
    5356                 :            :  */
    5357                 :          0 : int btrfs_compare_trees(struct btrfs_root *left_root,
    5358                 :            :                         struct btrfs_root *right_root,
    5359                 :            :                         btrfs_changed_cb_t changed_cb, void *ctx)
    5360                 :            : {
    5361                 :            :         int ret;
    5362                 :            :         int cmp;
    5363                 :            :         struct btrfs_trans_handle *trans = NULL;
    5364                 :            :         struct btrfs_path *left_path = NULL;
    5365                 :            :         struct btrfs_path *right_path = NULL;
    5366                 :            :         struct btrfs_key left_key;
    5367                 :            :         struct btrfs_key right_key;
    5368                 :            :         char *tmp_buf = NULL;
    5369                 :            :         int left_root_level;
    5370                 :            :         int right_root_level;
    5371                 :            :         int left_level;
    5372                 :            :         int right_level;
    5373                 :            :         int left_end_reached;
    5374                 :            :         int right_end_reached;
    5375                 :            :         int advance_left;
    5376                 :            :         int advance_right;
    5377                 :            :         u64 left_blockptr;
    5378                 :            :         u64 right_blockptr;
    5379                 :            :         u64 left_start_ctransid;
    5380                 :            :         u64 right_start_ctransid;
    5381                 :            :         u64 ctransid;
    5382                 :            : 
    5383                 :            :         left_path = btrfs_alloc_path();
    5384         [ #  # ]:          0 :         if (!left_path) {
    5385                 :            :                 ret = -ENOMEM;
    5386                 :            :                 goto out;
    5387                 :            :         }
    5388                 :            :         right_path = btrfs_alloc_path();
    5389         [ #  # ]:          0 :         if (!right_path) {
    5390                 :            :                 ret = -ENOMEM;
    5391                 :            :                 goto out;
    5392                 :            :         }
    5393                 :            : 
    5394                 :          0 :         tmp_buf = kmalloc(left_root->leafsize, GFP_NOFS);
    5395         [ #  # ]:          0 :         if (!tmp_buf) {
    5396                 :            :                 ret = -ENOMEM;
    5397                 :            :                 goto out;
    5398                 :            :         }
    5399                 :            : 
    5400                 :          0 :         left_path->search_commit_root = 1;
    5401                 :          0 :         left_path->skip_locking = 1;
    5402                 :          0 :         right_path->search_commit_root = 1;
    5403                 :          0 :         right_path->skip_locking = 1;
    5404                 :            : 
    5405                 :            :         spin_lock(&left_root->root_item_lock);
    5406                 :            :         left_start_ctransid = btrfs_root_ctransid(&left_root->root_item);
    5407                 :            :         spin_unlock(&left_root->root_item_lock);
    5408                 :            : 
    5409                 :            :         spin_lock(&right_root->root_item_lock);
    5410                 :            :         right_start_ctransid = btrfs_root_ctransid(&right_root->root_item);
    5411                 :            :         spin_unlock(&right_root->root_item_lock);
    5412                 :            : 
    5413                 :          0 :         trans = btrfs_join_transaction(left_root);
    5414         [ #  # ]:          0 :         if (IS_ERR(trans)) {
    5415                 :            :                 ret = PTR_ERR(trans);
    5416                 :            :                 trans = NULL;
    5417                 :          0 :                 goto out;
    5418                 :            :         }
    5419                 :            : 
    5420                 :            :         /*
    5421                 :            :          * Strategy: Go to the first items of both trees. Then do
    5422                 :            :          *
    5423                 :            :          * If both trees are at level 0
    5424                 :            :          *   Compare keys of current items
    5425                 :            :          *     If left < right treat left item as new, advance left tree
    5426                 :            :          *       and repeat
    5427                 :            :          *     If left > right treat right item as deleted, advance right tree
    5428                 :            :          *       and repeat
    5429                 :            :          *     If left == right do deep compare of items, treat as changed if
    5430                 :            :          *       needed, advance both trees and repeat
    5431                 :            :          * If both trees are at the same level but not at level 0
    5432                 :            :          *   Compare keys of current nodes/leafs
    5433                 :            :          *     If left < right advance left tree and repeat
    5434                 :            :          *     If left > right advance right tree and repeat
    5435                 :            :          *     If left == right compare blockptrs of the next nodes/leafs
    5436                 :            :          *       If they match advance both trees but stay at the same level
    5437                 :            :          *         and repeat
    5438                 :            :          *       If they don't match advance both trees while allowing to go
    5439                 :            :          *         deeper and repeat
    5440                 :            :          * If tree levels are different
    5441                 :            :          *   Advance the tree that needs it and repeat
    5442                 :            :          *
    5443                 :            :          * Advancing a tree means:
    5444                 :            :          *   If we are at level 0, try to go to the next slot. If that's not
    5445                 :            :          *   possible, go one level up and repeat. Stop when we found a level
    5446                 :            :          *   where we could go to the next slot. We may at this point be on a
    5447                 :            :          *   node or a leaf.
    5448                 :            :          *
    5449                 :            :          *   If we are not at level 0 and not on shared tree blocks, go one
    5450                 :            :          *   level deeper.
    5451                 :            :          *
    5452                 :            :          *   If we are not at level 0 and on shared tree blocks, go one slot to
    5453                 :            :          *   the right if possible or go up and right.
    5454                 :            :          */
    5455                 :            : 
    5456                 :          0 :         left_level = btrfs_header_level(left_root->commit_root);
    5457                 :            :         left_root_level = left_level;
    5458                 :          0 :         left_path->nodes[left_level] = left_root->commit_root;
    5459                 :          0 :         extent_buffer_get(left_path->nodes[left_level]);
    5460                 :            : 
    5461                 :          0 :         right_level = btrfs_header_level(right_root->commit_root);
    5462                 :            :         right_root_level = right_level;
    5463                 :          0 :         right_path->nodes[right_level] = right_root->commit_root;
    5464                 :          0 :         extent_buffer_get(right_path->nodes[right_level]);
    5465                 :            : 
    5466         [ #  # ]:          0 :         if (left_level == 0)
    5467                 :          0 :                 btrfs_item_key_to_cpu(left_path->nodes[left_level],
    5468                 :            :                                 &left_key, left_path->slots[left_level]);
    5469                 :            :         else
    5470                 :          0 :                 btrfs_node_key_to_cpu(left_path->nodes[left_level],
    5471                 :            :                                 &left_key, left_path->slots[left_level]);
    5472         [ #  # ]:          0 :         if (right_level == 0)
    5473                 :          0 :                 btrfs_item_key_to_cpu(right_path->nodes[right_level],
    5474                 :            :                                 &right_key, right_path->slots[right_level]);
    5475                 :            :         else
    5476                 :          0 :                 btrfs_node_key_to_cpu(right_path->nodes[right_level],
    5477                 :            :                                 &right_key, right_path->slots[right_level]);
    5478                 :            : 
    5479                 :            :         left_end_reached = right_end_reached = 0;
    5480                 :            :         advance_left = advance_right = 0;
    5481                 :            : 
    5482                 :            :         while (1) {
    5483                 :            :                 /*
    5484                 :            :                  * We need to make sure the transaction does not get committed
    5485                 :            :                  * while we do anything on commit roots. This means, we need to
    5486                 :            :                  * join and leave transactions for every item that we process.
    5487                 :            :                  */
    5488 [ #  # ][ #  # ]:          0 :                 if (trans && btrfs_should_end_transaction(trans, left_root)) {
    5489                 :          0 :                         btrfs_release_path(left_path);
    5490                 :          0 :                         btrfs_release_path(right_path);
    5491                 :            : 
    5492                 :          0 :                         ret = btrfs_end_transaction(trans, left_root);
    5493                 :            :                         trans = NULL;
    5494         [ #  # ]:          0 :                         if (ret < 0)
    5495                 :            :                                 goto out;
    5496                 :            :                 }
    5497                 :            :                 /* now rejoin the transaction */
    5498         [ #  # ]:          0 :                 if (!trans) {
    5499                 :          0 :                         trans = btrfs_join_transaction(left_root);
    5500         [ #  # ]:          0 :                         if (IS_ERR(trans)) {
    5501                 :            :                                 ret = PTR_ERR(trans);
    5502                 :            :                                 trans = NULL;
    5503                 :          0 :                                 goto out;
    5504                 :            :                         }
    5505                 :            : 
    5506                 :            :                         spin_lock(&left_root->root_item_lock);
    5507                 :            :                         ctransid = btrfs_root_ctransid(&left_root->root_item);
    5508                 :            :                         spin_unlock(&left_root->root_item_lock);
    5509         [ #  # ]:          0 :                         if (ctransid != left_start_ctransid)
    5510                 :            :                                 left_start_ctransid = 0;
    5511                 :            : 
    5512                 :            :                         spin_lock(&right_root->root_item_lock);
    5513                 :            :                         ctransid = btrfs_root_ctransid(&right_root->root_item);
    5514                 :            :                         spin_unlock(&right_root->root_item_lock);
    5515         [ #  # ]:          0 :                         if (ctransid != right_start_ctransid)
    5516                 :            :                                 right_start_ctransid = 0;
    5517                 :            : 
    5518         [ #  # ]:          0 :                         if (!left_start_ctransid || !right_start_ctransid) {
    5519                 :          0 :                                 WARN(1, KERN_WARNING
    5520                 :            :                                         "BTRFS: btrfs_compare_tree detected "
    5521                 :            :                                         "a change in one of the trees while "
    5522                 :            :                                         "iterating. This is probably a "
    5523                 :            :                                         "bug.\n");
    5524                 :            :                                 ret = -EIO;
    5525                 :          0 :                                 goto out;
    5526                 :            :                         }
    5527                 :            : 
    5528                 :            :                         /*
    5529                 :            :                          * the commit root may have changed, so start again
    5530                 :            :                          * where we stopped
    5531                 :            :                          */
    5532                 :          0 :                         left_path->lowest_level = left_level;
    5533                 :          0 :                         right_path->lowest_level = right_level;
    5534                 :          0 :                         ret = btrfs_search_slot(NULL, left_root,
    5535                 :            :                                         &left_key, left_path, 0, 0);
    5536         [ #  # ]:          0 :                         if (ret < 0)
    5537                 :            :                                 goto out;
    5538                 :          0 :                         ret = btrfs_search_slot(NULL, right_root,
    5539                 :            :                                         &right_key, right_path, 0, 0);
    5540         [ #  # ]:          0 :                         if (ret < 0)
    5541                 :            :                                 goto out;
    5542                 :            :                 }
    5543                 :            : 
    5544         [ #  # ]:          0 :                 if (advance_left && !left_end_reached) {
    5545                 :          0 :                         ret = tree_advance(left_root, left_path, &left_level,
    5546                 :            :                                         left_root_level,
    5547                 :            :                                         advance_left != ADVANCE_ONLY_NEXT,
    5548                 :            :                                         &left_key);
    5549         [ #  # ]:          0 :                         if (ret < 0)
    5550                 :            :                                 left_end_reached = ADVANCE;
    5551                 :            :                         advance_left = 0;
    5552                 :            :                 }
    5553         [ #  # ]:          0 :                 if (advance_right && !right_end_reached) {
    5554                 :          0 :                         ret = tree_advance(right_root, right_path, &right_level,
    5555                 :            :                                         right_root_level,
    5556                 :            :                                         advance_right != ADVANCE_ONLY_NEXT,
    5557                 :            :                                         &right_key);
    5558         [ #  # ]:          0 :                         if (ret < 0)
    5559                 :            :                                 right_end_reached = ADVANCE;
    5560                 :            :                         advance_right = 0;
    5561                 :            :                 }
    5562                 :            : 
    5563         [ #  # ]:          0 :                 if (left_end_reached && right_end_reached) {
    5564                 :            :                         ret = 0;
    5565                 :            :                         goto out;
    5566         [ #  # ]:          0 :                 } else if (left_end_reached) {
    5567         [ #  # ]:          0 :                         if (right_level == 0) {
    5568                 :          0 :                                 ret = changed_cb(left_root, right_root,
    5569                 :            :                                                 left_path, right_path,
    5570                 :            :                                                 &right_key,
    5571                 :            :                                                 BTRFS_COMPARE_TREE_DELETED,
    5572                 :            :                                                 ctx);
    5573         [ #  # ]:          0 :                                 if (ret < 0)
    5574                 :            :                                         goto out;
    5575                 :            :                         }
    5576                 :            :                         advance_right = ADVANCE;
    5577                 :          0 :                         continue;
    5578         [ #  # ]:          0 :                 } else if (right_end_reached) {
    5579         [ #  # ]:          0 :                         if (left_level == 0) {
    5580                 :          0 :                                 ret = changed_cb(left_root, right_root,
    5581                 :            :                                                 left_path, right_path,
    5582                 :            :                                                 &left_key,
    5583                 :            :                                                 BTRFS_COMPARE_TREE_NEW,
    5584                 :            :                                                 ctx);
    5585         [ #  # ]:          0 :                                 if (ret < 0)
    5586                 :            :                                         goto out;
    5587                 :            :                         }
    5588                 :            :                         advance_left = ADVANCE;
    5589                 :          0 :                         continue;
    5590                 :            :                 }
    5591                 :            : 
    5592 [ #  # ][ #  # ]:          0 :                 if (left_level == 0 && right_level == 0) {
    5593                 :          0 :                         cmp = btrfs_comp_cpu_keys(&left_key, &right_key);
    5594         [ #  # ]:          0 :                         if (cmp < 0) {
    5595                 :          0 :                                 ret = changed_cb(left_root, right_root,
    5596                 :            :                                                 left_path, right_path,
    5597                 :            :                                                 &left_key,
    5598                 :            :                                                 BTRFS_COMPARE_TREE_NEW,
    5599                 :            :                                                 ctx);
    5600         [ #  # ]:          0 :                                 if (ret < 0)
    5601                 :            :                                         goto out;
    5602                 :            :                                 advance_left = ADVANCE;
    5603         [ #  # ]:          0 :                         } else if (cmp > 0) {
    5604                 :          0 :                                 ret = changed_cb(left_root, right_root,
    5605                 :            :                                                 left_path, right_path,
    5606                 :            :                                                 &right_key,
    5607                 :            :                                                 BTRFS_COMPARE_TREE_DELETED,
    5608                 :            :                                                 ctx);
    5609         [ #  # ]:          0 :                                 if (ret < 0)
    5610                 :            :                                         goto out;
    5611                 :            :                                 advance_right = ADVANCE;
    5612                 :            :                         } else {
    5613                 :            :                                 enum btrfs_compare_tree_result cmp;
    5614                 :            : 
    5615         [ #  # ]:          0 :                                 WARN_ON(!extent_buffer_uptodate(left_path->nodes[0]));
    5616                 :          0 :                                 ret = tree_compare_item(left_root, left_path,
    5617                 :            :                                                 right_path, tmp_buf);
    5618         [ #  # ]:          0 :                                 if (ret)
    5619                 :            :                                         cmp = BTRFS_COMPARE_TREE_CHANGED;
    5620                 :            :                                 else
    5621                 :            :                                         cmp = BTRFS_COMPARE_TREE_SAME;
    5622                 :          0 :                                 ret = changed_cb(left_root, right_root,
    5623                 :            :                                                  left_path, right_path,
    5624                 :            :                                                  &left_key, cmp, ctx);
    5625         [ #  # ]:          0 :                                 if (ret < 0)
    5626                 :            :                                         goto out;
    5627                 :            :                                 advance_left = ADVANCE;
    5628                 :            :                                 advance_right = ADVANCE;
    5629                 :            :                         }
    5630         [ #  # ]:          0 :                 } else if (left_level == right_level) {
    5631                 :          0 :                         cmp = btrfs_comp_cpu_keys(&left_key, &right_key);
    5632         [ #  # ]:          0 :                         if (cmp < 0) {
    5633                 :            :                                 advance_left = ADVANCE;
    5634         [ #  # ]:          0 :                         } else if (cmp > 0) {
    5635                 :            :                                 advance_right = ADVANCE;
    5636                 :            :                         } else {
    5637                 :          0 :                                 left_blockptr = btrfs_node_blockptr(
    5638                 :            :                                                 left_path->nodes[left_level],
    5639                 :            :                                                 left_path->slots[left_level]);
    5640                 :          0 :                                 right_blockptr = btrfs_node_blockptr(
    5641                 :            :                                                 right_path->nodes[right_level],
    5642                 :            :                                                 right_path->slots[right_level]);
    5643         [ #  # ]:          0 :                                 if (left_blockptr == right_blockptr) {
    5644                 :            :                                         /*
    5645                 :            :                                          * As we're on a shared block, don't
    5646                 :            :                                          * allow to go deeper.
    5647                 :            :                                          */
    5648                 :            :                                         advance_left = ADVANCE_ONLY_NEXT;
    5649                 :            :                                         advance_right = ADVANCE_ONLY_NEXT;
    5650                 :            :                                 } else {
    5651                 :            :                                         advance_left = ADVANCE;
    5652                 :            :                                         advance_right = ADVANCE;
    5653                 :            :                                 }
    5654                 :            :                         }
    5655         [ #  # ]:          0 :                 } else if (left_level < right_level) {
    5656                 :            :                         advance_right = ADVANCE;
    5657                 :            :                 } else {
    5658                 :            :                         advance_left = ADVANCE;
    5659                 :            :                 }
    5660                 :            :         }
    5661                 :            : 
    5662                 :            : out:
    5663                 :          0 :         btrfs_free_path(left_path);
    5664                 :          0 :         btrfs_free_path(right_path);
    5665                 :          0 :         kfree(tmp_buf);
    5666                 :            : 
    5667         [ #  # ]:          0 :         if (trans) {
    5668         [ #  # ]:          0 :                 if (!ret)
    5669                 :          0 :                         ret = btrfs_end_transaction(trans, left_root);
    5670                 :            :                 else
    5671                 :          0 :                         btrfs_end_transaction(trans, left_root);
    5672                 :            :         }
    5673                 :            : 
    5674                 :          0 :         return ret;
    5675                 :            : }
    5676                 :            : 
    5677                 :            : /*
    5678                 :            :  * this is similar to btrfs_next_leaf, but does not try to preserve
    5679                 :            :  * and fixup the path.  It looks for and returns the next key in the
    5680                 :            :  * tree based on the current path and the min_trans parameters.
    5681                 :            :  *
    5682                 :            :  * 0 is returned if another key is found, < 0 if there are any errors
    5683                 :            :  * and 1 is returned if there are no higher keys in the tree
    5684                 :            :  *
    5685                 :            :  * path->keep_locks should be set to 1 on the search made before
    5686                 :            :  * calling this function.
    5687                 :            :  */
    5688                 :          0 : int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
    5689                 :            :                         struct btrfs_key *key, int level, u64 min_trans)
    5690                 :            : {
    5691                 :            :         int slot;
    5692                 :          0 :         struct extent_buffer *c;
    5693                 :            : 
    5694         [ #  # ]:          0 :         WARN_ON(!path->keep_locks);
    5695         [ #  # ]:          0 :         while (level < BTRFS_MAX_LEVEL) {
    5696         [ #  # ]:          0 :                 if (!path->nodes[level])
    5697                 :            :                         return 1;
    5698                 :            : 
    5699                 :          0 :                 slot = path->slots[level] + 1;
    5700                 :            :                 c = path->nodes[level];
    5701                 :            : next:
    5702         [ #  # ]:          0 :                 if (slot >= btrfs_header_nritems(c)) {
    5703                 :            :                         int ret;
    5704                 :            :                         int orig_lowest;
    5705                 :            :                         struct btrfs_key cur_key;
    5706 [ #  # ][ #  # ]:          0 :                         if (level + 1 >= BTRFS_MAX_LEVEL ||
    5707                 :          0 :                             !path->nodes[level + 1])
    5708                 :          0 :                                 return 1;
    5709                 :            : 
    5710         [ #  # ]:          0 :                         if (path->locks[level + 1]) {
    5711                 :            :                                 level++;
    5712                 :          0 :                                 continue;
    5713                 :            :                         }
    5714                 :            : 
    5715                 :          0 :                         slot = btrfs_header_nritems(c) - 1;
    5716         [ #  # ]:          0 :                         if (level == 0)
    5717                 :            :                                 btrfs_item_key_to_cpu(c, &cur_key, slot);
    5718                 :            :                         else
    5719                 :            :                                 btrfs_node_key_to_cpu(c, &cur_key, slot);
    5720                 :            : 
    5721                 :          0 :                         orig_lowest = path->lowest_level;
    5722                 :          0 :                         btrfs_release_path(path);
    5723                 :          0 :                         path->lowest_level = level;
    5724                 :          0 :                         ret = btrfs_search_slot(NULL, root, &cur_key, path,
    5725                 :            :                                                 0, 0);
    5726                 :          0 :                         path->lowest_level = orig_lowest;
    5727         [ #  # ]:          0 :                         if (ret < 0)
    5728                 :            :                                 return ret;
    5729                 :            : 
    5730                 :          0 :                         c = path->nodes[level];
    5731                 :          0 :                         slot = path->slots[level];
    5732         [ #  # ]:          0 :                         if (ret == 0)
    5733                 :          0 :                                 slot++;
    5734                 :          0 :                         goto next;
    5735                 :            :                 }
    5736                 :            : 
    5737         [ #  # ]:          0 :                 if (level == 0)
    5738                 :            :                         btrfs_item_key_to_cpu(c, key, slot);
    5739                 :            :                 else {
    5740                 :            :                         u64 gen = btrfs_node_ptr_generation(c, slot);
    5741                 :            : 
    5742         [ #  # ]:          0 :                         if (gen < min_trans) {
    5743                 :          0 :                                 slot++;
    5744                 :          0 :                                 goto next;
    5745                 :            :                         }
    5746                 :            :                         btrfs_node_key_to_cpu(c, key, slot);
    5747                 :            :                 }
    5748                 :            :                 return 0;
    5749                 :            :         }
    5750                 :            :         return 1;
    5751                 :            : }
    5752                 :            : 
    5753                 :            : /*
    5754                 :            :  * search the tree again to find a leaf with greater keys
    5755                 :            :  * returns 0 if it found something or 1 if there are no greater leaves.
    5756                 :            :  * returns < 0 on io errors.
    5757                 :            :  */
    5758                 :          0 : int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
    5759                 :            : {
    5760                 :          0 :         return btrfs_next_old_leaf(root, path, 0);
    5761                 :            : }
    5762                 :            : 
    5763                 :          0 : int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,
    5764                 :            :                         u64 time_seq)
    5765                 :            : {
    5766                 :            :         int slot;
    5767                 :            :         int level;
    5768                 :          0 :         struct extent_buffer *c;
    5769                 :            :         struct extent_buffer *next;
    5770                 :            :         struct btrfs_key key;
    5771                 :            :         u32 nritems;
    5772                 :            :         int ret;
    5773                 :          0 :         int old_spinning = path->leave_spinning;
    5774                 :            :         int next_rw_lock = 0;
    5775                 :            : 
    5776                 :          0 :         nritems = btrfs_header_nritems(path->nodes[0]);
    5777         [ #  # ]:          0 :         if (nritems == 0)
    5778                 :            :                 return 1;
    5779                 :            : 
    5780                 :          0 :         btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1);
    5781                 :            : again:
    5782                 :            :         level = 1;
    5783                 :          0 :         next = NULL;
    5784                 :            :         next_rw_lock = 0;
    5785                 :          0 :         btrfs_release_path(path);
    5786                 :            : 
    5787                 :          0 :         path->keep_locks = 1;
    5788                 :          0 :         path->leave_spinning = 1;
    5789                 :            : 
    5790         [ #  # ]:          0 :         if (time_seq)
    5791                 :          0 :                 ret = btrfs_search_old_slot(root, &key, path, time_seq);
    5792                 :            :         else
    5793                 :          0 :                 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
    5794                 :          0 :         path->keep_locks = 0;
    5795                 :            : 
    5796         [ #  # ]:          0 :         if (ret < 0)
    5797                 :            :                 return ret;
    5798                 :            : 
    5799                 :          0 :         nritems = btrfs_header_nritems(path->nodes[0]);
    5800                 :            :         /*
    5801                 :            :          * by releasing the path above we dropped all our locks.  A balance
    5802                 :            :          * could have added more items next to the key that used to be
    5803                 :            :          * at the very end of the block.  So, check again here and
    5804                 :            :          * advance the path if there are now more items available.
    5805                 :            :          */
    5806 [ #  # ][ #  # ]:          0 :         if (nritems > 0 && path->slots[0] < nritems - 1) {
    5807         [ #  # ]:          0 :                 if (ret == 0)
    5808                 :          0 :                         path->slots[0]++;
    5809                 :            :                 ret = 0;
    5810                 :            :                 goto done;
    5811                 :            :         }
    5812                 :            : 
    5813         [ #  # ]:          0 :         while (level < BTRFS_MAX_LEVEL) {
    5814         [ #  # ]:          0 :                 if (!path->nodes[level]) {
    5815                 :            :                         ret = 1;
    5816                 :            :                         goto done;
    5817                 :            :                 }
    5818                 :            : 
    5819                 :          0 :                 slot = path->slots[level] + 1;
    5820                 :            :                 c = path->nodes[level];
    5821         [ #  # ]:          0 :                 if (slot >= btrfs_header_nritems(c)) {
    5822                 :          0 :                         level++;
    5823         [ #  # ]:          0 :                         if (level == BTRFS_MAX_LEVEL) {
    5824                 :            :                                 ret = 1;
    5825                 :            :                                 goto done;
    5826                 :            :                         }
    5827                 :          0 :                         continue;
    5828                 :            :                 }
    5829                 :            : 
    5830         [ #  # ]:          0 :                 if (next) {
    5831                 :            :                         btrfs_tree_unlock_rw(next, next_rw_lock);
    5832                 :            :                         free_extent_buffer(next);
    5833                 :            :                 }
    5834                 :            : 
    5835                 :          0 :                 next = c;
    5836                 :          0 :                 next_rw_lock = path->locks[level];
    5837                 :          0 :                 ret = read_block_for_search(NULL, root, path, &next, level,
    5838                 :            :                                             slot, &key, 0);
    5839         [ #  # ]:          0 :                 if (ret == -EAGAIN)
    5840                 :            :                         goto again;
    5841                 :            : 
    5842         [ #  # ]:          0 :                 if (ret < 0) {
    5843                 :          0 :                         btrfs_release_path(path);
    5844                 :          0 :                         goto done;
    5845                 :            :                 }
    5846                 :            : 
    5847         [ #  # ]:          0 :                 if (!path->skip_locking) {
    5848                 :          0 :                         ret = btrfs_try_tree_read_lock(next);
    5849         [ #  # ]:          0 :                         if (!ret && time_seq) {
    5850                 :            :                                 /*
    5851                 :            :                                  * If we don't get the lock, we may be racing
    5852                 :            :                                  * with push_leaf_left, holding that lock while
    5853                 :            :                                  * itself waiting for the leaf we've currently
    5854                 :            :                                  * locked. To solve this situation, we give up
    5855                 :            :                                  * on our lock and cycle.
    5856                 :            :                                  */
    5857                 :          0 :                                 free_extent_buffer(next);
    5858                 :          0 :                                 btrfs_release_path(path);
    5859                 :          0 :                                 cond_resched();
    5860                 :          0 :                                 goto again;
    5861                 :            :                         }
    5862         [ #  # ]:          0 :                         if (!ret) {
    5863                 :          0 :                                 btrfs_set_path_blocking(path);
    5864                 :          0 :                                 btrfs_tree_read_lock(next);
    5865                 :          0 :                                 btrfs_clear_path_blocking(path, next,
    5866                 :            :                                                           BTRFS_READ_LOCK);
    5867                 :            :                         }
    5868                 :            :                         next_rw_lock = BTRFS_READ_LOCK;
    5869                 :            :                 }
    5870                 :            :                 break;
    5871                 :            :         }
    5872                 :          0 :         path->slots[level] = slot;
    5873                 :            :         while (1) {
    5874                 :          0 :                 level--;
    5875                 :          0 :                 c = path->nodes[level];
    5876         [ #  # ]:          0 :                 if (path->locks[level])
    5877                 :            :                         btrfs_tree_unlock_rw(c, path->locks[level]);
    5878                 :            : 
    5879                 :          0 :                 free_extent_buffer(c);
    5880                 :          0 :                 path->nodes[level] = next;
    5881                 :          0 :                 path->slots[level] = 0;
    5882         [ #  # ]:          0 :                 if (!path->skip_locking)
    5883                 :          0 :                         path->locks[level] = next_rw_lock;
    5884         [ #  # ]:          0 :                 if (!level)
    5885                 :            :                         break;
    5886                 :            : 
    5887                 :          0 :                 ret = read_block_for_search(NULL, root, path, &next, level,
    5888                 :            :                                             0, &key, 0);
    5889         [ #  # ]:          0 :                 if (ret == -EAGAIN)
    5890                 :            :                         goto again;
    5891                 :            : 
    5892         [ #  # ]:          0 :                 if (ret < 0) {
    5893                 :          0 :                         btrfs_release_path(path);
    5894                 :          0 :                         goto done;
    5895                 :            :                 }
    5896                 :            : 
    5897         [ #  # ]:          0 :                 if (!path->skip_locking) {
    5898                 :          0 :                         ret = btrfs_try_tree_read_lock(next);
    5899         [ #  # ]:          0 :                         if (!ret) {
    5900                 :          0 :                                 btrfs_set_path_blocking(path);
    5901                 :          0 :                                 btrfs_tree_read_lock(next);
    5902                 :          0 :                                 btrfs_clear_path_blocking(path, next,
    5903                 :            :                                                           BTRFS_READ_LOCK);
    5904                 :            :                         }
    5905                 :            :                         next_rw_lock = BTRFS_READ_LOCK;
    5906                 :            :                 }
    5907                 :            :         }
    5908                 :            :         ret = 0;
    5909                 :            : done:
    5910                 :          0 :         unlock_up(path, 0, 1, 0, NULL);
    5911                 :          0 :         path->leave_spinning = old_spinning;
    5912         [ #  # ]:          0 :         if (!old_spinning)
    5913                 :          0 :                 btrfs_set_path_blocking(path);
    5914                 :            : 
    5915                 :          0 :         return ret;
    5916                 :            : }
    5917                 :            : 
    5918                 :            : /*
    5919                 :            :  * this uses btrfs_prev_leaf to walk backwards in the tree, and keeps
    5920                 :            :  * searching until it gets past min_objectid or finds an item of 'type'
    5921                 :            :  *
    5922                 :            :  * returns 0 if something is found, 1 if nothing was found and < 0 on error
    5923                 :            :  */
    5924                 :          0 : int btrfs_previous_item(struct btrfs_root *root,
    5925                 :            :                         struct btrfs_path *path, u64 min_objectid,
    5926                 :            :                         int type)
    5927                 :            : {
    5928                 :            :         struct btrfs_key found_key;
    5929                 :          0 :         struct extent_buffer *leaf;
    5930                 :            :         u32 nritems;
    5931                 :            :         int ret;
    5932                 :            : 
    5933                 :            :         while (1) {
    5934         [ #  # ]:          0 :                 if (path->slots[0] == 0) {
    5935                 :          0 :                         btrfs_set_path_blocking(path);
    5936                 :          0 :                         ret = btrfs_prev_leaf(root, path);
    5937         [ #  # ]:          0 :                         if (ret != 0)
    5938                 :            :                                 return ret;
    5939                 :            :                 } else {
    5940                 :          0 :                         path->slots[0]--;
    5941                 :            :                 }
    5942                 :          0 :                 leaf = path->nodes[0];
    5943                 :            :                 nritems = btrfs_header_nritems(leaf);
    5944         [ #  # ]:          0 :                 if (nritems == 0)
    5945                 :            :                         return 1;
    5946         [ #  # ]:          0 :                 if (path->slots[0] == nritems)
    5947                 :          0 :                         path->slots[0]--;
    5948                 :            : 
    5949                 :          0 :                 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
    5950         [ #  # ]:          0 :                 if (found_key.objectid < min_objectid)
    5951                 :            :                         break;
    5952         [ #  # ]:          0 :                 if (found_key.type == type)
    5953                 :            :                         return 0;
    5954 [ #  # ][ #  # ]:          0 :                 if (found_key.objectid == min_objectid &&
    5955                 :            :                     found_key.type < type)
    5956                 :            :                         break;
    5957                 :            :         }
    5958                 :            :         return 1;
    5959                 :            : }
    5960                 :            : 
    5961                 :            : /*
    5962                 :            :  * search in extent tree to find a previous Metadata/Data extent item with
    5963                 :            :  * min objecitd.
    5964                 :            :  *
    5965                 :            :  * returns 0 if something is found, 1 if nothing was found and < 0 on error
    5966                 :            :  */
    5967                 :          0 : int btrfs_previous_extent_item(struct btrfs_root *root,
    5968                 :            :                         struct btrfs_path *path, u64 min_objectid)
    5969                 :            : {
    5970                 :            :         struct btrfs_key found_key;
    5971                 :          0 :         struct extent_buffer *leaf;
    5972                 :            :         u32 nritems;
    5973                 :            :         int ret;
    5974                 :            : 
    5975                 :            :         while (1) {
    5976         [ #  # ]:          0 :                 if (path->slots[0] == 0) {
    5977                 :          0 :                         btrfs_set_path_blocking(path);
    5978                 :          0 :                         ret = btrfs_prev_leaf(root, path);
    5979         [ #  # ]:          0 :                         if (ret != 0)
    5980                 :            :                                 return ret;
    5981                 :            :                 } else {
    5982                 :          0 :                         path->slots[0]--;
    5983                 :            :                 }
    5984                 :          0 :                 leaf = path->nodes[0];
    5985                 :            :                 nritems = btrfs_header_nritems(leaf);
    5986         [ #  # ]:          0 :                 if (nritems == 0)
    5987                 :            :                         return 1;
    5988         [ #  # ]:          0 :                 if (path->slots[0] == nritems)
    5989                 :          0 :                         path->slots[0]--;
    5990                 :            : 
    5991                 :          0 :                 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
    5992         [ #  # ]:          0 :                 if (found_key.objectid < min_objectid)
    5993                 :            :                         break;
    5994         [ #  # ]:          0 :                 if (found_key.type == BTRFS_EXTENT_ITEM_KEY ||
    5995                 :            :                     found_key.type == BTRFS_METADATA_ITEM_KEY)
    5996                 :            :                         return 0;
    5997 [ #  # ][ #  # ]:          0 :                 if (found_key.objectid == min_objectid &&
    5998                 :            :                     found_key.type < BTRFS_EXTENT_ITEM_KEY)
    5999                 :            :                         break;
    6000                 :            :         }
    6001                 :            :         return 1;
    6002                 :            : }

Generated by: LCOV version 1.9