mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Merge virDomainObjListIsDuplicate into virDomainObjListAdd
The duplicate VM checking should be done atomically with virDomainObjListAdd, so shoud not be a separate function. Instead just use flags to indicate what kind of checks are required. This pair, used in virDomainCreateXML: if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, false))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; This pair, used in virDomainRestoreFlags: if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, true))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, VIR_DOMAIN_OBJ_LIST_ADD_LIVE | VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; This pair, used in virDomainDefineXML: if (virDomainObjListIsDuplicate(privconn->domains, def, 0) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, false))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, 0, NULL))) goto cleanup;
This commit is contained in:
parent
9fe43021f3
commit
eea87129f1
@ -1860,48 +1860,113 @@ error:
|
|||||||
|
|
||||||
void virDomainObjAssignDef(virDomainObjPtr domain,
|
void virDomainObjAssignDef(virDomainObjPtr domain,
|
||||||
const virDomainDefPtr def,
|
const virDomainDefPtr def,
|
||||||
bool live)
|
bool live,
|
||||||
|
virDomainDefPtr *oldDef)
|
||||||
{
|
{
|
||||||
if (!virDomainObjIsActive(domain)) {
|
if (oldDef)
|
||||||
|
*oldDef = NULL;
|
||||||
|
if (virDomainObjIsActive(domain)) {
|
||||||
|
if (oldDef)
|
||||||
|
*oldDef = domain->newDef;
|
||||||
|
else
|
||||||
|
virDomainDefFree(domain->newDef);
|
||||||
|
domain->newDef = def;
|
||||||
|
} else {
|
||||||
if (live) {
|
if (live) {
|
||||||
|
if (domain->def) {
|
||||||
/* save current configuration to be restored on domain shutdown */
|
/* save current configuration to be restored on domain shutdown */
|
||||||
if (!domain->newDef)
|
if (!domain->newDef)
|
||||||
domain->newDef = domain->def;
|
domain->newDef = domain->def;
|
||||||
|
else
|
||||||
|
virDomainDefFree(domain->def);
|
||||||
|
}
|
||||||
domain->def = def;
|
domain->def = def;
|
||||||
} else {
|
} else {
|
||||||
|
if (oldDef)
|
||||||
|
*oldDef = domain->def;
|
||||||
|
else
|
||||||
virDomainDefFree(domain->def);
|
virDomainDefFree(domain->def);
|
||||||
domain->def = def;
|
domain->def = def;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
virDomainDefFree(domain->newDef);
|
|
||||||
domain->newDef = def;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* If flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE then
|
||||||
|
* this will refuse updating an existing def if the
|
||||||
|
* current def is Live
|
||||||
|
*
|
||||||
|
* If flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE then
|
||||||
|
* the @def being added is assumed to represent a
|
||||||
|
* live config, not a future inactive config
|
||||||
|
*
|
||||||
|
*/
|
||||||
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
|
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
|
||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
const virDomainDefPtr def,
|
const virDomainDefPtr def,
|
||||||
bool live)
|
unsigned int flags,
|
||||||
|
virDomainDefPtr *oldDef)
|
||||||
{
|
{
|
||||||
virDomainObjPtr domain;
|
virDomainObjPtr vm;
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
if (oldDef)
|
||||||
|
*oldDef = false;
|
||||||
|
|
||||||
if ((domain = virDomainObjListFindByUUID(doms, def->uuid))) {
|
/* See if a VM with matching UUID already exists */
|
||||||
virDomainObjAssignDef(domain, def, live);
|
if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) {
|
||||||
return domain;
|
/* UUID matches, but if names don't match, refuse it */
|
||||||
|
if (STRNEQ(vm->def->name, def->name)) {
|
||||||
|
virUUIDFormat(vm->def->uuid, uuidstr);
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
_("domain '%s' is already defined with uuid %s"),
|
||||||
|
vm->def->name, uuidstr);
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(domain = virDomainObjNew(caps)))
|
if (flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE) {
|
||||||
return NULL;
|
/* UUID & name match, but if VM is already active, refuse it */
|
||||||
domain->def = def;
|
if (virDomainObjIsActive(vm)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
_("domain is already active as '%s'"),
|
||||||
|
vm->def->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virDomainObjAssignDef(vm,
|
||||||
|
def,
|
||||||
|
!!(flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE),
|
||||||
|
oldDef);
|
||||||
|
} else {
|
||||||
|
/* UUID does not match, but if a name matches, refuse it */
|
||||||
|
if ((vm = virDomainObjListFindByName(doms, def->name))) {
|
||||||
|
virUUIDFormat(vm->def->uuid, uuidstr);
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
_("domain '%s' already exists with uuid %s"),
|
||||||
|
def->name, uuidstr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(vm = virDomainObjNew(caps)))
|
||||||
|
goto cleanup;
|
||||||
|
vm->def = def;
|
||||||
|
|
||||||
virUUIDFormat(def->uuid, uuidstr);
|
virUUIDFormat(def->uuid, uuidstr);
|
||||||
if (virHashAddEntry(doms->objs, uuidstr, domain) < 0) {
|
if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) {
|
||||||
VIR_FREE(domain);
|
virObjectUnref(vm);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
cleanup:
|
||||||
|
return vm;
|
||||||
|
|
||||||
return domain;
|
error:
|
||||||
|
virObjectUnlock(vm);
|
||||||
|
vm = NULL;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -14825,7 +14890,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms,
|
|||||||
virDomainDefPtr def = NULL;
|
virDomainDefPtr def = NULL;
|
||||||
virDomainObjPtr dom;
|
virDomainObjPtr dom;
|
||||||
int autostart;
|
int autostart;
|
||||||
int newVM = 1;
|
virDomainDefPtr oldDef = NULL;
|
||||||
|
|
||||||
if ((configFile = virDomainConfigFile(configDir, name)) == NULL)
|
if ((configFile = virDomainConfigFile(configDir, name)) == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
@ -14839,32 +14904,15 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms,
|
|||||||
if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0)
|
if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* if the domain is already in our hashtable, we only need to
|
if (!(dom = virDomainObjListAdd(doms, caps, def, 0, &oldDef)))
|
||||||
* update the autostart flag
|
|
||||||
*/
|
|
||||||
if ((dom = virDomainObjListFindByUUID(doms, def->uuid))) {
|
|
||||||
dom->autostart = autostart;
|
|
||||||
|
|
||||||
if (virDomainObjIsActive(dom) &&
|
|
||||||
!dom->newDef) {
|
|
||||||
virDomainObjAssignDef(dom, def, false);
|
|
||||||
} else {
|
|
||||||
virDomainDefFree(def);
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_FREE(configFile);
|
|
||||||
VIR_FREE(autostartLink);
|
|
||||||
return dom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(dom = virDomainObjListAdd(doms, caps, def, false)))
|
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
dom->autostart = autostart;
|
dom->autostart = autostart;
|
||||||
|
|
||||||
if (notify)
|
if (notify)
|
||||||
(*notify)(dom, newVM, opaque);
|
(*notify)(dom, oldDef == NULL, opaque);
|
||||||
|
|
||||||
|
virDomainDefFree(oldDef);
|
||||||
VIR_FREE(configFile);
|
VIR_FREE(configFile);
|
||||||
VIR_FREE(autostartLink);
|
VIR_FREE(autostartLink);
|
||||||
return dom;
|
return dom;
|
||||||
@ -15083,69 +15131,6 @@ virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* virDomainObjListIsDuplicate:
|
|
||||||
* @doms : virDomainObjListPtr to search
|
|
||||||
* @def : virDomainDefPtr definition of domain to lookup
|
|
||||||
* @check_active: If true, ensure that domain is not active
|
|
||||||
*
|
|
||||||
* Returns: -1 on error
|
|
||||||
* 0 if domain is new
|
|
||||||
* 1 if domain is a duplicate
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
virDomainObjListIsDuplicate(virDomainObjListPtr doms,
|
|
||||||
virDomainDefPtr def,
|
|
||||||
unsigned int check_active)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
int dupVM = 0;
|
|
||||||
virDomainObjPtr vm = NULL;
|
|
||||||
|
|
||||||
/* See if a VM with matching UUID already exists */
|
|
||||||
vm = virDomainObjListFindByUUID(doms, def->uuid);
|
|
||||||
if (vm) {
|
|
||||||
/* UUID matches, but if names don't match, refuse it */
|
|
||||||
if (STRNEQ(vm->def->name, def->name)) {
|
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
||||||
virUUIDFormat(vm->def->uuid, uuidstr);
|
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
||||||
_("domain '%s' is already defined with uuid %s"),
|
|
||||||
vm->def->name, uuidstr);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (check_active) {
|
|
||||||
/* UUID & name match, but if VM is already active, refuse it */
|
|
||||||
if (virDomainObjIsActive(vm)) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
_("domain is already active as '%s'"),
|
|
||||||
vm->def->name);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dupVM = 1;
|
|
||||||
} else {
|
|
||||||
/* UUID does not match, but if a name matches, refuse it */
|
|
||||||
vm = virDomainObjListFindByName(doms, def->name);
|
|
||||||
if (vm) {
|
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
||||||
virUUIDFormat(vm->def->uuid, uuidstr);
|
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
||||||
_("domain '%s' already exists with uuid %s"),
|
|
||||||
def->name, uuidstr);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = dupVM;
|
|
||||||
cleanup:
|
|
||||||
if (vm)
|
|
||||||
virObjectUnlock(vm);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void virDomainObjListCountActive(void *payload, const void *name ATTRIBUTE_UNUSED, void *data)
|
static void virDomainObjListCountActive(void *payload, const void *name ATTRIBUTE_UNUSED, void *data)
|
||||||
{
|
{
|
||||||
|
@ -1966,15 +1966,19 @@ void virDomainDefFree(virDomainDefPtr vm);
|
|||||||
|
|
||||||
virDomainChrDefPtr virDomainChrDefNew(void);
|
virDomainChrDefPtr virDomainChrDefNew(void);
|
||||||
|
|
||||||
/* live == true means def describes an active domain (being migrated or
|
enum {
|
||||||
* restored) as opposed to a new persistent configuration of the domain */
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE = (1 << 0),
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE = (1 << 1),
|
||||||
|
};
|
||||||
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
|
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
|
||||||
virCapsPtr caps,
|
virCapsPtr caps,
|
||||||
const virDomainDefPtr def,
|
const virDomainDefPtr def,
|
||||||
bool live);
|
unsigned int flags,
|
||||||
|
virDomainDefPtr *oldDef);
|
||||||
void virDomainObjAssignDef(virDomainObjPtr domain,
|
void virDomainObjAssignDef(virDomainObjPtr domain,
|
||||||
const virDomainDefPtr def,
|
const virDomainDefPtr def,
|
||||||
bool live);
|
bool live,
|
||||||
|
virDomainDefPtr *oldDef);
|
||||||
int virDomainObjSetDefTransient(virCapsPtr caps,
|
int virDomainObjSetDefTransient(virCapsPtr caps,
|
||||||
virDomainObjPtr domain,
|
virDomainObjPtr domain,
|
||||||
bool live);
|
bool live);
|
||||||
@ -2156,10 +2160,6 @@ int virDomainFSIndexByName(virDomainDefPtr def, const char *name);
|
|||||||
int virDomainVideoDefaultType(virDomainDefPtr def);
|
int virDomainVideoDefaultType(virDomainDefPtr def);
|
||||||
int virDomainVideoDefaultRAM(virDomainDefPtr def, int type);
|
int virDomainVideoDefaultRAM(virDomainDefPtr def, int type);
|
||||||
|
|
||||||
int virDomainObjListIsDuplicate(virDomainObjListPtr doms,
|
|
||||||
virDomainDefPtr def,
|
|
||||||
unsigned int check_active);
|
|
||||||
|
|
||||||
int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active);
|
int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active);
|
||||||
|
|
||||||
int virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
|
int virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
|
||||||
|
@ -479,7 +479,6 @@ virDomainObjListFindByUUID;
|
|||||||
virDomainObjListForEach;
|
virDomainObjListForEach;
|
||||||
virDomainObjListGetActiveIDs;
|
virDomainObjListGetActiveIDs;
|
||||||
virDomainObjListGetInactiveNames;
|
virDomainObjListGetInactiveNames;
|
||||||
virDomainObjListIsDuplicate;
|
|
||||||
virDomainObjListLoadAllConfigs;
|
virDomainObjListLoadAllConfigs;
|
||||||
virDomainObjListNew;
|
virDomainObjListNew;
|
||||||
virDomainObjListNumOfDomains;
|
virDomainObjListNumOfDomains;
|
||||||
|
@ -902,7 +902,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virDomainObjAssignDef(vm, def, true);
|
virDomainObjAssignDef(vm, def, true, NULL);
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
if (unlink(managed_save_path) < 0) {
|
if (unlink(managed_save_path) < 0) {
|
||||||
@ -1449,12 +1449,11 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -2230,12 +2229,12 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from,
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, true)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
@ -3019,7 +3018,7 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
int dupVM;
|
virDomainDefPtr oldDef = NULL;
|
||||||
|
|
||||||
libxlDriverLock(driver);
|
libxlDriverLock(driver);
|
||||||
if (!(def = virDomainDefParseString(driver->caps, xml,
|
if (!(def = virDomainDefParseString(driver->caps, xml,
|
||||||
@ -3027,12 +3026,11 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
0,
|
||||||
|
&oldDef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
vm->persistent = 1;
|
vm->persistent = 1;
|
||||||
@ -3049,12 +3047,13 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
dom->id = vm->def->id;
|
dom->id = vm->def->id;
|
||||||
|
|
||||||
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED,
|
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED,
|
||||||
!dupVM ?
|
!oldDef ?
|
||||||
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
||||||
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
|
virDomainDefFree(oldDef);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
if (event)
|
if (event)
|
||||||
@ -3603,7 +3602,7 @@ libxlDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
if (!ret && (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
|
if (!ret && (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
|
||||||
ret = virDomainSaveConfig(driver->configDir, vmdef);
|
ret = virDomainSaveConfig(driver->configDir, vmdef);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
virDomainObjAssignDef(vm, vmdef, false);
|
virDomainObjAssignDef(vm, vmdef, false, NULL);
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -410,7 +410,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
int dupVM;
|
virDomainDefPtr oldDef = NULL;
|
||||||
|
|
||||||
lxcDriverLock(driver);
|
lxcDriverLock(driver);
|
||||||
if (!(def = virDomainDefParseString(driver->caps, xml,
|
if (!(def = virDomainDefParseString(driver->caps, xml,
|
||||||
@ -421,9 +421,6 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((def->nets != NULL) && !(driver->have_netns)) {
|
if ((def->nets != NULL) && !(driver->have_netns)) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
"%s", _("System lacks NETNS support"));
|
"%s", _("System lacks NETNS support"));
|
||||||
@ -432,7 +429,9 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
0,
|
||||||
|
&oldDef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
vm->persistent = 1;
|
vm->persistent = 1;
|
||||||
@ -446,7 +445,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
|
|
||||||
event = virDomainEventNewFromObj(vm,
|
event = virDomainEventNewFromObj(vm,
|
||||||
VIR_DOMAIN_EVENT_DEFINED,
|
VIR_DOMAIN_EVENT_DEFINED,
|
||||||
!dupVM ?
|
!oldDef ?
|
||||||
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
||||||
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
||||||
|
|
||||||
@ -456,6 +455,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
|
virDomainDefFree(oldDef);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
if (event)
|
if (event)
|
||||||
@ -1077,9 +1077,6 @@ lxcDomainCreateAndStart(virConnectPtr conn,
|
|||||||
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((def->nets != NULL) && !(driver->have_netns)) {
|
if ((def->nets != NULL) && !(driver->have_netns)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
"%s", _("System lacks NETNS support"));
|
"%s", _("System lacks NETNS support"));
|
||||||
@ -1089,7 +1086,9 @@ lxcDomainCreateAndStart(virConnectPtr conn,
|
|||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -1864,7 +1863,7 @@ lxcSetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virDomainObjAssignDef(vm, vmdef, false);
|
virDomainObjAssignDef(vm, vmdef, false, NULL);
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4412,7 +4411,7 @@ lxcDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
||||||
ret = virDomainSaveConfig(driver->configDir, vmdef);
|
ret = virDomainSaveConfig(driver->configDir, vmdef);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
virDomainObjAssignDef(vm, vmdef, false);
|
virDomainObjAssignDef(vm, vmdef, false, NULL);
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -586,6 +586,7 @@ int openvzLoadDomains(struct openvz_driver *driver) {
|
|||||||
|
|
||||||
line = outbuf;
|
line = outbuf;
|
||||||
while (line[0] != '\0') {
|
while (line[0] != '\0') {
|
||||||
|
unsigned int flags = 0;
|
||||||
if (virStrToLong_i(line, &status, 10, &veid) < 0 ||
|
if (virStrToLong_i(line, &status, 10, &veid) < 0 ||
|
||||||
*status++ != ' ' ||
|
*status++ != ' ' ||
|
||||||
(line = strchr(status, '\n')) == NULL) {
|
(line = strchr(status, '\n')) == NULL) {
|
||||||
@ -642,17 +643,15 @@ int openvzLoadDomains(struct openvz_driver *driver) {
|
|||||||
openvzReadMemConf(def, veid);
|
openvzReadMemConf(def, veid);
|
||||||
|
|
||||||
virUUIDFormat(def->uuid, uuidstr);
|
virUUIDFormat(def->uuid, uuidstr);
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, true)) {
|
flags = VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE;
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
if (STRNEQ(status, "stopped"))
|
||||||
_("Duplicate container UUID %s detected for %d"),
|
flags |= VIR_DOMAIN_OBJ_LIST_ADD_LIVE;
|
||||||
uuidstr,
|
|
||||||
veid);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (!(dom = virDomainObjListAdd(driver->domains,
|
if (!(dom = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def,
|
def,
|
||||||
STRNEQ(status, "stopped"))))
|
flags,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (STREQ(status, "stopped")) {
|
if (STREQ(status, "stopped")) {
|
||||||
|
@ -969,7 +969,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
}
|
}
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
vmdef, false)))
|
vmdef, 0, NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
vm->persistent = 1;
|
vm->persistent = 1;
|
||||||
@ -1056,7 +1056,9 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
}
|
}
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
vmdef, false)))
|
vmdef,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
/* All OpenVZ domains seem to be persistent - this is a bit of a violation
|
/* All OpenVZ domains seem to be persistent - this is a bit of a violation
|
||||||
|
@ -832,7 +832,7 @@ parallelsLoadDomain(parallelsConnPtr privconn, virJSONValuePtr jobj)
|
|||||||
|
|
||||||
if (!(dom = virDomainObjListAdd(privconn->domains,
|
if (!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, false)))
|
def, 0, NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
/* dom is locked here */
|
/* dom is locked here */
|
||||||
|
|
||||||
@ -2324,7 +2324,6 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
virDomainPtr ret = NULL;
|
virDomainPtr ret = NULL;
|
||||||
virDomainDefPtr def;
|
virDomainDefPtr def;
|
||||||
virDomainObjPtr dom = NULL, olddom = NULL;
|
virDomainObjPtr dom = NULL, olddom = NULL;
|
||||||
int dupVM;
|
|
||||||
|
|
||||||
parallelsDriverLock(privconn);
|
parallelsDriverLock(privconn);
|
||||||
if ((def = virDomainDefParseString(privconn->caps, xml,
|
if ((def = virDomainDefParseString(privconn->caps, xml,
|
||||||
@ -2335,14 +2334,9 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) {
|
|
||||||
virReportError(VIR_ERR_INVALID_ARG, "%s", _("Already exists"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dupVM == 1) {
|
|
||||||
olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
|
olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
|
||||||
} else {
|
if (olddom == NULL) {
|
||||||
|
virResetLastError();
|
||||||
if (STREQ(def->os.type, "hvm")) {
|
if (STREQ(def->os.type, "hvm")) {
|
||||||
if (parallelsCreateVm(conn, def))
|
if (parallelsCreateVm(conn, def))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -2373,7 +2367,7 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
|
|
||||||
if (!(dom = virDomainObjListAdd(privconn->domains,
|
if (!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, false))) {
|
def, 0, NULL))) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Can't allocate domobj"));
|
_("Can't allocate domobj"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -1589,9 +1589,6 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml,
|
|||||||
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1603,7 +1600,9 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml,
|
|||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
@ -4992,15 +4991,13 @@ qemuDomainRestoreFlags(virConnectPtr conn,
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, true))) {
|
def,
|
||||||
/* virDomainLitsAdd already set the error */
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
|
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
|
||||||
@ -5176,7 +5173,7 @@ qemuDomainObjRestore(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
virDomainObjAssignDef(vm, def, true);
|
virDomainObjAssignDef(vm, def, true, NULL);
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path,
|
ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path,
|
||||||
@ -5590,12 +5587,11 @@ qemuDomainStart(virDomainPtr dom)
|
|||||||
static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
||||||
virQEMUDriverPtr driver = conn->privateData;
|
virQEMUDriverPtr driver = conn->privateData;
|
||||||
virDomainDefPtr def;
|
virDomainDefPtr def;
|
||||||
virDomainDefPtr def_backup = NULL;
|
virDomainDefPtr oldDef = NULL;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
qemuCapsPtr caps = NULL;
|
qemuCapsPtr caps = NULL;
|
||||||
int dupVM;
|
|
||||||
virQEMUDriverConfigPtr cfg;
|
virQEMUDriverConfigPtr cfg;
|
||||||
|
|
||||||
qemuDriverLock(driver);
|
qemuDriverLock(driver);
|
||||||
@ -5608,9 +5604,6 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -5620,45 +5613,33 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
if (qemuDomainAssignAddresses(def, caps, NULL) < 0)
|
if (qemuDomainAssignAddresses(def, caps, NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* We need to differentiate two cases:
|
|
||||||
* a) updating an existing domain - must preserve previous definition
|
|
||||||
* so we can roll back if something fails
|
|
||||||
* b) defining a brand new domain - virDomainObjListAdd is just sufficient
|
|
||||||
*/
|
|
||||||
if ((vm = virDomainObjListFindByUUID(driver->domains, def->uuid))) {
|
|
||||||
if (virDomainObjIsActive(vm)) {
|
|
||||||
def_backup = vm->newDef;
|
|
||||||
vm->newDef = def;
|
|
||||||
} else {
|
|
||||||
def_backup = vm->def;
|
|
||||||
vm->def = def;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false))) {
|
def,
|
||||||
|
0,
|
||||||
|
&oldDef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
}
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
if (virDomainHasDiskMirror(vm)) {
|
if (virDomainHasDiskMirror(vm)) {
|
||||||
virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
|
virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
|
||||||
_("domain has active block copy job"));
|
_("domain has active block copy job"));
|
||||||
virDomainObjAssignDef(vm, NULL, false);
|
virDomainObjAssignDef(vm, NULL, false, NULL);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
vm->persistent = 1;
|
vm->persistent = 1;
|
||||||
|
|
||||||
if (virDomainSaveConfig(cfg->configDir,
|
if (virDomainSaveConfig(cfg->configDir,
|
||||||
vm->newDef ? vm->newDef : vm->def) < 0) {
|
vm->newDef ? vm->newDef : vm->def) < 0) {
|
||||||
if (def_backup) {
|
if (oldDef) {
|
||||||
/* There is backup so this VM was defined before.
|
/* There is backup so this VM was defined before.
|
||||||
* Just restore the backup. */
|
* Just restore the backup. */
|
||||||
VIR_INFO("Restoring domain '%s' definition", vm->def->name);
|
VIR_INFO("Restoring domain '%s' definition", vm->def->name);
|
||||||
if (virDomainObjIsActive(vm))
|
if (virDomainObjIsActive(vm))
|
||||||
vm->newDef = def_backup;
|
vm->newDef = oldDef;
|
||||||
else
|
else
|
||||||
vm->def = def_backup;
|
vm->def = oldDef;
|
||||||
|
oldDef = NULL;
|
||||||
} else {
|
} else {
|
||||||
/* Brand new domain. Remove it */
|
/* Brand new domain. Remove it */
|
||||||
VIR_INFO("Deleting domain '%s'", vm->def->name);
|
VIR_INFO("Deleting domain '%s'", vm->def->name);
|
||||||
@ -5666,13 +5647,11 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
vm = NULL;
|
vm = NULL;
|
||||||
}
|
}
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else {
|
|
||||||
virDomainDefFree(def_backup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event = virDomainEventNewFromObj(vm,
|
event = virDomainEventNewFromObj(vm,
|
||||||
VIR_DOMAIN_EVENT_DEFINED,
|
VIR_DOMAIN_EVENT_DEFINED,
|
||||||
!dupVM ?
|
!oldDef ?
|
||||||
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
||||||
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
||||||
|
|
||||||
@ -5681,6 +5660,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
if (dom) dom->id = vm->def->id;
|
if (dom) dom->id = vm->def->id;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virDomainDefFree(oldDef);
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
@ -6556,7 +6536,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
|
|||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
||||||
ret = virDomainSaveConfig(cfg->configDir, vmdef);
|
ret = virDomainSaveConfig(cfg->configDir, vmdef);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
virDomainObjAssignDef(vm, vmdef, false);
|
virDomainObjAssignDef(vm, vmdef, false, NULL);
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8069,7 +8049,7 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virDomainObjAssignDef(vm, vmdef, false);
|
virDomainObjAssignDef(vm, vmdef, false, NULL);
|
||||||
vmdef = NULL;
|
vmdef = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12205,13 +12185,13 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
if (config)
|
if (config)
|
||||||
virDomainObjAssignDef(vm, config, false);
|
virDomainObjAssignDef(vm, config, false, NULL);
|
||||||
} else {
|
} else {
|
||||||
/* Transitions 2, 3 */
|
/* Transitions 2, 3 */
|
||||||
load:
|
load:
|
||||||
was_stopped = true;
|
was_stopped = true;
|
||||||
if (config)
|
if (config)
|
||||||
virDomainObjAssignDef(vm, config, false);
|
virDomainObjAssignDef(vm, config, false, NULL);
|
||||||
|
|
||||||
rc = qemuProcessStart(snapshot->domain->conn,
|
rc = qemuProcessStart(snapshot->domain->conn,
|
||||||
driver, vm, NULL, -1, NULL, snap,
|
driver, vm, NULL, -1, NULL, snap,
|
||||||
@ -12295,7 +12275,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
if (config)
|
if (config)
|
||||||
virDomainObjAssignDef(vm, config, false);
|
virDomainObjAssignDef(vm, config, false, NULL);
|
||||||
|
|
||||||
if (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
|
if (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
|
||||||
VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
|
VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
|
||||||
@ -12617,9 +12597,6 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
|||||||
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (qemuCanonicalizeMachine(def, caps) < 0)
|
if (qemuCanonicalizeMachine(def, caps) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -12628,7 +12605,10 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
|||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
@ -1639,15 +1639,14 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, true))) {
|
def,
|
||||||
/* virDomainAssignDef already set the error */
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
priv->origname = origname;
|
priv->origname = origname;
|
||||||
|
@ -584,7 +584,7 @@ static int testOpenDefault(virConnectPtr conn) {
|
|||||||
goto error;
|
goto error;
|
||||||
if (!(domobj = virDomainObjListAdd(privconn->domains,
|
if (!(domobj = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
domdef, false)))
|
domdef, 0, NULL)))
|
||||||
goto error;
|
goto error;
|
||||||
domdef = NULL;
|
domdef = NULL;
|
||||||
|
|
||||||
@ -929,7 +929,7 @@ static int testOpenFromFile(virConnectPtr conn,
|
|||||||
if (testDomainGenerateIfnames(def) < 0 ||
|
if (testDomainGenerateIfnames(def) < 0 ||
|
||||||
!(dom = virDomainObjListAdd(privconn->domains,
|
!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, false))) {
|
def, 0, NULL))) {
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1326,14 +1326,13 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (testDomainGenerateIfnames(def) < 0)
|
if (testDomainGenerateIfnames(def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainObjListAdd(privconn->domains,
|
if (!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -1943,14 +1942,14 @@ testDomainRestoreFlags(virConnectPtr conn,
|
|||||||
if (!def)
|
if (!def)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (testDomainGenerateIfnames(def) < 0)
|
if (testDomainGenerateIfnames(def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainObjListAdd(privconn->domains,
|
if (!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, true)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -2483,7 +2482,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
|
|||||||
virDomainDefPtr def;
|
virDomainDefPtr def;
|
||||||
virDomainObjPtr dom = NULL;
|
virDomainObjPtr dom = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
int dupVM;
|
virDomainDefPtr oldDef = NULL;
|
||||||
|
|
||||||
testDriverLock(privconn);
|
testDriverLock(privconn);
|
||||||
if ((def = virDomainDefParseString(privconn->caps, xml,
|
if ((def = virDomainDefParseString(privconn->caps, xml,
|
||||||
@ -2491,21 +2490,20 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
|
|||||||
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (testDomainGenerateIfnames(def) < 0)
|
if (testDomainGenerateIfnames(def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!(dom = virDomainObjListAdd(privconn->domains,
|
if (!(dom = virDomainObjListAdd(privconn->domains,
|
||||||
privconn->caps,
|
privconn->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
0,
|
||||||
|
&oldDef)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
dom->persistent = 1;
|
dom->persistent = 1;
|
||||||
|
|
||||||
event = virDomainEventNewFromObj(dom,
|
event = virDomainEventNewFromObj(dom,
|
||||||
VIR_DOMAIN_EVENT_DEFINED,
|
VIR_DOMAIN_EVENT_DEFINED,
|
||||||
!dupVM ?
|
!oldDef ?
|
||||||
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
VIR_DOMAIN_EVENT_DEFINED_ADDED :
|
||||||
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
|
||||||
|
|
||||||
@ -2515,6 +2513,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virDomainDefFree(def);
|
virDomainDefFree(def);
|
||||||
|
virDomainDefFree(oldDef);
|
||||||
if (dom)
|
if (dom)
|
||||||
virObjectUnlock(dom);
|
virObjectUnlock(dom);
|
||||||
if (event)
|
if (event)
|
||||||
|
@ -1499,12 +1499,11 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
|
|||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
|
|
||||||
@ -1921,12 +1920,10 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
|
|||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, def, 0) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
def, false)))
|
def,
|
||||||
|
0, NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
def = NULL;
|
def = NULL;
|
||||||
vm->persistent = 1;
|
vm->persistent = 1;
|
||||||
|
@ -179,7 +179,7 @@ vmwareLoadDomains(struct vmware_driver *driver)
|
|||||||
|
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
vmdef, false)))
|
vmdef, 0, NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
pDomain = vm->privateData;
|
pDomain = vm->privateData;
|
||||||
|
@ -320,9 +320,6 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* generate vmx file */
|
/* generate vmx file */
|
||||||
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
|
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
|
||||||
if (vmx == NULL)
|
if (vmx == NULL)
|
||||||
@ -341,7 +338,9 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
/* assign def */
|
/* assign def */
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
vmdef, false)))
|
vmdef,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
pDomain = vm->privateData;
|
pDomain = vm->privateData;
|
||||||
@ -592,9 +591,6 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
VIR_DOMAIN_XML_INACTIVE)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* generate vmx file */
|
/* generate vmx file */
|
||||||
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
|
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
|
||||||
if (vmx == NULL)
|
if (vmx == NULL)
|
||||||
@ -613,7 +609,9 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml,
|
|||||||
/* assign def */
|
/* assign def */
|
||||||
if (!(vm = virDomainObjListAdd(driver->domains,
|
if (!(vm = virDomainObjListAdd(driver->domains,
|
||||||
driver->caps,
|
driver->caps,
|
||||||
vmdef, false)))
|
vmdef,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
|
||||||
|
NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
pDomain = vm->privateData;
|
pDomain = vm->privateData;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user