[Libvirt-cim] [PATCH v2] Fix AppliedFilterList creation and deletion

Eduardo Lima (Etrunko) eblima at linux.vnet.ibm.com
Thu Jan 26 16:08:43 UTC 2012


On 01/26/2012 12:58 PM, Chip Vincent wrote:
> From: Chip Vincent <cvincent at us.ibm.com>
> 
> Fixes many small issues with the current AppliedFilterList provider.
> 
> 1) Fix Create to properly return a complete object path and fix Delete to
>    properly parse that path.
> 
> 2) Persist applied filer rules. Since it's not possible to dyanmically update
>    a single device, I've changed the code to modify and re-define the VM to
>    essentially add/remove ACL filter associations.
> 
>    I also updated the code to minimize domain/device parsing overhead. For
>    some strange reason, our internal APIs sometimes take a virDomainPtr and
>    other times a struct domain * forcing providers who work with domains
>    *and* devices to parse everything twice. Until the internal APIs are
>    cleaned up, I simply parse everything once and then fetch the device
>    manually from the struct domain *.
> 
> 3) Add VIR_DOMAIN_XML_INACTIVE to virDomainGetXML(). By default, libvirt only
>    returns the XML of the running domain. We need to fetch the *stored* XML
>    that will be used for the next boot so that all changes made while the VM
>    is running are preserved.
> 
> Changes from v1:
>  - Fix leak and other comments
>  - Fix all cases virDomainGetXML()
>  - Fix NestedFilterList Create/Delete instance

Almost there, see below:

[snip]

> diff --git a/src/Virt_NestedFilterList.c b/src/Virt_NestedFilterList.c
> index 894cd7c..b72c582 100644
> --- a/src/Virt_NestedFilterList.c
> +++ b/src/Virt_NestedFilterList.c
> @@ -98,7 +98,10 @@ static CMPIrc cu_get_ref_path(const CMPIObjectPath *reference,
>          if ((s.rc != CMPI_RC_OK) || CMIsNullValue(value))
>                  return CMPI_RC_ERR_NO_SUCH_PROPERTY;
> 
> -        /* how to parse and object path? */
> +        if ((value.type != CMPI_ref) ||  CMIsNullObject(value.value.ref))
> +                return CMPI_RC_ERR_TYPE_MISMATCH;
> +
> +        *_reference = value.value.ref;
> 
>          return CMPI_RC_OK;
>  }
> @@ -305,6 +308,7 @@ static CMPIStatus CreateInstance(
>          const char *child_name = NULL;
>          struct acl_filter *child_filter = NULL;
>          virConnectPtr conn = NULL;
> +        CMPIObjectPath *_reference = NULL;
> 
>          CU_DEBUG("Reference = %s", REF2STR(reference));
> 
> @@ -383,6 +387,11 @@ static CMPIStatus CreateInstance(
>                  goto out;
>          }
> 
> +        /* create new object path */
> +        _reference = CMClone(reference, NULL);
> +        CMAddKey(_reference, "Antecedent", (CMPIValue *)&antecedent, CMPI_ref);
> +        CMAddKey(_reference, "Dependent", (CMPIValue *)&dependent, CMPI_ref);
> +
>          CMReturnObjectPath(results, reference);

Should be returning _reference right?

Another question, is it necessary to free the _reference variable
somehow? Looking at Pegasus headers, I can see a CMRelease declaration
near CMClone.

-- 
Eduardo de Barros Lima
Software Engineer, Open Virtualization
Linux Technology Center - IBM/Brazil
eblima at br.ibm.com




More information about the Libvirt-cim mailing list