On 17.01.20 г. 23:25 ч., Josef Bacik wrote:
> Relocation has it's special roots, we don't want to save these in the
> root cache either, so swap it to use btrfs_read_tree_roo(). However the
btrfs_read_fs_root has really turned into a simple wrapper across
btrfs_read_tree_root so that's the main reason why you convert it.
> reloc root does need REF_COWS set, so make sure we set it everywhere we
> use this helper, as it no longer does the REF_COWS setting.
>
> Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
The only thing that this sequence misses is calling
btrfs_check_and_init_root_item, but since it's used to work around a bug
in older btrfs versions We can simply ignore it. LGTM:
Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx>
> ---
> fs/btrfs/relocation.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> index 995d4b8b1cfd..aa3aa8e0c0ea 100644
> --- a/fs/btrfs/relocation.c
> +++ b/fs/btrfs/relocation.c
> @@ -1447,8 +1447,9 @@ static struct btrfs_root *create_reloc_root(struct btrfs_trans_handle *trans,
> BUG_ON(ret);
> kfree(root_item);
>
> - reloc_root = btrfs_read_fs_root(fs_info->tree_root, &root_key);
> + reloc_root = btrfs_read_tree_root(fs_info->tree_root, &root_key);
> BUG_ON(IS_ERR(reloc_root));
> + set_bit(BTRFS_ROOT_REF_COWS, &reloc_root->state);
> reloc_root->last_trans = trans->transid;
> return reloc_root;
> }
> @@ -4537,12 +4538,13 @@ int btrfs_recover_relocation(struct btrfs_root *root)
> key.type != BTRFS_ROOT_ITEM_KEY)
> break;
>
> - reloc_root = btrfs_read_fs_root(root, &key);
> + reloc_root = btrfs_read_tree_root(root, &key);
> if (IS_ERR(reloc_root)) {
> err = PTR_ERR(reloc_root);
> goto out;
> }
>
> + set_bit(BTRFS_ROOT_REF_COWS, &reloc_root->state);
> list_add(&reloc_root->root_list, &reloc_roots);
>
> if (btrfs_root_refs(&reloc_root->root_item) > 0) {
>