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

Commit ba1bfbd5 authored by Jan Schmidt's avatar Jan Schmidt
Browse files

Btrfs: fix a tree mod logging issue for root replacement operations



Avoid the implicit free by tree_mod_log_set_root_pointer, which is wrong in
two places. Where needed, we call tree_mod_log_free_eb explicitly now.

Signed-off-by: default avatarJan Schmidt <list.btrfs@jan-o-sch.net>
parent 57911b8b
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -647,8 +647,6 @@ tree_mod_log_insert_root(struct btrfs_fs_info *fs_info,
	if (tree_mod_dont_log(fs_info, NULL))
		return 0;

	__tree_mod_log_free_eb(fs_info, old_root);

	ret = tree_mod_alloc(fs_info, flags, &tm);
	if (ret < 0)
		goto out;
@@ -926,11 +924,6 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
			ret = btrfs_dec_ref(trans, root, buf, 1, 1);
			BUG_ON(ret); /* -ENOMEM */
		}
		/*
		 * don't log freeing in case we're freeing the root node, this
		 * is done by tree_mod_log_set_root_pointer later
		 */
		if (buf != root->node && btrfs_header_level(buf) != 0)
		tree_mod_log_free_eb(root->fs_info, buf);
		clean_tree_block(trans, root, buf);
		*last_ref = 1;
@@ -1728,6 +1721,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
			goto enospc;
		}

		tree_mod_log_free_eb(root->fs_info, root->node);
		tree_mod_log_set_root_pointer(root, child);
		rcu_assign_pointer(root->node, child);