return 0;
}
+
+
+/**
+ * qemuDomainDiskBlockJobIsSupported:
+ *
+ * Returns true if block jobs are supported on @disk by @vm or false and reports
+ * an error otherwise.
+ *
+ * Note that this does not verify whether other block jobs are running etc.
+ */
+bool
+qemuDomainDiskBlockJobIsSupported(virDomainObjPtr vm,
+ virDomainDiskDefPtr disk)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV) &&
+ qemuDiskBusIsSD(disk->bus)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("block jobs are not supported on disk '%s' using bus 'sd'"),
+ disk->dst);
+ return false;
+ }
+
+ return true;
+}
static int
-qemuDomainSnapshotPrepareDiskExternalActive(virDomainSnapshotDiskDefPtr snapdisk,
+qemuDomainSnapshotPrepareDiskExternalActive(virDomainObjPtr vm,
+ virDomainSnapshotDiskDefPtr snapdisk,
virDomainDiskDefPtr domdisk,
bool blockdev)
{
return -1;
}
+ if (!qemuDomainDiskBlockJobIsSupported(vm, domdisk))
+ return -1;
+
switch ((virStorageType)actualType) {
case VIR_STORAGE_TYPE_BLOCK:
case VIR_STORAGE_TYPE_FILE:
static int
-qemuDomainSnapshotPrepareDiskExternal(virDomainDiskDefPtr disk,
+qemuDomainSnapshotPrepareDiskExternal(virDomainObjPtr vm,
+ virDomainDiskDefPtr disk,
virDomainSnapshotDiskDefPtr snapdisk,
bool active,
bool reuse,
if (qemuDomainSnapshotPrepareDiskExternalInactive(snapdisk, disk) < 0)
return -1;
} else {
- if (qemuDomainSnapshotPrepareDiskExternalActive(snapdisk, disk, blockdev) < 0)
+ if (qemuDomainSnapshotPrepareDiskExternalActive(vm, snapdisk, disk, blockdev) < 0)
return -1;
}
return -1;
}
- if (qemuDomainSnapshotPrepareDiskExternal(dom_disk, disk,
+ if (qemuDomainSnapshotPrepareDiskExternal(vm, dom_disk, disk,
active, reuse, blockdev) < 0)
return -1;
if (qemuDomainDiskBlockJobIsActive(disk))
goto endjob;
+ if (!qemuDomainDiskBlockJobIsSupported(vm, disk))
+ goto endjob;
+
if (base &&
(virStorageFileParseChainIndex(disk->dst, base, &baseIndex) < 0 ||
!(baseSource = virStorageFileChainLookup(disk->src, disk->src,
if (qemuDomainDiskBlockJobIsActive(disk))
goto endjob;
+ if (!qemuDomainDiskBlockJobIsSupported(vm, disk))
+ goto endjob;
+
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN &&
qemuDomainDefValidateDiskLunSource(mirror) < 0)
goto endjob;
if (virDomainObjCheckActive(vm) < 0)
goto endjob;
+ if (!qemuDomainDiskBlockJobIsSupported(vm, disk))
+ goto endjob;
+
blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
/* Convert bandwidth MiB to bytes, if necessary */