[libvirt] [PATCH v3] virsh: Do not check the input XML at virsh layer for cmdDetachDevice

Osier Yang jyang at redhat.com
Tue Feb 7 16:39:32 UTC 2012


Any device XML doesn't use the same order as libvirt generates, or
uses decimal for attributes like "slot" of "<address>" will cause
device detaching to fail, as virsh compares the XML simply earlier
in strict manner before internal parsing.

This is regression introduced by ea7182c.

v1 is here:
https://www.redhat.com/archives/libvir-list/2012-January/msg00395.html

---
 tools/virsh.c |   23 +++++------------------
 1 files changed, 5 insertions(+), 18 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 72ca93a..8222358 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -13153,6 +13153,7 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
  * @n2 second node
  * returns true in case n1 covers n2, false otherwise.
  */
+ATTRIBUTE_UNUSED
 static bool
 vshNodeIsSuperset(xmlNodePtr n1, xmlNodePtr n2)
 {
@@ -13278,6 +13279,7 @@ cleanup:
  *          (is too ambiguous), 0 in case of success. Otherwise returns -1. @newXML
  *          is touched only in case of success.
  */
+ATTRIBUTE_UNUSED
 static int
 vshCompleteXMLFromDomain(vshControl *ctl, virDomainPtr dom, char *oldXML,
                          char **newXML)
@@ -13412,7 +13414,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     const char *from = NULL;
-    char *buffer = NULL, *new_buffer = NULL;
+    char *buffer = NULL;
     int ret;
     bool funcRet = false;
     unsigned int flags;
@@ -13431,27 +13433,13 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    ret = vshCompleteXMLFromDomain(ctl, dom, buffer, &new_buffer);
-    if (ret < 0) {
-        if (ret == -2) {
-            vshError(ctl, _("no such device in %s"), virDomainGetName(dom));
-        } else if (ret == -3) {
-            vshError(ctl, "%s", _("given XML selects too many devices. "
-                                  "Please, be more specific"));
-        } else {
-            /* vshCompleteXMLFromDomain() already printed error message,
-             * so nothing to do here. */
-        }
-        goto cleanup;
-    }
-
     if (vshCommandOptBool(cmd, "persistent")) {
         flags = VIR_DOMAIN_AFFECT_CONFIG;
         if (virDomainIsActive(dom) == 1)
            flags |= VIR_DOMAIN_AFFECT_LIVE;
-        ret = virDomainDetachDeviceFlags(dom, new_buffer, flags);
+        ret = virDomainDetachDeviceFlags(dom, buffer, flags);
     } else {
-        ret = virDomainDetachDevice(dom, new_buffer);
+        ret = virDomainDetachDevice(dom, buffer);
     }
 
     if (ret < 0) {
@@ -13463,7 +13451,6 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
     funcRet = true;
 
 cleanup:
-    VIR_FREE(new_buffer);
     VIR_FREE(buffer);
     virDomainFree(dom);
     return funcRet;
-- 
1.7.7.3




More information about the libvir-list mailing list