[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.

Thanks,
Qu

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to