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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list