From: Peter Krempa Date: Tue, 21 Jan 2014 14:34:39 +0000 (+0100) Subject: qemu: snapshot: Forbid snapshots when backing is a scsi passthrough disk X-Git-Tag: v1.2.2-rc1~247 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d1e9e47794f95b9862a3f75d268380b7b700687;p=thirdparty%2Flibvirt.git qemu: snapshot: Forbid snapshots when backing is a scsi passthrough disk https://bugzilla.redhat.com/show_bug.cgi?id=1034993 SCSI passthrough disks () can't be used as backing for snapshots. Currently with upstream qemu the vm crashes on such attempt. This patch adds a early check to catch an attempt to do such a snapshot and rejects it right away. qemu will fix the issue but this will let us control the error message. --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b101d77c81..bc2971446b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12206,7 +12206,7 @@ endjob: } static int -qemuDomainSnapshotPrepareDiskExternalBacking(virDomainDiskDefPtr disk) +qemuDomainSnapshotPrepareDiskExternalBackingInactive(virDomainDiskDefPtr disk) { int actualType = qemuDiskGetActualType(disk); @@ -12249,6 +12249,23 @@ qemuDomainSnapshotPrepareDiskExternalBacking(virDomainDiskDefPtr disk) } +static int +qemuDomainSnapshotPrepareDiskExternalBackingActive(virDomainDiskDefPtr disk) +{ + int actualType = qemuDiskGetActualType(disk); + + if (actualType == VIR_DOMAIN_DISK_TYPE_BLOCK && + disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("external active snapshots are not supported on scsi " + "passthrough devices")); + return -1; + } + + return 0; +} + + static int qemuDomainSnapshotPrepareDiskExternalOverlayActive(virDomainSnapshotDiskDefPtr disk) { @@ -12315,12 +12332,15 @@ qemuDomainSnapshotPrepareDiskExternal(virConnectPtr conn, if (qemuTranslateDiskSourcePool(conn, disk) < 0) return -1; - if (qemuDomainSnapshotPrepareDiskExternalBacking(disk) < 0) + if (qemuDomainSnapshotPrepareDiskExternalBackingInactive(disk) < 0) return -1; if (qemuDomainSnapshotPrepareDiskExternalOverlayInactive(snapdisk) < 0) return -1; } else { + if (qemuDomainSnapshotPrepareDiskExternalBackingActive(disk) < 0) + return -1; + if (qemuDomainSnapshotPrepareDiskExternalOverlayActive(snapdisk) < 0) return -1; }