[Libvirt-cim] [PATCH 4/4] DevicePool, reimplement get_diskpool_config with libvirt
snmishra at linux.vnet.ibm.com
snmishra at linux.vnet.ibm.com
Mon Oct 22 18:22:50 UTC 2012
-1
This patch makes it impossible for called to know if "0" was returned
as a result of a failure or no diskpools were found.
I recommend returning "-1" in error and update the patch to make sure
that calling functions are handling a return value of -1 properly.
-Sharad Mishra
Quoting Wenchao Xia <xiawenc at linux.vnet.ibm.com>:
> 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++;
> }
>
> 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);
> + }
>
> - get_disk_parent(&pools, &count);
> + if (have_err == 0) {
> + get_disk_parent(&pools, &realcount);
> + }
>
> *_pools = pools;
>
> - return count;
> + return realcount;
> }
>
> static bool diskpool_set_capacity(virConnectPtr conn,
> --
> 1.7.1
>
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
More information about the Libvirt-cim
mailing list