Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b6602e7 authored by Jan Schmidt's avatar Jan Schmidt
Browse files

Btrfs: determine level of old roots



In btrfs_find_all_roots' termination condition, we compare the level of the
old buffer we got from btrfs_search_old_slot to the level of the current
root node. We'd better compare it to the level of the rewinded root node.

Signed-off-by: default avatarJan Schmidt <list.btrfs@jan-o-sch.net>
parent 834328a8
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -283,9 +283,7 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
		goto out;
	}

	rcu_read_lock();
	root_level = btrfs_header_level(root->node);
	rcu_read_unlock();
	root_level = btrfs_old_root_level(root, time_seq);

	if (root_level + 1 == level)
		goto out;
+17 −0
Original line number Diff line number Diff line
@@ -1297,6 +1297,23 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
	return eb;
}

int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq)
{
	struct tree_mod_elem *tm;
	int level;

	tm = __tree_mod_log_oldest_root(root->fs_info, root, time_seq);
	if (tm && tm->op == MOD_LOG_ROOT_REPLACE) {
		level = tm->old_root.level;
	} else {
		rcu_read_lock();
		level = btrfs_header_level(root->node);
		rcu_read_unlock();
	}

	return level;
}

static inline int should_cow_block(struct btrfs_trans_handle *trans,
				   struct btrfs_root *root,
				   struct extent_buffer *buf)
+1 −0
Original line number Diff line number Diff line
@@ -3120,6 +3120,7 @@ static inline u64 btrfs_inc_tree_mod_seq(struct btrfs_fs_info *fs_info)
{
	return atomic_inc_return(&fs_info->tree_mod_seq);
}
int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq);

/* root-item.c */
int btrfs_find_root_ref(struct btrfs_root *tree_root,