[libvirt] [PATCH 8/9] domain{Attach, Detach}DeviceFlags handler for drivers
Daniel P. Berrange
berrange at redhat.com
Tue Jan 19 19:43:01 UTC 2010
On Thu, Jan 14, 2010 at 10:42:45AM -0700, Jim Fehlig wrote:
> Implementation of domain{Attach,Detach}DeviceFlags handlers
> in the drivers.
> ---
> src/esx/esx_driver.c | 2 +
> src/lxc/lxc_driver.c | 2 +
> src/opennebula/one_driver.c | 2 +
> src/openvz/openvz_driver.c | 2 +
> src/phyp/phyp_driver.c | 2 +
> src/qemu/qemu_driver.c | 26 +++++++++++
> src/test/test_driver.c | 2 +
> src/uml/uml_driver.c | 2 +
> src/vbox/vbox_tmpl.c | 24 ++++++++++
> src/xen/proxy_internal.c | 4 +-
> src/xen/xen_driver.c | 42 +++++++++++++++++--
> src/xen/xen_driver.h | 4 +-
> src/xen/xen_hypervisor.c | 4 +-
> src/xen/xen_inotify.c | 4 +-
> src/xen/xend_internal.c | 98 +++++++++++++++++++++++++++++++++++--------
> src/xen/xm_internal.c | 30 +++++++++----
> src/xen/xs_internal.c | 4 +-
> 17 files changed, 212 insertions(+), 42 deletions(-)
>
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index ddda66e..577c1c7 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -3443,7 +3443,9 @@ static virDriver esxDriver = {
> esxDomainDefineXML, /* domainDefineXML */
> esxDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> esxDomainGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 86606c7..d80f20c 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2427,7 +2427,9 @@ static virDriver lxcDriver = {
> lxcDomainDefine, /* domainDefineXML */
> lxcDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> lxcDomainGetAutostart, /* domainGetAutostart */
> lxcDomainSetAutostart, /* domainSetAutostart */
> lxcGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
> index ad7faca..509cbc3 100644
> --- a/src/opennebula/one_driver.c
> +++ b/src/opennebula/one_driver.c
> @@ -754,7 +754,9 @@ static virDriver oneDriver = {
> oneDomainDefine, /* domainDefineXML */
> oneDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> oneGetAutostart, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 196fd8c..b16efef 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -1506,7 +1506,9 @@ static virDriver openvzDriver = {
> openvzDomainDefineXML, /* domainDefineXML */
> openvzDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> openvzDomainGetAutostart, /* domainGetAutostart */
> openvzDomainSetAutostart, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index bd5cfc7..5474bda 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -1622,7 +1622,9 @@ virDriver phypDriver = {
> NULL, /* domainDefineXML */
> NULL, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index deb8adc..02a6212 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5544,6 +5544,18 @@ cleanup:
> 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,
> struct qemud_driver *driver,
> virDomainObjPtr vm,
> @@ -5872,6 +5884,18 @@ cleanup:
> 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,
> int *autostart) {
> struct qemud_driver *driver = dom->conn->privateData;
> @@ -7985,7 +8009,9 @@ static virDriver qemuDriver = {
> qemudDomainDefine, /* domainDefineXML */
> qemudDomainUndefine, /* domainUndefine */
> qemudDomainAttachDevice, /* domainAttachDevice */
> + qemudDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
> qemudDomainDetachDevice, /* domainDetachDevice */
> + qemudDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
> qemudDomainGetAutostart, /* domainGetAutostart */
> qemudDomainSetAutostart, /* domainSetAutostart */
> qemuGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 2122a1b..1feca1c 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -5209,7 +5209,9 @@ static virDriver testDriver = {
> testDomainDefineXML, /* domainDefineXML */
> testDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> testDomainGetAutostart, /* domainGetAutostart */
> testDomainSetAutostart, /* domainSetAutostart */
> testDomainGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index b808090..6adaf9f 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1895,7 +1895,9 @@ static virDriver umlDriver = {
> umlDomainDefine, /* domainDefineXML */
> umlDomainUndefine, /* domainUndefine */
> NULL, /* domainAttachDevice */
> + NULL, /* domainAttachDeviceFlags */
> NULL, /* domainDetachDevice */
> + NULL, /* domainDetachDeviceFlags */
> umlDomainGetAutostart, /* domainGetAutostart */
> umlDomainSetAutostart, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 07696c0..79915c2 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -4837,6 +4837,17 @@ cleanup:
> 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) {
> VBOX_OBJECT_CHECK(dom->conn, int, -1);
> IMachine *machine = NULL;
> @@ -4967,6 +4978,17 @@ cleanup:
> 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
> /* No Callback support for VirtualBox 2.2.* series */
> #else /* !(VBOX_API_VERSION == 2002) */
> @@ -7013,7 +7035,9 @@ virDriver NAME(Driver) = {
> vboxDomainDefineXML, /* domainDefineXML */
> vboxDomainUndefine, /* domainUndefine */
> vboxDomainAttachDevice, /* domainAttachDevice */
> + vboxDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
> vboxDomainDetachDevice, /* domainDetachDevice */
> + vboxDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/proxy_internal.c b/src/xen/proxy_internal.c
> index 73a0469..33f82c2 100644
> --- a/src/xen/proxy_internal.c
> +++ b/src/xen/proxy_internal.c
> @@ -76,8 +76,8 @@ struct xenUnifiedDriver xenProxyDriver = {
> NULL, /* domainCreate */
> NULL, /* domainDefineXML */
> NULL, /* domainUndefine */
> - NULL, /* domainAttachDevice */
> - NULL, /* domainDetachDevice */
> + NULL, /* domainAttachDeviceFlags */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 4911c9e..141e415 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1426,10 +1426,26 @@ xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
> {
> GET_PRIVATE(dom->conn);
> int i;
> + unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
>
> for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> - if (priv->opened[i] && drivers[i]->domainAttachDevice &&
> - drivers[i]->domainAttachDevice (dom, xml) == 0)
> + if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
> + 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 -1;
> @@ -1440,10 +1456,26 @@ xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
> {
> GET_PRIVATE(dom->conn);
> int i;
> + unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> +
> + 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 -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]->domainDetachDevice &&
> - drivers[i]->domainDetachDevice (dom, xml) == 0)
> + if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
> + drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
> return 0;
>
> return -1;
> @@ -1833,7 +1865,9 @@ static virDriver xenUnifiedDriver = {
> xenUnifiedDomainDefineXML, /* domainDefineXML */
> xenUnifiedDomainUndefine, /* domainUndefine */
> xenUnifiedDomainAttachDevice, /* domainAttachDevice */
> + xenUnifiedDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
> xenUnifiedDomainDetachDevice, /* domainDetachDevice */
> + xenUnifiedDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
> xenUnifiedDomainGetAutostart, /* domainGetAutostart */
> xenUnifiedDomainSetAutostart, /* domainSetAutostart */
> xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
> index 185eb2b..defe6e2 100644
> --- a/src/xen/xen_driver.h
> +++ b/src/xen/xen_driver.h
> @@ -93,8 +93,8 @@ struct xenUnifiedDriver {
> virDrvDomainCreate domainCreate;
> virDrvDomainDefineXML domainDefineXML;
> virDrvDomainUndefine domainUndefine;
> - virDrvDomainAttachDevice domainAttachDevice;
> - virDrvDomainDetachDevice domainDetachDevice;
> + virDrvDomainAttachDeviceFlags domainAttachDeviceFlags;
> + virDrvDomainDetachDeviceFlags domainDetachDeviceFlags;
> virDrvDomainGetAutostart domainGetAutostart;
> virDrvDomainSetAutostart domainSetAutostart;
> virDrvDomainGetSchedulerType domainGetSchedulerType;
> diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
> index 6d8accc..baa626f 100644
> --- a/src/xen/xen_hypervisor.c
> +++ b/src/xen/xen_hypervisor.c
> @@ -793,8 +793,8 @@ struct xenUnifiedDriver xenHypervisorDriver = {
> NULL, /* domainCreate */
> NULL, /* domainDefineXML */
> NULL, /* domainUndefine */
> - NULL, /* domainAttachDevice */
> - NULL, /* domainDetachDevice */
> + NULL, /* domainAttachDeviceFlags */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> xenHypervisorGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
> index d9dfbb7..e3845d8 100644
> --- a/src/xen/xen_inotify.c
> +++ b/src/xen/xen_inotify.c
> @@ -79,8 +79,8 @@ struct xenUnifiedDriver xenInotifyDriver = {
> NULL, /* domainCreate */
> NULL, /* domainDefineXML */
> NULL, /* domainUndefine */
> - NULL, /* domainAttachDevice */
> - NULL, /* domainDetachDevice */
> + NULL, /* domainAttachDeviceFlags */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index d9bfa15..665bc47 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -4096,9 +4096,10 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
> }
>
> /**
> - * xenDaemonAttachDevice:
> + * xenDaemonAttachDeviceFlags:
> * @domain: pointer to domain object
> * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
> *
> * Create a virtual device attachment to backend.
> * 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.
> */
> static int
> -xenDaemonAttachDevice(virDomainPtr domain, const char *xml)
> +xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags)
> {
> xenUnifiedPrivatePtr priv;
> char *sexpr = NULL;
> @@ -4124,12 +4126,41 @@ xenDaemonAttachDevice(virDomainPtr domain, const char *xml)
>
> priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
>
> - /*
> - * on older Xen without the inactive guests management
> - * avoid doing this on inactive guests
> - */
> - if ((domain->id < 0) && (priv->xendConfigVersion < 3))
> - return -1;
> + if (domain->id < 0) {
> + /* If xendConfigVersion < 3 only live config can be changed */
> + if (priv->xendConfigVersion < 3) {
> + virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> + _("Xend version does not support modifying "
> + "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,
> domain->id,
> @@ -4203,16 +4234,18 @@ cleanup:
> }
>
> /**
> - * xenDaemonDetachDevice:
> + * xenDaemonDetachDeviceFlags:
> * @domain: pointer to domain object
> * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
> *
> * Destroy a virtual device attachment to backend.
> *
> * Returns 0 in case of success, -1 in case of failure.
> */
> static int
> -xenDaemonDetachDevice(virDomainPtr domain, const char *xml)
> +xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags)
> {
> xenUnifiedPrivatePtr priv;
> char class[8], ref[80];
> @@ -4230,12 +4263,41 @@ xenDaemonDetachDevice(virDomainPtr domain, const char *xml)
>
> priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
>
> - /*
> - * on older Xen without the inactive guests management
> - * avoid doing this on inactive guests
> - */
> - if ((domain->id < 0) && (priv->xendConfigVersion < 3))
> - return -1;
> + if (domain->id < 0) {
> + /* If xendConfigVersion < 3 only live config can be changed */
> + if (priv->xendConfigVersion < 3) {
> + virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> + _("Xend version does not support modifying "
> + "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,
> domain->id,
> @@ -5165,8 +5227,8 @@ struct xenUnifiedDriver xenDaemonDriver = {
> xenDaemonDomainCreate, /* domainCreate */
> xenDaemonDomainDefineXML, /* domainDefineXML */
> xenDaemonDomainUndefine, /* domainUndefine */
> - xenDaemonAttachDevice, /* domainAttachDevice */
> - xenDaemonDetachDevice, /* domainDetachDevice */
> + xenDaemonAttachDeviceFlags, /* domainAttachDeviceFlags */
> + xenDaemonDetachDeviceFlags, /* domainDetachDeviceFlags */
> xenDaemonDomainGetAutostart, /* domainGetAutostart */
> xenDaemonDomainSetAutostart, /* domainSetAutostart */
> xenDaemonGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 944d5d5..43efe08 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -65,8 +65,10 @@
> static int xenXMConfigSetString(virConfPtr conf, const char *setting,
> const char *str);
> char * xenXMAutoAssignMac(void);
> -static int xenXMDomainAttachDevice(virDomainPtr domain, const char *xml);
> -static int xenXMDomainDetachDevice(virDomainPtr domain, const char *xml);
> +static int xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags);
> +static int xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags);
>
> #define XM_REFRESH_INTERVAL 10
>
> @@ -109,8 +111,8 @@ struct xenUnifiedDriver xenXMDriver = {
> xenXMDomainCreate, /* domainCreate */
> xenXMDomainDefineXML, /* domainDefineXML */
> xenXMDomainUndefine, /* domainUndefine */
> - xenXMDomainAttachDevice, /* domainAttachDevice */
> - xenXMDomainDetachDevice, /* domainDetachDevice */
> + xenXMDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
> + xenXMDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> @@ -2914,17 +2916,21 @@ cleanup:
>
>
> /**
> - * xenXMDomainAttachDevice:
> + * xenXMDomainAttachDeviceFlags:
> * @domain: pointer to domain object
> * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
> *
> * Create a virtual device attachment to backend.
> * 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.
> */
> static int
> -xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
> +xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags) {
> const char *filename = NULL;
> xenXMConfCachePtr entry = NULL;
> int ret = -1;
> @@ -2940,7 +2946,7 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
>
> if (domain->conn->flags & VIR_CONNECT_RO)
> return -1;
> - if (domain->id != -1)
> + if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
> return -1;
>
> priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
> @@ -3002,16 +3008,20 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
>
>
> /**
> - * xenXMDomainDetachDevice:
> + * xenXMDomainDetachDeviceFlags:
> * @domain: pointer to domain object
> * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
> *
> * 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.
> */
> static int
> -xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
> +xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
> + unsigned int flags) {
> const char *filename = NULL;
> xenXMConfCachePtr entry = NULL;
> virDomainDeviceDefPtr dev = NULL;
> @@ -3029,7 +3039,7 @@ xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
>
> if (domain->conn->flags & VIR_CONNECT_RO)
> return -1;
> - if (domain->id != -1)
> + if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
> return -1;
>
> priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
> diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
> index 8a64d4e..1db0397 100644
> --- a/src/xen/xs_internal.c
> +++ b/src/xen/xs_internal.c
> @@ -76,8 +76,8 @@ struct xenUnifiedDriver xenStoreDriver = {
> NULL, /* domainCreate */
> NULL, /* domainDefineXML */
> NULL, /* domainUndefine */
> - NULL, /* domainAttachDevice */
> - NULL, /* domainDetachDevice */
> + NULL, /* domainAttachDeviceFlags */
> + NULL, /* domainDetachDeviceFlags */
> NULL, /* domainGetAutostart */
> NULL, /* domainSetAutostart */
> NULL, /* domainGetSchedulerType */
> --
ACK, all looks good.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list