Message ID | 20200304161830.2360-6-josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | relocation error handling fixes | expand |
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 <josef@toxicpanda.com> Reviewed-by: Qu Wenruo <wqu@suse.com> 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; > } >
On Wed, Mar 04, 2020 at 11:18:27AM -0500, 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 <josef@toxicpanda.com> > --- > 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; > } The update to btrfs_recover_relocation should follow the same pattern, like @@ -4682,12 +4682,12 @@ 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; + goto out_clean; } err = btrfs_commit_transaction(trans); +out_clean: ret = clean_dirty_subvols(rc); if (ret < 0 && !err) err = ret;
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; }
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 <josef@toxicpanda.com> --- fs/btrfs/relocation.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)