On 2020/3/5 上午12:18, Josef Bacik wrote: > If we do merge_reloc_roots() we could insert a few roots onto the dirty > subvol roots list, where we hold a ref on them. If we fail to start the > transaction we need to run clean_dirty_subvols() in order to cleanup the > refs. > > Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo Thanks, Qu > --- > fs/btrfs/relocation.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c > index f6237d885fe0..53509c367eff 100644 > --- a/fs/btrfs/relocation.c > +++ b/fs/btrfs/relocation.c > @@ -4279,10 +4279,10 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc) > goto out_free; > } > btrfs_commit_transaction(trans); > +out_free: > ret = clean_dirty_subvols(rc); > if (ret < 0 && !err) > err = ret; > -out_free: > btrfs_free_block_rsv(fs_info, rc->block_rsv); > btrfs_free_path(path); > return err; > @@ -4711,6 +4711,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) > > trans = btrfs_join_transaction(rc->extent_root); > if (IS_ERR(trans)) { > + clean_dirty_subvols(rc); > err = PTR_ERR(trans); > goto out_free; > } >