[libvirt] [PATCH 04/21] Allow for a driver specific private data blob in virDomainObjPtr
Daniel Veillard
veillard at redhat.com
Wed Oct 28 16:29:59 UTC 2009
On Fri, Oct 23, 2009 at 02:05:33PM +0100, Daniel P. Berrange wrote:
> The virDomainObjPtr object stores state about a running domain.
> This object is shared across all drivers so it is not appropriate
> to include driver specific state here. This patch adds the ability
> to request a blob of private data per domain object instance. The
> driver must provide a allocator & deallocator for this purpose
>
> THis patch abuses the virCapabilitiesPtr structure for storing the
> allocator/deallocator callbacks, since it is already being abused
> for other internal things relating to parsing. This should be moved
> out into a separate object at some point.
>
> * src/conf/capabilities.h: Add privateDataAllocFunc and
> privateDataFreeFunc fields
> * src/conf/domain_conf.c: Invoke the driver allocators / deallocators
> when creating/freeing virDomainObjPtr instances.
> * src/conf/domain_conf.h: Pass virCapsPtr into virDomainAssignDef
> to allow access to the driver specific allocator function
> * src/lxc/lxc_driver.c, src/opennebula/one_driver.c,
> src/openvz/openvz_driver.c, src/qemu/qemu_driver.c,
> src/test/test_driver.c, src/uml/uml_driver.c: Update for
> change in virDomainAssignDef contract
> ---
> src/conf/capabilities.h | 2 ++
> src/conf/domain_conf.c | 23 +++++++++++++++++++----
> src/conf/domain_conf.h | 4 ++++
> src/lxc/lxc_driver.c | 6 ++++--
> src/opennebula/one_driver.c | 6 ++++--
> src/openvz/openvz_driver.c | 6 ++++--
> src/qemu/qemu_driver.c | 5 +++++
> src/test/test_driver.c | 15 ++++++++++-----
> src/uml/uml_driver.c | 2 ++
> 9 files changed, 54 insertions(+), 15 deletions(-)
>
> diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
> index 2f24605..7234cf4 100644
> --- a/src/conf/capabilities.h
> +++ b/src/conf/capabilities.h
> @@ -115,6 +115,8 @@ struct _virCaps {
> virCapsGuestPtr *guests;
> unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
> unsigned int emulatorRequired : 1;
> + void *(*privateDataAllocFunc)(void);
> + void (*privateDataFreeFunc)(void *);
> };
>
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index de07e13..0dd2b3f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -594,12 +594,16 @@ void virDomainObjFree(virDomainObjPtr dom)
>
> VIR_FREE(dom->vcpupids);
>
> + if (dom->privateDataFreeFunc)
> + (dom->privateDataFreeFunc)(dom->privateData);
> +
> virMutexDestroy(&dom->lock);
>
> VIR_FREE(dom);
> }
>
> -static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
> +static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
> + virCapsPtr caps)
> {
> virDomainObjPtr domain;
>
> @@ -608,9 +612,19 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
> return NULL;
> }
>
> + if (caps->privateDataAllocFunc &&
> + !(domain->privateData = (caps->privateDataAllocFunc)())) {
> + virReportOOMError(conn);
> + VIR_FREE(domain);
> + return NULL;
> + }
> + domain->privateDataFreeFunc = caps->privateDataFreeFunc;
> +
> if (virMutexInit(&domain->lock) < 0) {
> virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> "%s", _("cannot initialize mutex"));
> + if (domain->privateDataFreeFunc)
> + (domain->privateDataFreeFunc)(domain->privateData);
> VIR_FREE(domain);
> return NULL;
> }
> @@ -624,6 +638,7 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
> }
>
> virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
> + virCapsPtr caps,
> virDomainObjListPtr doms,
> const virDomainDefPtr def)
> {
> @@ -643,7 +658,7 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
> return domain;
> }
>
> - if (!(domain = virDomainObjNew(conn)))
> + if (!(domain = virDomainObjNew(conn, caps)))
> return NULL;
> domain->def = def;
>
> @@ -3187,7 +3202,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
> xmlNodePtr *nodes = NULL;
> int n, i;
>
> - if (!(obj = virDomainObjNew(conn)))
> + if (!(obj = virDomainObjNew(conn, caps)))
> return NULL;
>
> if (!(config = virXPathNode(conn, "./domain", ctxt))) {
> @@ -4768,7 +4783,7 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn,
> newVM = 0;
> }
>
> - if (!(dom = virDomainAssignDef(conn, doms, def)))
> + if (!(dom = virDomainAssignDef(conn, caps, doms, def)))
> goto error;
>
> dom->autostart = autostart;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 389e259..8a8bfb0 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -636,6 +636,9 @@ struct _virDomainObj {
>
> virDomainDefPtr def; /* The current definition */
> virDomainDefPtr newDef; /* New definition to activate at shutdown */
> +
> + void *privateData;
> + void (*privateDataFreeFunc)(void *);
> };
>
> typedef struct _virDomainObjList virDomainObjList;
> @@ -678,6 +681,7 @@ void virDomainDefFree(virDomainDefPtr vm);
> void virDomainObjFree(virDomainObjPtr vm);
>
> virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
> + virCapsPtr caps,
> virDomainObjListPtr doms,
> const virDomainDefPtr def);
> void virDomainRemoveInactive(virDomainObjListPtr doms,
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 4f0787b..116f3ae 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -315,7 +315,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
> goto cleanup;
> }
>
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, def)))
> goto cleanup;
> def = NULL;
> vm->persistent = 1;
> @@ -1312,7 +1313,8 @@ lxcDomainCreateAndStart(virConnectPtr conn,
> }
>
>
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, def)))
> goto cleanup;
> def = NULL;
>
> diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
> index 0b807ad..beb48ce 100644
> --- a/src/opennebula/one_driver.c
> +++ b/src/opennebula/one_driver.c
> @@ -235,7 +235,8 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)
> VIR_DOMAIN_XML_INACTIVE)))
> goto return_point;
>
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, def))) {
> virDomainDefFree(def);
> goto return_point;
> }
> @@ -439,7 +440,8 @@ oneDomainCreateAndStart(virConnectPtr conn,
> goto return_point;
> }
>
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, def))) {
> virDomainDefFree(def);
> goto return_point;
> }
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index b0092cd..d334235 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -774,7 +774,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
> vmdef->name);
> goto cleanup;
> }
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, vmdef)))
> goto cleanup;
> vmdef = NULL;
>
> @@ -841,7 +842,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
> vmdef->name);
> goto cleanup;
> }
> - if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
> + if (!(vm = virDomainAssignDef(conn, driver->caps,
> + &driver->domains, vmdef)))
> goto cleanup;
> vmdef = NULL;
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index fc6cc53..1651071 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2703,6 +2703,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
> }
>
> if (!(vm = virDomainAssignDef(conn,
> + driver->caps,
> &driver->domains,
> def)))
> goto cleanup;
> @@ -3766,6 +3767,7 @@ static int qemudDomainRestore(virConnectPtr conn,
> }
>
> if (!(vm = virDomainAssignDef(conn,
> + driver->caps,
> &driver->domains,
> def))) {
> qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> @@ -4254,6 +4256,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
> goto cleanup;
>
> if (!(vm = virDomainAssignDef(conn,
> + driver->caps,
> &driver->domains,
> def))) {
> goto cleanup;
> @@ -6112,6 +6115,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
> }
>
> if (!(vm = virDomainAssignDef(dconn,
> + driver->caps,
> &driver->domains,
> def))) {
> qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> @@ -6333,6 +6337,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
> }
>
> if (!(vm = virDomainAssignDef(dconn,
> + driver->caps,
> &driver->domains,
> def))) {
> qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 919a2f6..f08fe74 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -364,7 +364,8 @@ static int testOpenDefault(virConnectPtr conn) {
> goto error;
> if (testDomainGenerateIfnames(conn, domdef) < 0)
> goto error;
> - if (!(domobj = virDomainAssignDef(conn, &privconn->domains, domdef)))
> + if (!(domobj = virDomainAssignDef(conn, privconn->caps,
> + &privconn->domains, domdef)))
> goto error;
> domdef = NULL;
> domobj->def->id = privconn->nextDomID++;
> @@ -716,7 +717,8 @@ static int testOpenFromFile(virConnectPtr conn,
> }
>
> if (testDomainGenerateIfnames(conn, def) < 0 ||
> - !(dom = virDomainAssignDef(conn, &privconn->domains, def))) {
> + !(dom = virDomainAssignDef(conn, privconn->caps,
> + &privconn->domains, def))) {
> virDomainDefFree(def);
> goto error;
> }
> @@ -1068,7 +1070,8 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
>
> if (testDomainGenerateIfnames(conn, def) < 0)
> goto cleanup;
> - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
> + if (!(dom = virDomainAssignDef(conn, privconn->caps,
> + &privconn->domains, def)))
> goto cleanup;
> def = NULL;
> dom->state = VIR_DOMAIN_RUNNING;
> @@ -1616,7 +1619,8 @@ static int testDomainRestore(virConnectPtr conn,
>
> if (testDomainGenerateIfnames(conn, def) < 0)
> goto cleanup;
> - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
> + if (!(dom = virDomainAssignDef(conn, privconn->caps,
> + &privconn->domains, def)))
> goto cleanup;
> def = NULL;
>
> @@ -1890,7 +1894,8 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
>
> if (testDomainGenerateIfnames(conn, def) < 0)
> goto cleanup;
> - if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
> + if (!(dom = virDomainAssignDef(conn, privconn->caps,
> + &privconn->domains, def)))
> goto cleanup;
> def = NULL;
> dom->persistent = 1;
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index 80cf477..4fb04d9 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1212,6 +1212,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
> }
>
> if (!(vm = virDomainAssignDef(conn,
> + driver->caps,
> &driver->domains,
> def)))
> goto cleanup;
> @@ -1546,6 +1547,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
> goto cleanup;
>
> if (!(vm = virDomainAssignDef(conn,
> + driver->caps,
> &driver->domains,
> def)))
> goto cleanup;
ACK
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list