From: Michal Privoznik Date: Tue, 15 Sep 2015 11:41:42 +0000 (+0200) Subject: qemu_domain: Introduce qemuDomainDiskSourceDiffers X-Git-Tag: v1.2.20-rc1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb2ed632e6c5b67e06722c79849cce05cb079950;p=thirdparty%2Flibvirt.git qemu_domain: Introduce qemuDomainDiskSourceDiffers This new private API should return true iff sources of two disks differs in sense that qemu should be instructed to change the disk backend. For instance, ejecting a CDROM is such case, or pointing disk into a different ISO location, and so on. Signed-off-by: Michal Privoznik --- diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0ef09b2e88..bfea18b009 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3001,6 +3001,39 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, } +bool +qemuDomainDiskSourceDiffers(virConnectPtr conn, + virDomainDiskDefPtr disk, + virDomainDiskDefPtr origDisk) +{ + char *diskSrc = NULL, *origDiskSrc = NULL; + bool diskEmpty, origDiskEmpty; + bool ret = true; + + diskEmpty = virStorageSourceIsEmpty(disk->src); + origDiskEmpty = virStorageSourceIsEmpty(origDisk->src); + + if (diskEmpty && origDiskEmpty) + return false; + + if (diskEmpty ^ origDiskEmpty) + return true; + + if (qemuGetDriveSourceString(disk->src, conn, &diskSrc) < 0 || + qemuGetDriveSourceString(origDisk->src, conn, &origDiskSrc) < 0) + goto cleanup; + + /* So far in qemu disk sources are considered different + * if either path to disk or its format changes. */ + ret = virDomainDiskGetFormat(disk) != virDomainDiskGetFormat(origDisk) || + STRNEQ_NULLABLE(diskSrc, origDiskSrc); + cleanup: + VIR_FREE(diskSrc); + VIR_FREE(origDiskSrc); + return ret; +} + + bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk) { diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 91eaea174b..0b9fd1c14c 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -411,6 +411,10 @@ int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, bool force_probe, bool report_broken); +bool qemuDomainDiskSourceDiffers(virConnectPtr conn, + virDomainDiskDefPtr disk, + virDomainDiskDefPtr origDisk); + int qemuDomainStorageFileInit(virQEMUDriverPtr driver, virDomainObjPtr vm, virStorageSourcePtr src);