]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: Correctly detect inserted media in change-media command
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 13 Jan 2016 16:32:05 +0000 (17:32 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 25 Jan 2016 14:57:23 +0000 (15:57 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1250331

It all works like this. The change-media command dumps domain
XML, finds the corresponding cdrom device we want to change media
in and returns it in the xmlNodePtr form. This way we don't have
to bother with keeping all the subelements or attributes that we
don't care about in the XML that is fed back to libvirt for the
update API.

Now, the problem is we try to be clever here and detect if disk
already has a source (indicated by <source/> subelement).
However, bare fact that the element is there does not mean disk
has source. Make our clever check better.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
tools/virsh-domain.c

index 828ba4201e646fac50ad06c40afd9acded38df9a..dd412603d00ef00773d5c9e3c1b9675a7afbb61a 100644 (file)
@@ -11055,6 +11055,7 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
     char *device_type = NULL;
     char *ret = NULL;
     char *startupPolicy = NULL;
+    char *source_path = NULL;
 
     if (!disk_node)
         return NULL;
@@ -11111,7 +11112,13 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
     }
 
     if (source) {
-        if (type == VIRSH_UPDATE_DISK_XML_INSERT) {
+        if (!(source_path = virXMLPropString(source, "file")) &&
+            !(source_path = virXMLPropString(source, "dev")) &&
+            !(source_path = virXMLPropString(source, "dir")) &&
+            !(source_path = virXMLPropString(source, "pool")))
+            source_path = virXMLPropString(source, "name");
+
+        if (source_path && type == VIRSH_UPDATE_DISK_XML_INSERT) {
             vshError(NULL, _("The disk device '%s' already has media"), target);
             goto cleanup;
         }
@@ -11170,6 +11177,7 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
  cleanup:
     VIR_FREE(device_type);
     VIR_FREE(startupPolicy);
+    VIR_FREE(source_path);
     return ret;
 }