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.