qemu: command: Split out geometry frontend attribute formatting from -drive

Historically we've formatted a lot of the attributes of a disk (disk
geometry, etc) with -drive. Since we use -device now, they should be
formatted there. Extract them to a separate function for keeping
compatibility with SDcards which still use only -drive.

Start this by moving the geometry into a separate function.
This commit is contained in:
Peter Krempa 2017-11-01 16:31:55 +01:00
parent 3746a38e7b
commit 401ddfa4e8

View File

@ -1623,6 +1623,26 @@ qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
} }
static void
qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
virBufferPtr buf)
{
/* generate geometry command string */
if (disk->geometry.cylinders > 0 &&
disk->geometry.heads > 0 &&
disk->geometry.sectors > 0) {
virBufferAsprintf(buf, ",cyls=%u,heads=%u,secs=%u",
disk->geometry.cylinders,
disk->geometry.heads,
disk->geometry.sectors);
if (disk->geometry.trans != VIR_DOMAIN_DISK_TRANS_DEFAULT)
virBufferAsprintf(buf, ",trans=%s",
virDomainDiskGeometryTransTypeToString(disk->geometry.trans));
}
}
char * char *
qemuBuildDriveStr(virDomainDiskDefPtr disk, qemuBuildDriveStr(virDomainDiskDefPtr disk,
virQEMUDriverConfigPtr cfg, virQEMUDriverConfigPtr cfg,
@ -1630,8 +1650,6 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
virQEMUCapsPtr qemuCaps) virQEMUCapsPtr qemuCaps)
{ {
virBuffer opt = VIR_BUFFER_INITIALIZER; virBuffer opt = VIR_BUFFER_INITIALIZER;
const char *trans =
virDomainDiskGeometryTransTypeToString(disk->geometry.trans);
bool emitDeviceSyntax = qemuDiskBusNeedsDeviceArg(disk->bus); bool emitDeviceSyntax = qemuDiskBusNeedsDeviceArg(disk->bus);
/* if we are using -device this will be checked elsewhere */ /* if we are using -device this will be checked elsewhere */
@ -1685,19 +1703,7 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
if (disk->src->readonly) if (disk->src->readonly)
virBufferAddLit(&opt, ",readonly=on"); virBufferAddLit(&opt, ",readonly=on");
/* generate geometry command string */ qemuBuildDiskFrontendAttributes(disk, &opt);
if (disk->geometry.cylinders > 0 &&
disk->geometry.heads > 0 &&
disk->geometry.sectors > 0) {
virBufferAsprintf(&opt, ",cyls=%u,heads=%u,secs=%u",
disk->geometry.cylinders,
disk->geometry.heads,
disk->geometry.sectors);
if (disk->geometry.trans != VIR_DOMAIN_DISK_TRANS_DEFAULT)
virBufferAsprintf(&opt, ",trans=%s", trans);
}
if (disk->serial && if (disk->serial &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) { virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {