On Mon, Jun 25, 2018 at 10:50:32 +0100, Daniel Berrange wrote:
Currently we format the serial, geometry and error policy on the
-drive
backend argument.
QEMU added the ability to set serial and geometry on the frontend in
the 1.2 release, and ability to set error policy in the 2.7 release.
usb-storage is an oddity, however, as it lacks error policy support
right now.
Setting any of these on -drive has been deprecated and support for this
will be removed very soon.
Note that some disk buses (sd) still don't support -device. Although
QEMU allowed these properties to be set on -drive for if=sd, they
have been ignored so we don't loose anything by removing this.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 31 ++++++++++++++++---
.../caps_2.10.0.aarch64.xml | 1 +
.../caps_2.10.0.ppc64.xml | 1 +
.../caps_2.10.0.s390x.xml | 1 +
.../caps_2.10.0.x86_64.xml | 1 +
.../caps_2.11.0.s390x.xml | 1 +
.../caps_2.12.0.aarch64.xml | 1 +
.../caps_2.12.0.ppc64.xml | 1 +
.../caps_2.12.0.s390x.xml | 1 +
.../caps_2.12.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 +
.../caps_2.7.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 +
.../caps_2.8.0.x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 +
.../caps_2.9.0.x86_64.xml | 1 +
.../disk-drive-network-tlsx509.args | 12 +++----
.../disk-drive-network-vxhs.args | 4 +--
tests/qemuxml2argvdata/disk-drive-shared.args | 5 +--
tests/qemuxml2argvdata/disk-geometry.args | 6 ++--
tests/qemuxml2argvdata/disk-ide-wwn.args | 5 ++-
.../qemuxml2argvdata/disk-scsi-disk-wwn.args | 4 +--
tests/qemuxml2argvdata/disk-serial.args | 10 +++---
tests/qemuxml2argvdata/disk-serial.xml | 1 -
tests/qemuxml2argvtest.c | 1 +
tests/qemuxml2xmloutdata/disk-serial.xml | 1 -
29 files changed, 69 insertions(+), 30 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 419208ad5c..b9a6c2d612 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -500,6 +500,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
/* 310 */
"sev-guest",
+ "disk-error",
);
@@ -1162,6 +1163,7 @@ static struct virQEMUCapsStringFlags
virQEMUCapsDevicePropsVirtioBlk[] = {
{ "iommu_platform", QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM },
{ "ats", QEMU_CAPS_VIRTIO_PCI_ATS },
{ "write-cache", QEMU_CAPS_DISK_WRITE_CACHE },
+ { "werror", QEMU_CAPS_DISK_ERROR },
};
Please split-off capability changes into a separate commit as it's
usual.
static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioNet[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 3519a194e9..1245fb46cf 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -484,6 +484,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check
*/
/* 310 */
QEMU_CAPS_SEV_GUEST, /* -object sev-guest,... */
+ QEMU_CAPS_DISK_ERROR, /* -device $DISK,werror=,rerror=X */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 446df3e1d8..e97158fe64 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1621,8 +1621,6 @@ qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
virBufferAddLit(buf, ",serial=");
virBufferEscape(buf, '\\', " ", "%s",
disk->serial);
}
-
- qemuBuildDiskFrontendAttributeErrorPolicy(disk, buf);
}
@@ -1662,11 +1660,29 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
virBufferAsprintf(&opt, "if=%s",
virDomainDiskQEMUBusTypeToString(disk->bus));
virBufferAsprintf(&opt, ",index=%d", idx);
+
+ if (disk->serial) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Serial property not supported for drive bus
'%s'"),
+ virDomainDiskBusTypeToString(disk->bus));
+ goto error;
+ }
+ if (disk->geometry.cylinders > 0 &&
+ disk->geometry.heads > 0 &&
+ disk->geometry.sectors > 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Geometry not supported for drive bus
'%s'"),
+ virDomainDiskBusTypeToString(disk->bus));
+ goto error;
+ }
}
- /* Format attributes for the drive itself (not the storage backing it) which
- * we've formatted historically with -drive */
- qemuBuildDiskFrontendAttributes(disk, &opt);
+ /* werror/rerror are really frontend attributes, but older
+ * qemu requires them on -drive instead of -device */
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISK_ERROR) ||
+ disk->bus == VIR_DOMAIN_DISK_BUS_USB)
+ qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt);
+
/* While this is a frontend attribute, it only makes sense to be used when
* legacy -drive is used. In modern qemu the 'ide-cd' or 'scsi-cd'
are used.
@@ -2125,6 +2141,11 @@ qemuBuildDriveDevStr(const virDomainDef *def,
if (qemuBuildDriveDevCacheStr(disk, &opt, qemuCaps) < 0)
goto error;
+ qemuBuildDiskFrontendAttributes(disk, &opt);
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISK_ERROR) &&
+ disk->bus != VIR_DOMAIN_DISK_BUS_USB)
Why is USB special here? Switching to -blockdev will require doing this
also for the USB disk, so I'd rather have a single case here.
+ qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt);
+
if (virBufferCheckError(&opt) < 0)
goto error;
The rest looks good.