[libvirt] [PATCH 1/4] cmdVolCreateAs: Rework to follow usual func pattern
Erik Skultety
eskultet at redhat.com
Fri Feb 12 14:48:59 UTC 2016
On 12/02/16 15:22, Michal Privoznik wrote:
> On 12.02.2016 14:17, Erik Skultety wrote:
>> On 10/02/16 17:28, Michal Privoznik wrote:
>>> The way we usually write functions is that we start the work and
>>> if something goes bad we goto cleanup and roll back there. Or
>>> just free resources that are no longer needed. Do the same here.
>>>
>>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>>> ---
>>> tools/virsh-volume.c | 24 ++++++++++++------------
>>> 1 file changed, 12 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
>>> index 35f0cbd..569f555 100644
>>> --- a/tools/virsh-volume.c
>>> +++ b/tools/virsh-volume.c
>>> @@ -211,14 +211,15 @@ static bool
>>> cmdVolCreateAs(vshControl *ctl, const vshCmd *cmd)
>>> {
>>> virStoragePoolPtr pool;
>>> - virStorageVolPtr vol;
>>> - char *xml;
>>> + virStorageVolPtr vol = NULL;
>>> + char *xml = NULL;
>>> const char *name, *capacityStr = NULL, *allocationStr = NULL, *format = NULL;
>>> const char *snapshotStrVol = NULL, *snapshotStrFormat = NULL;
>>> unsigned long long capacity, allocation = 0;
>>> virBuffer buf = VIR_BUFFER_INITIALIZER;
>>> unsigned long flags = 0;
>>> virshControlPtr priv = ctl->privData;
>>> + bool ret = false;
>>>
>>> if (vshCommandOptBool(cmd, "prealloc-metadata"))
>>> flags |= VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA;
>>> @@ -335,23 +336,22 @@ cmdVolCreateAs(vshControl *ctl, const vshCmd *cmd)
>>> goto cleanup;
>>> }
>>> xml = virBufferContentAndReset(&buf);
>>> - vol = virStorageVolCreateXML(pool, xml, flags);
>>> - VIR_FREE(xml);
>>> - virStoragePoolFree(pool);
>>>
>>> - if (vol != NULL) {
>>> - vshPrint(ctl, _("Vol %s created\n"), name);
>>> - virStorageVolFree(vol);
>>> - return true;
>>> - } else {
>>> + if (!(vol = virStorageVolCreateXML(pool, xml, flags))) {
>>> vshError(ctl, _("Failed to create vol %s"), name);
>>> - return false;
>>> + goto cleanup;
>>> }
>>>
>>> + vshPrint(ctl, _("Vol %s created\n"), name);
>>> + ret = true;
>>> +
>>> cleanup:
>>> virBufferFreeAndReset(&buf);
>>> + if (vol)
>>
>> Looking at virStorageVolFree, this bit ^^^ is really unnecessary to have
>> here. I mean, yeah, it can return -1, but we never test for it.
>> In fact, it can return -1 only if the pointer is NULL or the object is
>> of a different instance than it should be, and in your case, you don't
>> care about the former and that kind of check certainly wouldn't avoid
>> trying to unref the latter. The sad thing is, we're inconsistent in
>> usage of this throughout modules.
>
> I think we are consistent. I wasn't able to find any occurrence where we
> could call virStorageVolFree() over NULL. Secondly, it's important to
> check it so that we don't poison logs.
Indeed, let's pretend I didn't say anything before.
Erik
For instance, if something goes
> wrong, we print an error message. But there's no point in printing
> another one just because we are lazy to put a check there. Yes, we are
> not checking for the return value of virStorageVolFree() itself, but we
> never do that and I bet you couldn't find anyone really doing that.
> That's why I think we are safe to teach our public free APIs to take
> NULL, but that's a different cup of tea.
>
> Long story short, I think we should stay consistent and have the check
> there.
>
> Michal
>
More information about the libvir-list
mailing list