* We don't know the level of the root node until we actually
                 * have it read locked
                 */
-               b = btrfs_read_lock_root_node(root);
+               b = __btrfs_read_lock_root_node(root, p->recurse);
                level = btrfs_header_level(b);
                if (level > write_lock_level)
                        goto out;
                        } else {
                                if (!btrfs_tree_read_lock_atomic(b)) {
                                        btrfs_set_path_blocking(p);
-                                       btrfs_tree_read_lock(b);
+                                       __btrfs_tree_read_lock(b, p->recurse);
                                }
                                p->locks[level] = BTRFS_READ_LOCK;
                        }
                        }
                        if (!ret) {
                                btrfs_set_path_blocking(path);
-                               btrfs_tree_read_lock(next);
+                               __btrfs_tree_read_lock(next, path->recurse);
                        }
                        next_rw_lock = BTRFS_READ_LOCK;
                }
                        ret = btrfs_try_tree_read_lock(next);
                        if (!ret) {
                                btrfs_set_path_blocking(path);
-                               btrfs_tree_read_lock(next);
+                               __btrfs_tree_read_lock(next, path->recurse);
                        }
                        next_rw_lock = BTRFS_READ_LOCK;
                }
 
        unsigned int search_commit_root:1;
        unsigned int need_commit_sem:1;
        unsigned int skip_release_on_error:1;
+       unsigned int recurse:1;
 };
 #define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r->fs_info) >> 4) - \
                                        sizeof(struct btrfs_item))
                             struct btrfs_path *path,
                             const struct btrfs_key *new_key);
 struct extent_buffer *btrfs_root_node(struct btrfs_root *root);
-struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root);
-struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root);
 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
                        struct btrfs_key *key, int lowest_level,
                        u64 min_trans);
 
         */
        path->leave_spinning = 1;
 
+       path->recurse = btrfs_is_free_space_inode(inode);
+
        ret = btrfs_lookup_file_extent(NULL, root, path, objectid, start, 0);
        if (ret < 0) {
                goto out;
 
  *
  * The rwlock is held upon exit.
  */
-void btrfs_tree_read_lock(struct extent_buffer *eb)
+void __btrfs_tree_read_lock(struct extent_buffer *eb, bool recurse)
 {
        u64 start_ns = 0;
 
                         * depends on this as it may be called on a partly
                         * (write-)locked tree.
                         */
+                       WARN_ON(!recurse);
                        BUG_ON(eb->lock_recursed);
                        eb->lock_recursed = true;
                        read_unlock(&eb->lock);
        trace_btrfs_tree_read_lock(eb, start_ns);
 }
 
+void btrfs_tree_read_lock(struct extent_buffer *eb)
+{
+       __btrfs_tree_read_lock(eb, false);
+}
+
 /*
  * Lock extent buffer for read, optimistically expecting that there are no
  * contending blocking writers. If there are, don't wait.
  *
  * Return: root extent buffer with read lock held
  */
-struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root)
+struct extent_buffer *__btrfs_read_lock_root_node(struct btrfs_root *root,
+                                                 bool recurse)
 {
        struct extent_buffer *eb;
 
        while (1) {
                eb = btrfs_root_node(root);
-               btrfs_tree_read_lock(eb);
+               __btrfs_tree_read_lock(eb, recurse);
                if (eb == root->node)
                        break;
                btrfs_tree_read_unlock(eb);
 
 void btrfs_tree_lock(struct extent_buffer *eb);
 void btrfs_tree_unlock(struct extent_buffer *eb);
 
+void __btrfs_tree_read_lock(struct extent_buffer *eb, bool recurse);
 void btrfs_tree_read_lock(struct extent_buffer *eb);
 void btrfs_tree_read_unlock(struct extent_buffer *eb);
 void btrfs_tree_read_unlock_blocking(struct extent_buffer *eb);
 int btrfs_try_tree_read_lock(struct extent_buffer *eb);
 int btrfs_try_tree_write_lock(struct extent_buffer *eb);
 int btrfs_tree_read_lock_atomic(struct extent_buffer *eb);
+struct extent_buffer *btrfs_lock_root_node(struct btrfs_root *root);
+struct extent_buffer *__btrfs_read_lock_root_node(struct btrfs_root *root,
+                                                 bool recurse);
+
+static inline struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root)
+{
+       return __btrfs_read_lock_root_node(root, false);
+}
 
 #ifdef CONFIG_BTRFS_DEBUG
 static inline void btrfs_assert_tree_locked(struct extent_buffer *eb) {