[libvirt] [PATCH 18/30] storagefile: Add externalDataStore member

Daniel Henrique Barboza danielhb413 at gmail.com
Fri Oct 11 14:27:50 UTC 2019



On 10/11/19 10:04 AM, Michal Privoznik wrote:
> On 10/10/19 5:09 PM, Daniel Henrique Barboza wrote:
>>
>>
>> On 10/7/19 6:49 PM, Cole Robinson wrote:
>>> Add the plumbing to track a externalDataStoreRaw as a virStorageSource
>>>
>>> Signed-off-by: Cole Robinson <crobinso at redhat.com>
>>> ---
>>>   src/util/virstoragefile.c | 9 +++++++++
>>>   src/util/virstoragefile.h | 3 +++
>>>   2 files changed, 12 insertions(+)
>>>
>>> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>>> index 7ae6719dd6..ce669b6e0b 100644
>>> --- a/src/util/virstoragefile.c
>>> +++ b/src/util/virstoragefile.c
>>> @@ -2339,6 +2339,12 @@ virStorageSourceCopy(const virStorageSource 
>>> *src,
>>>               return NULL;
>>>       }
>>> +    if (src->externalDataStore) {
>>> +        if (!(def->externalDataStore = 
>>> virStorageSourceCopy(src->externalDataStore,
>>> + true)))
>>> +            return NULL;
>>> +    }
>>> +
>>>       VIR_STEAL_PTR(ret, def);
>>>       return ret;
>>>   }
>>> @@ -2560,6 +2566,9 @@ virStorageSourceClear(virStorageSourcePtr def)
>>>       VIR_FREE(def->timestamps);
>>>       VIR_FREE(def->externalDataStoreRaw);
>>> +    virObjectUnref(def->externalDataStore);
>>> +    def->externalDataStore = NULL;
>>
>> Is this assign to NULL necessary? virObjectUnref will call VIR_FREE() in
>> def->externalDataStore if there is no more references to it (which will
>> assign it to NULL in the end).
>
> It is. Point of virXXXClear() functions is to clear passed struct. 
> That is, in theory (I'm not saying it's the case of 
> virStorageSourceDef and also I'm not saying it isn't), it should be 
> possible to re-use a structure after it's been cleared. But for that 
> to happen, all poitners must be reset to NULL regardless of 
> refcounters and stuff.
>

Got it. I didn't get across an example of this re-use yet, didn't know 
it is a
valid possibility.

> However, there's a memset() called at the end of this function which 
> sets all members of this struct to 0, so in the end I agree that the 
> line is redundant, but for a different reason :-D
>


I was right in the end! That all I'm going to remember ;)


DHB


> Michal




More information about the libvir-list mailing list