On Thu, Jul 21, 2011 at 05:12:15PM +0200, Peter Krempa wrote:
qemu specific code to remove associated storage to domains being
undefined
with the virDomainUndefineFlags function.
Storage devices marked as shared aren't removed.
The code checks path of domain's storage devices in the storage pools and acts
accordingly to flags passed to the undefine function.
---
src/qemu/qemu_driver.c | 32 +++++++++++++++++++++++++++++++-
1 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cd65bce..03a079f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4320,8 +4320,14 @@ qemuDomainUndefineFlags(virDomainPtr dom,
virDomainEventPtr event = NULL;
char *name = NULL;
int ret = -1;
+ int i = 0;
+ virDomainDiskDefPtr disk = NULL;
+ virConnectPtr conn = NULL;
+ virStorageVolPtr volume = NULL;
- virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE, -1);
+ virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE |
+ VIR_DOMAIN_UNDEFINE_DISK_FILE |
+ VIR_DOMAIN_UNDEFINE_DISK_BACKEND , -1);
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
@@ -4366,6 +4372,30 @@ qemuDomainUndefineFlags(virDomainPtr dom,
}
}
+ // remove disk images while undefinig the domain
+ if ((flags & VIR_DOMAIN_UNDEFINE_DISK_FILE || flags &
VIR_DOMAIN_UNDEFINE_DISK_BACKEND) &&
+ ((conn = virDomainGetConnect(dom)) != NULL)) {
+
+ for (i = 0; i < vm->def->ndisks; i++) {
+ disk = (vm->def->disks)[i];
+
+ // lookup the device in the storage pool
+ if ((volume = virStorageVolLookupByPath(conn, disk->src)) == NULL) {
+ if (disk->type == VIR_DOMAIN_DISK_TYPE_FILE &&
!disk->shared) {
+ if (unlink(disk->src) < 0)
+ VIR_WARN("Couldn't remove disk image file: '%s'
while undefining domain '%s'", disk->src, vm->def->name);
+ else
+ VIR_INFO("Disk image '%s' removed.",
disk->src);
+ }
+ } else {
+ if (!disk->shared) {
+ if(virStorageVolDelete(volume, 0) == -1)
+ VIR_WARN("Couldn't remove storage volume with path
'%s' while undefining domain '%s'", disk->src,
vm->def->name);
+ }
+ }
+ }
+ }
The way this code deals with errors deleting disks is the pefect example
of why adding these flags to virDomainUndefine is a bad idea. Any serious
user of these APIs, now needs to use all the virStorageVol APIs anyway
to check if the disks for the VM really were deleted.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|