[Libvirt-cim] [PATCH 4/4] DevicePool, reimplement get_diskpool_config with libvirt
Wenchao Xia
xiawenc at linux.vnet.ibm.com
Fri Oct 26 06:26:56 UTC 2012
于 2012-10-24 20:58, Eduardo Lima (Etrunko) 写道:
> On Wed, Oct 24, 2012 at 3:52 AM, Wenchao Xia <xiawenc at linux.vnet.ibm.com> wrote:
>>
>>> 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.
>
> No, if count is 0 the for will never be executed, this is basic C.
> There is no need to test count before starting the loop. See test
> attached. As for coding style, when you know the number of iterations,
> the for loop it is much more readable and easier to maintain.
>
My mistake, I must have read it from some mis guiding books, for will
look better.
>> 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).
>>
>
> Yes, I reported this a long time ago, the tests _only_ fail if you
> have SELinux enabled. Try disabling it and running again to check the
> results.
>
Perhaps SeLinux is another trigger of the cimtest error, Just found
that there is some problem if libvirt-cim call libvirt event
API, if I comment it out, test pass, otherwise fail, so will send a
patch bring back libvirt-cim CSI, and leave libvirt event CSI as
2nd option.
> Cheers,
>
--
Best Regards
Wenchao Xia
More information about the Libvirt-cim
mailing list