[PATCH] storage: volStorageBackendRBDRefreshVolInfo: refactor

Laine Stump laine at redhat.com
Sun Jan 10 06:25:16 UTC 2021


On 1/8/21 7:59 AM, Ján Tomko wrote:
> On a Friday in 2021, Yi Li wrote:
>> use the ret variable for return value
>>
>> Signed-off-by: Yi Li <yili at winhong.com>
>> ---
>> src/storage/storage_backend_rbd.c | 22 ++++++----------------
>> 1 file changed, 6 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/storage/storage_backend_rbd.c 
>> b/src/storage/storage_backend_rbd.c
>> index 1630d6eede..22f5c78591 100644
>> --- a/src/storage/storage_backend_rbd.c
>> +++ b/src/storage/storage_backend_rbd.c
>> @@ -507,36 +507,30 @@ 
>> volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>>                                    virStoragePoolObjPtr pool,
>>                                    virStorageBackendRBDStatePtr ptr)
>> {
>> -    int rc, ret = -1;
>> +    int ret = -1;
>>     virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
>>     rbd_image_t image = NULL;
>>     rbd_image_info_t info;
>>     uint64_t features;
>>     uint64_t flags;
>>
>> -    if ((rc = rbd_open_read_only(ptr->ioctx, vol->name, &image, 
>> NULL)) < 0) {
>> -        ret = rc;
>
> The old version was repetitive, but it made it obvious that we want to
> propagate the error value only on error.
>
> More importantly, most of libvirt code only touches 'ret' twice:
> * it is initialized to zero


That didn't sound right, so I looked it up - grep says that we have 112 
instances of ret initialized to 0, but 1479 instances of ret initialized 
to -1. Was that a typo?


> * it is assigned to exactly once
>
> That way there is no leftover success value that could be mistakenly
> used if someone forgets to reset 'ret' to -1.


... a statement which makes sense (to me) only if you actually meant to 
say "initialized to -1".


(And yes, I agree with your reasoning.)


> (The opposite case that could happen with the old approachif someone
> were to forget to propagate the error is that a harmless error would not
> be ignored, which is IMO less severe than ignoring a legitimate error)


I'm not quite parsing everything you're saying here (maybe because it's 
1AM Sunday morning :-), but I agree it's better the way it was. But even 
better than your proposal to revert this patch would be to carry it even 
further - remove the "ret =" from each rbd function call, and then add a 
"ret = 0;" just before the cleanup label. (I just suggested this in my 
response to your "revert" patch).



>
> Jano
>
>> +    if ((ret = rbd_open_read_only(ptr->ioctx, vol->name, &image, 
>> NULL)) < 0) {
>>         virReportSystemError(errno, _("failed to open the RBD image 
>> '%s'"),
>>                              vol->name);
>>         goto cleanup;
>>     }
>>
>> -    if ((rc = rbd_stat(image, &info, sizeof(info))) < 0) {
>> -        ret = rc;
>> +    if ((ret = rbd_stat(image, &info, sizeof(info))) < 0) {
>>         virReportSystemError(errno, _("failed to stat the RBD image 
>> '%s'"),
>>                              vol->name);
>>         goto cleanup;
>>     }
>>
>> -    if ((rc = volStorageBackendRBDGetFeatures(image, vol->name, 
>> &features)) < 0) {
>> -        ret = rc;
>> +    if ((ret = volStorageBackendRBDGetFeatures(image, vol->name, 
>> &features)) < 0)
>>         goto cleanup;
>> -    }
>>
>> -    if ((rc = volStorageBackendRBDGetFlags(image, vol->name, 
>> &flags)) < 0) {
>> -        ret = rc;
>> +    if ((ret = volStorageBackendRBDGetFlags(image, vol->name, 
>> &flags)) < 0)
>>         goto cleanup;
>> -    }
>>
>>     vol->target.capacity = info.size;
>>     vol->type = VIR_STORAGE_VOL_NETWORK;
>> @@ -549,10 +543,8 @@ 
>> volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>>                   "Querying for actual allocation",
>>                   def->source.name, vol->name);
>>
>> -        if ((rc = virStorageBackendRBDSetAllocation(vol, image, 
>> &info)) < 0) {
>> -            ret = rc;
>> +        if ((ret = virStorageBackendRBDSetAllocation(vol, image, 
>> &info)) < 0)
>>             goto cleanup;
>> -        }
>>     } else {
>>         vol->target.allocation = info.obj_size * info.num_objs;
>>     }
>> @@ -568,8 +560,6 @@ 
>> volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>>     VIR_FREE(vol->key);
>>     vol->key = g_strdup_printf("%s/%s", def->source.name, vol->name);
>>
>> -    ret = 0;
>> -
>>  cleanup:
>>     if (image)
>>         rbd_close(image);
>> -- 
>> 2.25.3
>>
>>
>>
>>




More information about the libvir-list mailing list