mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
domain{Attach,Detach}DeviceFlags handler for drivers
Implementation of domain{Attach,Detach}DeviceFlags handlers in the drivers.
This commit is contained in:
parent
ce039c3ea5
commit
ed9c14a7ef
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user