]> xenbits.xensource.com Git - libvirt.git/commitdiff
vbox: Close media when undefining domains
authorDawid Zamirski <dzamirski@datto.com>
Tue, 24 Oct 2017 19:35:25 +0000 (15:35 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Fri, 3 Nov 2017 17:13:09 +0000 (13:13 -0400)
When registering a VM we call OpenMedium on each disk image which adds it
to vbox's global media registry. Therefore, we should make sure to call
Close when unregistering VM so we cleanup the media registry entries
after ourselves - this does not remove disk image files. This follows
the behaviour of the VBoxManage unregistervm command.

src/vbox/vbox_tmpl.c

index bd7fd7e65fc4c369fa975c5a19f0709cdaea98d6..4f1662bc1ad515deefba676654c3e229be352c89 100644 (file)
@@ -400,6 +400,8 @@ _unregisterMachine(vboxDriverPtr data, vboxIID *iid, IMachine **machine)
 {
     nsresult rc;
     vboxArray media = VBOX_ARRAY_INITIALIZER;
+    size_t i;
+
     rc = data->vboxObj->vtbl->FindMachine(data->vboxObj, iid->value, machine);
     if (NS_FAILED(rc)) {
         virReportError(VIR_ERR_NO_DOMAIN, "%s",
@@ -407,12 +409,24 @@ _unregisterMachine(vboxDriverPtr data, vboxIID *iid, IMachine **machine)
         return rc;
     }
 
-    /* We're not interested in the array returned by the Unregister method,
-     * but in the side effect of unregistering the virtual machine. In order
-     * to call the Unregister method correctly we need to use the vboxArray
-     * wrapper here. */
     rc = vboxArrayGetWithUintArg(&media, *machine, (*machine)->vtbl->Unregister,
-                                 CleanupMode_DetachAllReturnNone);
+                                 CleanupMode_DetachAllReturnHardDisksOnly);
+
+    if (NS_FAILED(rc))
+        goto cleanup;
+
+    /* close each medium attached to VM to remove from media registry */
+    for (i = 0; i < media.count; i++) {
+        IMedium *medium = media.items[i];
+
+        if (!medium)
+            continue;
+
+        /* it's ok to ignore failure here - e.g. it may be used by another VM */
+        ignore_value(medium->vtbl->Close(medium));
+    }
+
+ cleanup:
     vboxArrayUnalloc(&media);
     return rc;
 }