]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain{Attach,Detach}DeviceFlags handler for drivers
authorJim Fehlig <jfehlig@novell.com>
Thu, 14 Jan 2010 01:44:26 +0000 (18:44 -0700)
committerJim Fehlig <jfehlig@novell.com>
Mon, 8 Feb 2010 17:49:43 +0000 (10:49 -0700)
Implementation of domain{Attach,Detach}DeviceFlags handlers
in the drivers.

17 files changed:
src/esx/esx_driver.c
src/lxc/lxc_driver.c
src/opennebula/one_driver.c
src/openvz/openvz_driver.c
src/phyp/phyp_driver.c
src/qemu/qemu_driver.c
src/test/test_driver.c
src/uml/uml_driver.c
src/vbox/vbox_tmpl.c
src/xen/proxy_internal.c
src/xen/xen_driver.c
src/xen/xen_driver.h
src/xen/xen_hypervisor.c
src/xen/xen_inotify.c
src/xen/xend_internal.c
src/xen/xm_internal.c
src/xen/xs_internal.c

index fc5a50e5894ac8eba2ad22e25b6643d9eeba8e42..72d177b2ea79bdeb8d4b0a8ba3aa1466f84a1bc7 100644 (file)
@@ -3372,7 +3372,9 @@ static virDriver esxDriver = {
     esxDomainDefineXML,              /* domainDefineXML */
     esxDomainUndefine,               /* domainUndefine */
     NULL,                            /* domainAttachDevice */
+    NULL,                            /* domainAttachDeviceFlags */
     NULL,                            /* domainDetachDevice */
+    NULL,                            /* domainDetachDeviceFlags */
     NULL,                            /* domainGetAutostart */
     NULL,                            /* domainSetAutostart */
     esxDomainGetSchedulerType,       /* domainGetSchedulerType */
index d78f7f73eeed0db3af115a8e9fec7c0a300a18c0..d149955473d5c4f15e0314362a6d545549c80ecb 100644 (file)
@@ -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 */
index c96d24d16419c8b1cb5941eeaf7a51a8f53b1524..a3fea67e7173743f05e91c46ea69bebbc8b5fb17 100644 (file)
@@ -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 */
index 196fd8c1ed88f9e897cc58e40831d0fdc010d81f..b16efef26c9421bd796122c0b5fac1691a568153 100644 (file)
@@ -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 */
index bd5cfc7b3796a0a57ff24061b30190269143078d..5474bda4dad81eb84b857638c52e14f2f542f64e 100644 (file)
@@ -1622,7 +1622,9 @@ virDriver phypDriver = {
     NULL,                       /* domainDefineXML */
     NULL,                       /* domainUndefine */
     NULL,                       /* domainAttachDevice */
+    NULL,                       /* domainAttachDeviceFlags */
     NULL,                       /* domainDetachDevice */
+    NULL,                       /* domainDetachDeviceFlags */
     NULL,                       /* domainGetAutostart */
     NULL,                       /* domainSetAutostart */
     NULL,                       /* domainGetSchedulerType */
index 1e796ef6b9d14b477624337195650dea52a138c5..6bffc8d20af7eb1e6f9204782e3cad85b164aa48 100644 (file)
@@ -6057,6 +6057,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,
@@ -6464,6 +6476,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;
@@ -8577,7 +8601,9 @@ static virDriver qemuDriver = {
     qemudDomainDefine, /* domainDefineXML */
     qemudDomainUndefine, /* domainUndefine */
     qemudDomainAttachDevice, /* domainAttachDevice */
+    qemudDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
     qemudDomainDetachDevice, /* domainDetachDevice */
+    qemudDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
     qemudDomainGetAutostart, /* domainGetAutostart */
     qemudDomainSetAutostart, /* domainSetAutostart */
     qemuGetSchedulerType, /* domainGetSchedulerType */
index 2122a1b68623b35977d8c18b2a9dc07471eeeab5..1feca1cfbcb4c10e78a04582a99281660d8dabc2 100644 (file)
@@ -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 */
index 31cea5cd7f61b1ad4f850d5331201d03e34bcd7b..53cd32b40ba1fad3ada0987cf3896aa7e27a39b0 100644 (file)
@@ -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 */
index e40c84873e6c72e23689c0de5fe6885682a099f7..76567e32595ce4a8a30c000cc71b713d2903249b 100644 (file)
@@ -4835,6 +4835,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;
@@ -4965,6 +4976,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) */
@@ -7001,7 +7023,9 @@ virDriver NAME(Driver) = {
     vboxDomainDefineXML, /* domainDefineXML */
     vboxDomainUndefine, /* domainUndefine */
     vboxDomainAttachDevice, /* domainAttachDevice */
+    vboxDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
     vboxDomainDetachDevice, /* domainDetachDevice */
+    vboxDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
     NULL, /* domainGetAutostart */
     NULL, /* domainSetAutostart */
     NULL, /* domainGetSchedulerType */
index bde3edaf33240b4a78645776efc708f8dc55758e..036be507b6776b74a3dbf8f662eb0847e4848e6d 100644 (file)
@@ -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 */
index 72f56ae2aa1565d9099ca98826809e8ee3321c50..525b070f96959d50c30d133c3b5f08abbe9ec7e5 100644 (file)
@@ -1425,13 +1425,32 @@ xenUnifiedDomainUndefine (virDomainPtr dom)
 
 static int
 xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
+{
+    GET_PRIVATE(dom->conn);
+    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)
+        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]->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;
@@ -1439,13 +1458,32 @@ xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
 
 static int
 xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
+{
+    GET_PRIVATE(dom->conn);
+    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)
+        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;
@@ -1835,7 +1873,9 @@ static virDriver xenUnifiedDriver = {
     xenUnifiedDomainDefineXML, /* domainDefineXML */
     xenUnifiedDomainUndefine, /* domainUndefine */
     xenUnifiedDomainAttachDevice, /* domainAttachDevice */
+    xenUnifiedDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
     xenUnifiedDomainDetachDevice, /* domainDetachDevice */
+    xenUnifiedDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
     xenUnifiedDomainGetAutostart, /* domainGetAutostart */
     xenUnifiedDomainSetAutostart, /* domainSetAutostart */
     xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */
index 185eb2b308ab44a9c812008e3bb7d460d4da99cf..defe6e22aceb73a2d78a04f7d64ed3907c4504c0 100644 (file)
@@ -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;
index 16c91e1d92c67075fe7afbc9e4b55630c9bb9a7d..6c778c5336f71e0d07438c889d0ec177100317f1 100644 (file)
@@ -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 */
index d9dfbb7fc095ea3d97d99f31fc8897b8c6fc2124..e3845d8d938b8b1fde53a098d8f987f548b49565 100644 (file)
@@ -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 */
index 9c5127f26a5178e97c8300675651a17085c36b9c..207004a86bac3f3434c473e629583524ea102ab0 100644 (file)
@@ -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 */
index 944d5d513f28ac8f55673c6409801f6a81e1ae11..43efe08b6b92d6a7025db6d8cb8eb49b04ca6bcd 100644 (file)
 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;
index 620c482a78ebf94d71b29091577479593d8d09ee..4b8823995ec5fbd969a819578e613191f01c7656 100644 (file)
@@ -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 */