mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
Allow for a driver specific private data blob in virDomainObjPtr
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
This commit is contained in:
parent
530d4463ba
commit
3505790b85
@ -115,6 +115,8 @@ struct _virCaps {
|
|||||||
virCapsGuestPtr *guests;
|
virCapsGuestPtr *guests;
|
||||||
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
|
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
|
||||||
unsigned int emulatorRequired : 1;
|
unsigned int emulatorRequired : 1;
|
||||||
|
void *(*privateDataAllocFunc)(void);
|
||||||
|
void (*privateDataFreeFunc)(void *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -594,12 +594,16 @@ void virDomainObjFree(virDomainObjPtr dom)
|
|||||||
|
|
||||||
VIR_FREE(dom->vcpupids);
|
VIR_FREE(dom->vcpupids);
|
||||||
|
|
||||||
|
if (dom->privateDataFreeFunc)
|
||||||
|
(dom->privateDataFreeFunc)(dom->privateData);
|
||||||
|
|
||||||
virMutexDestroy(&dom->lock);
|
virMutexDestroy(&dom->lock);
|
||||||
|
|
||||||
VIR_FREE(dom);
|
VIR_FREE(dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
|
static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
|
||||||
|
virCapsPtr caps)
|
||||||
{
|
{
|
||||||
virDomainObjPtr domain;
|
virDomainObjPtr domain;
|
||||||
|
|
||||||
@ -608,9 +612,19 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
|
|||||||
return NULL;
|
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) {
|
if (virMutexInit(&domain->lock) < 0) {
|
||||||
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("cannot initialize mutex"));
|
"%s", _("cannot initialize mutex"));
|
||||||
|
if (domain->privateDataFreeFunc)
|
||||||
|
(domain->privateDataFreeFunc)(domain->privateData);
|
||||||
VIR_FREE(domain);
|
VIR_FREE(domain);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -624,6 +638,7 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
||||||
|
virCapsPtr caps,
|
||||||
virDomainObjListPtr doms,
|
virDomainObjListPtr doms,
|
||||||
const virDomainDefPtr def)
|
const virDomainDefPtr def)
|
||||||
{
|
{
|
||||||
@ -643,7 +658,7 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
|||||||
return domain;
|
return domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(domain = virDomainObjNew(conn)))
|
if (!(domain = virDomainObjNew(conn, caps)))
|
||||||
return NULL;
|
return NULL;
|
||||||
domain->def = def;
|
domain->def = def;
|
||||||
|
|
||||||
@ -3187,7 +3202,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
|
|||||||
xmlNodePtr *nodes = NULL;
|
xmlNodePtr *nodes = NULL;
|
||||||
int n, i;
|
int n, i;
|
||||||
|
|
||||||
if (!(obj = virDomainObjNew(conn)))
|
if (!(obj = virDomainObjNew(conn, caps)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!(config = virXPathNode(conn, "./domain", ctxt))) {
|
if (!(config = virXPathNode(conn, "./domain", ctxt))) {
|
||||||
@ -4768,7 +4783,7 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn,
|
|||||||
newVM = 0;
|
newVM = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(dom = virDomainAssignDef(conn, doms, def)))
|
if (!(dom = virDomainAssignDef(conn, caps, doms, def)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
dom->autostart = autostart;
|
dom->autostart = autostart;
|
||||||
|
@ -636,6 +636,9 @@ struct _virDomainObj {
|
|||||||
|
|
||||||
virDomainDefPtr def; /* The current definition */
|
virDomainDefPtr def; /* The current definition */
|
||||||
virDomainDefPtr newDef; /* New definition to activate at shutdown */
|
virDomainDefPtr newDef; /* New definition to activate at shutdown */
|
||||||
|
|
||||||
|
void *privateData;
|
||||||
|
void (*privateDataFreeFunc)(void *);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _virDomainObjList virDomainObjList;
|
typedef struct _virDomainObjList virDomainObjList;
|
||||||
@ -678,6 +681,7 @@ void virDomainDefFree(virDomainDefPtr vm);
|
|||||||
void virDomainObjFree(virDomainObjPtr vm);
|
void virDomainObjFree(virDomainObjPtr vm);
|
||||||
|
|
||||||
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
||||||
|
virCapsPtr caps,
|
||||||
virDomainObjListPtr doms,
|
virDomainObjListPtr doms,
|
||||||
const virDomainDefPtr def);
|
const virDomainDefPtr def);
|
||||||
void virDomainRemoveInactive(virDomainObjListPtr doms,
|
void virDomainRemoveInactive(virDomainObjListPtr doms,
|
||||||
|
@ -315,7 +315,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
|
if (!(vm = virDomainAssignDef(conn, driver->caps,
|
||||||
|
&driver->domains, def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
vm->persistent = 1;
|
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;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
|
@ -235,7 +235,8 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto return_point;
|
goto return_point;
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
|
if (!(vm = virDomainAssignDef(conn, driver->caps,
|
||||||
|
&driver->domains, def))) {
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
goto return_point;
|
goto return_point;
|
||||||
}
|
}
|
||||||
@ -439,7 +440,8 @@ oneDomainCreateAndStart(virConnectPtr conn,
|
|||||||
goto return_point;
|
goto return_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
|
if (!(vm = virDomainAssignDef(conn, driver->caps,
|
||||||
|
&driver->domains, def))) {
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
goto return_point;
|
goto return_point;
|
||||||
}
|
}
|
||||||
|
@ -774,7 +774,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
vmdef->name);
|
vmdef->name);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
|
if (!(vm = virDomainAssignDef(conn, driver->caps,
|
||||||
|
&driver->domains, vmdef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
|
|
||||||
@ -841,7 +842,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
vmdef->name);
|
vmdef->name);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
|
if (!(vm = virDomainAssignDef(conn, driver->caps,
|
||||||
|
&driver->domains, vmdef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
|
|
||||||
|
@ -2697,6 +2697,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn,
|
if (!(vm = virDomainAssignDef(conn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def)))
|
def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -3757,6 +3758,7 @@ static int qemudDomainRestore(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn,
|
if (!(vm = virDomainAssignDef(conn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def))) {
|
def))) {
|
||||||
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||||
@ -4243,6 +4245,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn,
|
if (!(vm = virDomainAssignDef(conn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def))) {
|
def))) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -6101,6 +6104,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(dconn,
|
if (!(vm = virDomainAssignDef(dconn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def))) {
|
def))) {
|
||||||
qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||||
@ -6339,6 +6343,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(dconn,
|
if (!(vm = virDomainAssignDef(dconn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def))) {
|
def))) {
|
||||||
qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||||
|
@ -387,7 +387,8 @@ static int testOpenDefault(virConnectPtr conn) {
|
|||||||
goto error;
|
goto error;
|
||||||
if (testDomainGenerateIfnames(conn, domdef) < 0)
|
if (testDomainGenerateIfnames(conn, domdef) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (!(domobj = virDomainAssignDef(conn, &privconn->domains, domdef)))
|
if (!(domobj = virDomainAssignDef(conn, privconn->caps,
|
||||||
|
&privconn->domains, domdef)))
|
||||||
goto error;
|
goto error;
|
||||||
domdef = NULL;
|
domdef = NULL;
|
||||||
domobj->def->id = privconn->nextDomID++;
|
domobj->def->id = privconn->nextDomID++;
|
||||||
@ -739,7 +740,8 @@ static int testOpenFromFile(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (testDomainGenerateIfnames(conn, def) < 0 ||
|
if (testDomainGenerateIfnames(conn, def) < 0 ||
|
||||||
!(dom = virDomainAssignDef(conn, &privconn->domains, def))) {
|
!(dom = virDomainAssignDef(conn, privconn->caps,
|
||||||
|
&privconn->domains, def))) {
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1091,7 +1093,8 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
|
|
||||||
if (testDomainGenerateIfnames(conn, def) < 0)
|
if (testDomainGenerateIfnames(conn, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
|
if (!(dom = virDomainAssignDef(conn, privconn->caps,
|
||||||
|
&privconn->domains, def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
dom->state = VIR_DOMAIN_RUNNING;
|
dom->state = VIR_DOMAIN_RUNNING;
|
||||||
@ -1639,7 +1642,8 @@ static int testDomainRestore(virConnectPtr conn,
|
|||||||
|
|
||||||
if (testDomainGenerateIfnames(conn, def) < 0)
|
if (testDomainGenerateIfnames(conn, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
|
if (!(dom = virDomainAssignDef(conn, privconn->caps,
|
||||||
|
&privconn->domains, def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -1913,7 +1917,8 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
|
|||||||
|
|
||||||
if (testDomainGenerateIfnames(conn, def) < 0)
|
if (testDomainGenerateIfnames(conn, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
|
if (!(dom = virDomainAssignDef(conn, privconn->caps,
|
||||||
|
&privconn->domains, def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
dom->persistent = 1;
|
dom->persistent = 1;
|
||||||
|
@ -1212,6 +1212,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn,
|
if (!(vm = virDomainAssignDef(conn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def)))
|
def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1546,6 +1547,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(vm = virDomainAssignDef(conn,
|
if (!(vm = virDomainAssignDef(conn,
|
||||||
|
driver->caps,
|
||||||
&driver->domains,
|
&driver->domains,
|
||||||
def)))
|
def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
Reference in New Issue
Block a user