[Libvirt-cim] Fwd: Re: [PATCH 4/4] DevicePool, reimplement get_diskpool_config with libvirt

Wenchao Xia xiawenc at linux.vnet.ibm.com
Wed Oct 24 05:52:11 UTC 2012


> On Mon, Oct 22, 2012 at 5:38 AM, Wenchao Xia <xiawenc at linux.vnet.ibm.com> wrote:
>>    Oringinal implement have risk, this patch should fix it
>>
>> Signed-off-by: Wenchao Xia <xiawenc at linux.vnet.ibm.com>
>> ---
>>   src/Virt_DevicePool.c |   47 +++++++++++++++++++++++++++++++++++------------
>>   1 files changed, 35 insertions(+), 12 deletions(-)
>>
>> diff --git a/src/Virt_DevicePool.c b/src/Virt_DevicePool.c
>> index 79dc108..0cb9124 100644
>> --- a/src/Virt_DevicePool.c
>> +++ b/src/Virt_DevicePool.c
>> @@ -117,52 +117,75 @@ int get_disk_pool(virStoragePoolPtr poolptr, struct virt_pool **pool)
>>           return ret;
>>   }
>>
>> +/* This function returns the real number of pools, no negative value should be
>> +   returned, if error happens it returns zero. */
>>   static int get_diskpool_config(virConnectPtr conn,
>>                                  struct tmp_disk_pool **_pools)
>>   {
>> -        int count = 0;
>> +        int count = 0, realcount = 0;
>>           int i;
>>           char ** names = NULL;
>>           struct tmp_disk_pool *pools = NULL;
>> +        int have_err = 0;
>>
>>           count = virConnectNumOfStoragePools(conn);
>> -        if (count <= 0)
>> +        if (count <= 0) {
>> +                have_err = 1;
>>                   goto out;
>> +        }
>>
>>           names = calloc(count, sizeof(char *));
>>           if (names == NULL) {
>>                   CU_DEBUG("Failed to alloc space for %i pool names", count);
>>                   count = 0;
>> +                have_err = 1;
>>                   goto out;
>>           }
>>
>> -        if (virConnectListStoragePools(conn, names, count) == -1) {
>> +        realcount = virConnectListStoragePools(conn, names, count);
>> +        if (realcount == -1) {
>>                   CU_DEBUG("Failed to get storage pools");
>> -                count = 0;
>> +                realcount = 0;
>> +                have_err = 1;
>> +                goto out;
>> +        }
>> +        if (realcount == 0) {
>> +                CU_DEBUG("zero pools got, but prelist is %d.", count);
>>                   goto out;
>>           }
>>
>> -        pools = calloc(count, sizeof(*pools));
>> +        pools = calloc(realcount, sizeof(*pools));
>>           if (pools == NULL) {
>> -                CU_DEBUG("Failed to alloc space for %i pool structs", count);
>> +                CU_DEBUG("Failed to alloc space for %i pool structs", realcount);
>> +                realcount = 0;
>> +                have_err = 1;
>>                   goto out;
>>           }
>>
>> -        for (i = 0; i < count; i++) {
>> +        i = 0;
>> +        while (i < realcount) {
>>                   pools[i].tag = strdup(names[i]);
>>                   pools[i].primordial = false;
>> +                i++;
>>           }
>
> Any specific reason for changing the for() loop for a while() one??
>
>>
>>    out:
>> -        for (i = 0; i < count; i++)
>> -                free(names[i]);
>> -        free(names);
>> +        if (count > 0) {
>> +                i = 0;
>> +                while (i < count) {
>> +                        free(names[i]);
>> +                        i++;
>> +                }
>> +                free(names);
>> +        }
>
> Same here.
>
> Best regards,
>

   Good to see you again, there is one for() before which may take
one execution if count == 0,where it should not. For safe and code
style unifying I switch it all to while.
   I am tring to fix some bugs after libvirt CSI patch applied, which
make cimtest report strange error, A bit brute, could u help share some
  findings for those strange errors? (2 profile test case failing
strangely, if CSI test case is executed with CSI patched libvirt-cim).

-- 
Best Regards

Wenchao Xia






More information about the Libvirt-cim mailing list