domain{Attach,Detach}DeviceFlags handler for drivers

Implementation of domain{Attach,Detach}DeviceFlags handlers
in the drivers.
This commit is contained in:
Jim Fehlig 2010-01-13 18:44:26 -07:00
parent ce039c3ea5
commit ed9c14a7ef
17 changed files with 218 additions and 42 deletions

View File

@ -3372,7 +3372,9 @@ static virDriver esxDriver = {
esxDomainDefineXML, /* domainDefineXML */ esxDomainDefineXML, /* domainDefineXML */
esxDomainUndefine, /* domainUndefine */ esxDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
esxDomainGetSchedulerType, /* domainGetSchedulerType */ esxDomainGetSchedulerType, /* domainGetSchedulerType */

View File

@ -2427,7 +2427,9 @@ static virDriver lxcDriver = {
lxcDomainDefine, /* domainDefineXML */ lxcDomainDefine, /* domainDefineXML */
lxcDomainUndefine, /* domainUndefine */ lxcDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
lxcDomainGetAutostart, /* domainGetAutostart */ lxcDomainGetAutostart, /* domainGetAutostart */
lxcDomainSetAutostart, /* domainSetAutostart */ lxcDomainSetAutostart, /* domainSetAutostart */
lxcGetSchedulerType, /* domainGetSchedulerType */ lxcGetSchedulerType, /* domainGetSchedulerType */

View File

@ -754,7 +754,9 @@ static virDriver oneDriver = {
oneDomainDefine, /* domainDefineXML */ oneDomainDefine, /* domainDefineXML */
oneDomainUndefine, /* domainUndefine */ oneDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
oneGetAutostart, /* domainGetAutostart */ oneGetAutostart, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -1506,7 +1506,9 @@ static virDriver openvzDriver = {
openvzDomainDefineXML, /* domainDefineXML */ openvzDomainDefineXML, /* domainDefineXML */
openvzDomainUndefine, /* domainUndefine */ openvzDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
openvzDomainGetAutostart, /* domainGetAutostart */ openvzDomainGetAutostart, /* domainGetAutostart */
openvzDomainSetAutostart, /* domainSetAutostart */ openvzDomainSetAutostart, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -1622,7 +1622,9 @@ virDriver phypDriver = {
NULL, /* domainDefineXML */ NULL, /* domainDefineXML */
NULL, /* domainUndefine */ NULL, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -6057,6 +6057,18 @@ cleanup:
return ret; return ret;
} }
static int qemudDomainAttachDeviceFlags(virDomainPtr dom,
const char *xml,
unsigned int flags) {
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot modify the persistent configuration of a domain"));
return -1;
}
return qemudDomainAttachDevice(dom, xml);
}
static int qemudDomainDetachPciDiskDevice(virConnectPtr conn, static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
struct qemud_driver *driver, struct qemud_driver *driver,
virDomainObjPtr vm, virDomainObjPtr vm,
@ -6464,6 +6476,18 @@ cleanup:
return ret; return ret;
} }
static int qemudDomainDetachDeviceFlags(virDomainPtr dom,
const char *xml,
unsigned int flags) {
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot modify the persistent configuration of a domain"));
return -1;
}
return qemudDomainDetachDevice(dom, xml);
}
static int qemudDomainGetAutostart(virDomainPtr dom, static int qemudDomainGetAutostart(virDomainPtr dom,
int *autostart) { int *autostart) {
struct qemud_driver *driver = dom->conn->privateData; struct qemud_driver *driver = dom->conn->privateData;
@ -8577,7 +8601,9 @@ static virDriver qemuDriver = {
qemudDomainDefine, /* domainDefineXML */ qemudDomainDefine, /* domainDefineXML */
qemudDomainUndefine, /* domainUndefine */ qemudDomainUndefine, /* domainUndefine */
qemudDomainAttachDevice, /* domainAttachDevice */ qemudDomainAttachDevice, /* domainAttachDevice */
qemudDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
qemudDomainDetachDevice, /* domainDetachDevice */ qemudDomainDetachDevice, /* domainDetachDevice */
qemudDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
qemudDomainGetAutostart, /* domainGetAutostart */ qemudDomainGetAutostart, /* domainGetAutostart */
qemudDomainSetAutostart, /* domainSetAutostart */ qemudDomainSetAutostart, /* domainSetAutostart */
qemuGetSchedulerType, /* domainGetSchedulerType */ qemuGetSchedulerType, /* domainGetSchedulerType */

View File

@ -5209,7 +5209,9 @@ static virDriver testDriver = {
testDomainDefineXML, /* domainDefineXML */ testDomainDefineXML, /* domainDefineXML */
testDomainUndefine, /* domainUndefine */ testDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
testDomainGetAutostart, /* domainGetAutostart */ testDomainGetAutostart, /* domainGetAutostart */
testDomainSetAutostart, /* domainSetAutostart */ testDomainSetAutostart, /* domainSetAutostart */
testDomainGetSchedulerType, /* domainGetSchedulerType */ testDomainGetSchedulerType, /* domainGetSchedulerType */

View File

@ -1895,7 +1895,9 @@ static virDriver umlDriver = {
umlDomainDefine, /* domainDefineXML */ umlDomainDefine, /* domainDefineXML */
umlDomainUndefine, /* domainUndefine */ umlDomainUndefine, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDevice */
NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDevice */
NULL, /* domainDetachDeviceFlags */
umlDomainGetAutostart, /* domainGetAutostart */ umlDomainGetAutostart, /* domainGetAutostart */
umlDomainSetAutostart, /* domainSetAutostart */ umlDomainSetAutostart, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -4835,6 +4835,17 @@ cleanup:
return ret; return ret;
} }
static int vboxDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
unsigned int flags) {
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
vboxError(dom->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("cannot modify the persistent configuration of a domain"));
return -1;
}
return vboxDomainAttachDevice(dom, xml);
}
static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml) { static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml) {
VBOX_OBJECT_CHECK(dom->conn, int, -1); VBOX_OBJECT_CHECK(dom->conn, int, -1);
IMachine *machine = NULL; IMachine *machine = NULL;
@ -4965,6 +4976,17 @@ cleanup:
return ret; return ret;
} }
static int vboxDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
unsigned int flags) {
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
vboxError(dom->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("cannot modify the persistent configuration of a domain"));
return -1;
}
return vboxDomainDetachDevice(dom, xml);
}
#if VBOX_API_VERSION == 2002 #if VBOX_API_VERSION == 2002
/* No Callback support for VirtualBox 2.2.* series */ /* No Callback support for VirtualBox 2.2.* series */
#else /* !(VBOX_API_VERSION == 2002) */ #else /* !(VBOX_API_VERSION == 2002) */
@ -7001,7 +7023,9 @@ virDriver NAME(Driver) = {
vboxDomainDefineXML, /* domainDefineXML */ vboxDomainDefineXML, /* domainDefineXML */
vboxDomainUndefine, /* domainUndefine */ vboxDomainUndefine, /* domainUndefine */
vboxDomainAttachDevice, /* domainAttachDevice */ vboxDomainAttachDevice, /* domainAttachDevice */
vboxDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
vboxDomainDetachDevice, /* domainDetachDevice */ vboxDomainDetachDevice, /* domainDetachDevice */
vboxDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -76,8 +76,8 @@ struct xenUnifiedDriver xenProxyDriver = {
NULL, /* domainCreate */ NULL, /* domainCreate */
NULL, /* domainDefineXML */ NULL, /* domainDefineXML */
NULL, /* domainUndefine */ NULL, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -1428,10 +1428,29 @@ xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
{ {
GET_PRIVATE(dom->conn); GET_PRIVATE(dom->conn);
int i; int i;
unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
if (dom->id >= 0)
flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
if (priv->opened[i] && drivers[i]->domainAttachDevice && if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
drivers[i]->domainAttachDevice (dom, xml) == 0) drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainAttachDeviceFlags (virDomainPtr dom, const char *xml,
unsigned int flags)
{
GET_PRIVATE(dom->conn);
int i;
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 0)
return 0; return 0;
return -1; return -1;
@ -1442,10 +1461,29 @@ xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
{ {
GET_PRIVATE(dom->conn); GET_PRIVATE(dom->conn);
int i; int i;
unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
if (dom->id >= 0)
flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
if (priv->opened[i] && drivers[i]->domainDetachDevice && if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
drivers[i]->domainDetachDevice (dom, xml) == 0) drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainDetachDeviceFlags (virDomainPtr dom, const char *xml,
unsigned int flags)
{
GET_PRIVATE(dom->conn);
int i;
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
return 0; return 0;
return -1; return -1;
@ -1835,7 +1873,9 @@ static virDriver xenUnifiedDriver = {
xenUnifiedDomainDefineXML, /* domainDefineXML */ xenUnifiedDomainDefineXML, /* domainDefineXML */
xenUnifiedDomainUndefine, /* domainUndefine */ xenUnifiedDomainUndefine, /* domainUndefine */
xenUnifiedDomainAttachDevice, /* domainAttachDevice */ xenUnifiedDomainAttachDevice, /* domainAttachDevice */
xenUnifiedDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
xenUnifiedDomainDetachDevice, /* domainDetachDevice */ xenUnifiedDomainDetachDevice, /* domainDetachDevice */
xenUnifiedDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
xenUnifiedDomainGetAutostart, /* domainGetAutostart */ xenUnifiedDomainGetAutostart, /* domainGetAutostart */
xenUnifiedDomainSetAutostart, /* domainSetAutostart */ xenUnifiedDomainSetAutostart, /* domainSetAutostart */
xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */ xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */

View File

@ -93,8 +93,8 @@ struct xenUnifiedDriver {
virDrvDomainCreate domainCreate; virDrvDomainCreate domainCreate;
virDrvDomainDefineXML domainDefineXML; virDrvDomainDefineXML domainDefineXML;
virDrvDomainUndefine domainUndefine; virDrvDomainUndefine domainUndefine;
virDrvDomainAttachDevice domainAttachDevice; virDrvDomainAttachDeviceFlags domainAttachDeviceFlags;
virDrvDomainDetachDevice domainDetachDevice; virDrvDomainDetachDeviceFlags domainDetachDeviceFlags;
virDrvDomainGetAutostart domainGetAutostart; virDrvDomainGetAutostart domainGetAutostart;
virDrvDomainSetAutostart domainSetAutostart; virDrvDomainSetAutostart domainSetAutostart;
virDrvDomainGetSchedulerType domainGetSchedulerType; virDrvDomainGetSchedulerType domainGetSchedulerType;

View File

@ -793,8 +793,8 @@ struct xenUnifiedDriver xenHypervisorDriver = {
NULL, /* domainCreate */ NULL, /* domainCreate */
NULL, /* domainDefineXML */ NULL, /* domainDefineXML */
NULL, /* domainUndefine */ NULL, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
xenHypervisorGetSchedulerType, /* domainGetSchedulerType */ xenHypervisorGetSchedulerType, /* domainGetSchedulerType */

View File

@ -79,8 +79,8 @@ struct xenUnifiedDriver xenInotifyDriver = {
NULL, /* domainCreate */ NULL, /* domainCreate */
NULL, /* domainDefineXML */ NULL, /* domainDefineXML */
NULL, /* domainUndefine */ NULL, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */

View File

@ -4096,9 +4096,10 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
} }
/** /**
* xenDaemonAttachDevice: * xenDaemonAttachDeviceFlags:
* @domain: pointer to domain object * @domain: pointer to domain object
* @xml: pointer to XML description of device * @xml: pointer to XML description of device
* @flags: an OR'ed set of virDomainDeviceModifyFlags
* *
* Create a virtual device attachment to backend. * Create a virtual device attachment to backend.
* XML description is translated into S-expression. * XML description is translated into S-expression.
@ -4106,7 +4107,8 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
* Returns 0 in case of success, -1 in case of failure. * Returns 0 in case of success, -1 in case of failure.
*/ */
static int static int
xenDaemonAttachDevice(virDomainPtr domain, const char *xml) xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
unsigned int flags)
{ {
xenUnifiedPrivatePtr priv; xenUnifiedPrivatePtr priv;
char *sexpr = NULL; char *sexpr = NULL;
@ -4124,12 +4126,41 @@ xenDaemonAttachDevice(virDomainPtr domain, const char *xml)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData; priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
/* if (domain->id < 0) {
* on older Xen without the inactive guests management /* If xendConfigVersion < 3 only live config can be changed */
* avoid doing this on inactive guests if (priv->xendConfigVersion < 3) {
*/ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
if ((domain->id < 0) && (priv->xendConfigVersion < 3)) _("Xend version does not support modifying "
return -1; "persisted config"));
return -1;
}
/* Cannot modify live config if domain is inactive */
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Cannot modify live config if domain is inactive"));
return -1;
}
} else {
/* Only live config can be changed if xendConfigVersion < 3 */
if (priv->xendConfigVersion < 3 &&
(flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT ||
flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Xend version does not support modifying "
"persisted config"));
return -1;
}
/* Xen only supports modifying both live and persisted config if
* xendConfigVersion >= 3
*/
if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Xend only supports modifying both live and "
"persisted config"));
return -1;
}
}
if (!(def = xenDaemonDomainFetch(domain->conn, if (!(def = xenDaemonDomainFetch(domain->conn,
domain->id, domain->id,
@ -4203,16 +4234,18 @@ cleanup:
} }
/** /**
* xenDaemonDetachDevice: * xenDaemonDetachDeviceFlags:
* @domain: pointer to domain object * @domain: pointer to domain object
* @xml: pointer to XML description of device * @xml: pointer to XML description of device
* @flags: an OR'ed set of virDomainDeviceModifyFlags
* *
* Destroy a virtual device attachment to backend. * Destroy a virtual device attachment to backend.
* *
* Returns 0 in case of success, -1 in case of failure. * Returns 0 in case of success, -1 in case of failure.
*/ */
static int static int
xenDaemonDetachDevice(virDomainPtr domain, const char *xml) xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
unsigned int flags)
{ {
xenUnifiedPrivatePtr priv; xenUnifiedPrivatePtr priv;
char class[8], ref[80]; char class[8], ref[80];
@ -4230,12 +4263,41 @@ xenDaemonDetachDevice(virDomainPtr domain, const char *xml)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData; priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
/* if (domain->id < 0) {
* on older Xen without the inactive guests management /* If xendConfigVersion < 3 only live config can be changed */
* avoid doing this on inactive guests if (priv->xendConfigVersion < 3) {
*/ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
if ((domain->id < 0) && (priv->xendConfigVersion < 3)) _("Xend version does not support modifying "
return -1; "persisted config"));
return -1;
}
/* Cannot modify live config if domain is inactive */
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Cannot modify live config if domain is inactive"));
return -1;
}
} else {
/* Only live config can be changed if xendConfigVersion < 3 */
if (priv->xendConfigVersion < 3 &&
(flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT ||
flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Xend version does not support modifying "
"persisted config"));
return -1;
}
/* Xen only supports modifying both live and persisted config if
* xendConfigVersion >= 3
*/
if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
_("Xend only supports modifying both live and "
"persisted config"));
return -1;
}
}
if (!(def = xenDaemonDomainFetch(domain->conn, if (!(def = xenDaemonDomainFetch(domain->conn,
domain->id, domain->id,
@ -5165,8 +5227,8 @@ struct xenUnifiedDriver xenDaemonDriver = {
xenDaemonDomainCreate, /* domainCreate */ xenDaemonDomainCreate, /* domainCreate */
xenDaemonDomainDefineXML, /* domainDefineXML */ xenDaemonDomainDefineXML, /* domainDefineXML */
xenDaemonDomainUndefine, /* domainUndefine */ xenDaemonDomainUndefine, /* domainUndefine */
xenDaemonAttachDevice, /* domainAttachDevice */ xenDaemonAttachDeviceFlags, /* domainAttachDeviceFlags */
xenDaemonDetachDevice, /* domainDetachDevice */ xenDaemonDetachDeviceFlags, /* domainDetachDeviceFlags */
xenDaemonDomainGetAutostart, /* domainGetAutostart */ xenDaemonDomainGetAutostart, /* domainGetAutostart */
xenDaemonDomainSetAutostart, /* domainSetAutostart */ xenDaemonDomainSetAutostart, /* domainSetAutostart */
xenDaemonGetSchedulerType, /* domainGetSchedulerType */ xenDaemonGetSchedulerType, /* domainGetSchedulerType */

View File

@ -65,8 +65,10 @@
static int xenXMConfigSetString(virConfPtr conf, const char *setting, static int xenXMConfigSetString(virConfPtr conf, const char *setting,
const char *str); const char *str);
char * xenXMAutoAssignMac(void); char * xenXMAutoAssignMac(void);
static int xenXMDomainAttachDevice(virDomainPtr domain, const char *xml); static int xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
static int xenXMDomainDetachDevice(virDomainPtr domain, const char *xml); unsigned int flags);
static int xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
unsigned int flags);
#define XM_REFRESH_INTERVAL 10 #define XM_REFRESH_INTERVAL 10
@ -109,8 +111,8 @@ struct xenUnifiedDriver xenXMDriver = {
xenXMDomainCreate, /* domainCreate */ xenXMDomainCreate, /* domainCreate */
xenXMDomainDefineXML, /* domainDefineXML */ xenXMDomainDefineXML, /* domainDefineXML */
xenXMDomainUndefine, /* domainUndefine */ xenXMDomainUndefine, /* domainUndefine */
xenXMDomainAttachDevice, /* domainAttachDevice */ xenXMDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
xenXMDomainDetachDevice, /* domainDetachDevice */ xenXMDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */
@ -2914,17 +2916,21 @@ cleanup:
/** /**
* xenXMDomainAttachDevice: * xenXMDomainAttachDeviceFlags:
* @domain: pointer to domain object * @domain: pointer to domain object
* @xml: pointer to XML description of device * @xml: pointer to XML description of device
* @flags: an OR'ed set of virDomainDeviceModifyFlags
* *
* Create a virtual device attachment to backend. * Create a virtual device attachment to backend.
* XML description is translated into config file. * XML description is translated into config file.
* This driver only supports device allocation to
* persisted config.
* *
* Returns 0 in case of success, -1 in case of failure. * Returns 0 in case of success, -1 in case of failure.
*/ */
static int static int
xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) { xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
unsigned int flags) {
const char *filename = NULL; const char *filename = NULL;
xenXMConfCachePtr entry = NULL; xenXMConfCachePtr entry = NULL;
int ret = -1; int ret = -1;
@ -2940,7 +2946,7 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
if (domain->conn->flags & VIR_CONNECT_RO) if (domain->conn->flags & VIR_CONNECT_RO)
return -1; return -1;
if (domain->id != -1) if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
return -1; return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData; priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
@ -3002,16 +3008,20 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
/** /**
* xenXMDomainDetachDevice: * xenXMDomainDetachDeviceFlags:
* @domain: pointer to domain object * @domain: pointer to domain object
* @xml: pointer to XML description of device * @xml: pointer to XML description of device
* @flags: an OR'ed set of virDomainDeviceModifyFlags
* *
* Destroy a virtual device attachment to backend. * Destroy a virtual device attachment to backend.
* This driver only supports device deallocation from
* persisted config.
* *
* Returns 0 in case of success, -1 in case of failure. * Returns 0 in case of success, -1 in case of failure.
*/ */
static int static int
xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) { xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
unsigned int flags) {
const char *filename = NULL; const char *filename = NULL;
xenXMConfCachePtr entry = NULL; xenXMConfCachePtr entry = NULL;
virDomainDeviceDefPtr dev = NULL; virDomainDeviceDefPtr dev = NULL;
@ -3029,7 +3039,7 @@ xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
if (domain->conn->flags & VIR_CONNECT_RO) if (domain->conn->flags & VIR_CONNECT_RO)
return -1; return -1;
if (domain->id != -1) if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
return -1; return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData; priv = (xenUnifiedPrivatePtr) domain->conn->privateData;

View File

@ -76,8 +76,8 @@ struct xenUnifiedDriver xenStoreDriver = {
NULL, /* domainCreate */ NULL, /* domainCreate */
NULL, /* domainDefineXML */ NULL, /* domainDefineXML */
NULL, /* domainUndefine */ NULL, /* domainUndefine */
NULL, /* domainAttachDevice */ NULL, /* domainAttachDeviceFlags */
NULL, /* domainDetachDevice */ NULL, /* domainDetachDeviceFlags */
NULL, /* domainGetAutostart */ NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */ NULL, /* domainGetSchedulerType */