On Thu, Feb 28, 2019 at 10:08:57AM +0800, Qu Wenruo wrote:
> [snip]
> >>    ret = radix_tree_preload(GFP_NOFS);
> >> -  if (ret)
> >> -          goto free_eb;
> >> +  if (ret) {
> >> +          btrfs_release_extent_buffer(eb);
> >> +          return ERR_PTR(ret);
> >> +  }
> >>    spin_lock(&fs_info->buffer_lock);
> >>    ret = radix_tree_insert(&fs_info->buffer_radix,
> >>                            start >> PAGE_SHIFT, eb);
> >> @@ -4875,21 +4892,26 @@ struct extent_buffer 
> >> *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
> >>    radix_tree_preload_end();
> >>    if (ret == -EEXIST) {
> >>            exists = find_extent_buffer(fs_info, start);
> >> -          if (exists)
> >> -                  goto free_eb;
> >> -          else
> >> -                  goto again;
> >> +          if (exists) {
> >> +                  btrfs_release_extent_buffer(eb);
> >> +                  return exists;
> >> +          }
> >> +          goto again;
> >>    }
> >>    check_buffer_tree_ref(eb);
> >>    set_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags);
> >>  
> >>    return eb;
> >> -free_eb:
> >> -  btrfs_release_extent_buffer(eb);
> >> -  return exists;
> > 
> > Changes in this functions are more than just the conversion, namely
> > undoing the common exit block and adding the inline returns. These are
> > different logical things so I'd rather see that in a separate patch.
> > Thanks.
> 
> This part is not just undoing the goto branch.
> 
> For the error just after radix_tree_preload(GFP_NOFS), we're doing error
> out.
> 
> For the return after find_extent_buffer(), we're returning valid found eb.
> 
> The old code is abusing the exit for both error out and found case.
> Due to the change to ERR_PTR(), we can on longer follow that abuse any
> more, thus I have to remove the old free_eb label.

If you set exists to the ERR_PTR then the same code path is taken, this
is the exit block pattern. But the function is short and understandable
with the returns, so I'm ok with your version.

Reply via email to