From 3d1e9e47794f95b9862a3f75d268380b7b700687 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 21 Jan 2014 15:34:39 +0100 Subject: [PATCH] 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. --- src/qemu/qemu_driver.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) 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; } -- GitLab