[libvirt] [PATCH 5/6] qemu: command: Don't format -device isa-fdc, ... twice with two floppy drives
Ján Tomko
jtomko at redhat.com
Thu Aug 9 14:11:55 UTC 2018
On Thu, Aug 09, 2018 at 02:48:58PM +0200, Peter Krempa wrote:
>Fix regression introduced in 42fd5a58adb. With q35 machine type which
Please wrap the commit id in <> or rephrase the sentence to have the
commit id separated by spaces.
>requires the explicitly specified FDC we'd format two isa-fdc
two spaces
>controllers to the command line as the code was moved to a place where
>it's called per-disk.
>
>Move the call back after formatting all disks and reiterate the disks to
>find the floppy controllers.
>
>This also moves the '-global' directive which sets up the default
>ISA-FDC to the end after all the disks but since we are modifying the
>properties it is safe to do so.
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/qemu/qemu_command.c | 100 +++++++++++++--------
> tests/qemuxml2argvdata/boot-complex-bootindex.args | 2 +-
> tests/qemuxml2argvdata/boot-complex.args | 2 +-
> tests/qemuxml2argvdata/boot-strict.args | 2 +-
> .../disk-floppy-q35-2_11.x86_64-latest.args | 2 +-
> .../disk-floppy-q35-2_9.x86_64-latest.args | 3 +-
> tests/qemuxml2argvdata/disk-floppy-tray.args | 2 +-
> tests/qemuxml2argvdata/disk-floppy.args | 2 +-
> .../disk-floppy.x86_64-latest.args | 2 +-
> tests/qemuxml2argvdata/user-aliases.args | 2 +-
> 10 files changed, 71 insertions(+), 48 deletions(-)
>
>diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>index daf037328f..1169164a39 100644
>--- a/src/qemu/qemu_command.c
>+++ b/src/qemu/qemu_command.c
>@@ -2143,50 +2143,78 @@ qemuBuildDiskDeviceStr(const virDomainDef *def,
>
>
> static int
>-qemuBuildFloppyCommandLineOptions(virCommandPtr cmd,
>- const virDomainDef *def,
>- virDomainDiskDefPtr disk,
>- virQEMUCapsPtr qemuCaps,
>- unsigned int bootindex)
>+qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd,
>+ const virDomainDef *def,
>+ virQEMUCapsPtr qemuCaps,
>+ unsigned int bootFloppy)
> {
> virBuffer fdc_opts = VIR_BUFFER_INITIALIZER;
>+ bool explicitfdc = qemuDomainNeedsFDC(def);
>+ bool hasfloppy = false;
>+ unsigned int bootindex;
> char driveLetter;
> char *backendAlias = NULL;
> char *backendStr = NULL;
> char *bootindexStr = NULL;
>+ size_t i;
> int ret = -1;
>
>- if (disk->info.addr.drive.unit)
>- driveLetter = 'B';
>- else
>- driveLetter = 'A';
>+ virBufferAddLit(&fdc_opts, "isa-fdc,");
>
>- if (qemuDomainDiskGetBackendAlias(disk, qemuCaps, &backendAlias) < 0)
>- goto cleanup;
>+ for (i = 0; i < def->ndisks; i++) {
>+ virDomainDiskDefPtr disk = def->disks[i];
>
>- if (backendAlias &&
>- virAsprintf(&backendStr, "drive%c=%s", driveLetter, backendAlias) < 0)
>- goto cleanup;
>+ if (disk->bus != VIR_DOMAIN_DISK_BUS_FDC)
>+ continue;
>
>- if (bootindex &&
>- virAsprintf(&bootindexStr, "bootindex%c=%u", driveLetter, bootindex) < 0)
>- goto cleanup;
>+ hasfloppy = true;
>
>- if (!qemuDomainNeedsFDC(def)) {
>- if (backendStr) {
>- virCommandAddArg(cmd, "-global");
>- virCommandAddArgFormat(cmd, "isa-fdc.%s", backendStr);
>- }
>+ if (disk->info.bootIndex)
>+ bootindex = disk->info.bootIndex;
>+ else
>+ bootindex = bootFloppy;
>
>- if (bootindexStr) {
>- virCommandAddArg(cmd, "-global");
>- virCommandAddArgFormat(cmd, "isa-fdc.%s", bootindexStr);
>+ bootFloppy = 0;
before, we only zeroed bootFloppy if we have used it, not if we used
disk->info.bootIndex
>+
>+ if (disk->info.addr.drive.unit)
>+ driveLetter = 'B';
>+ else
>+ driveLetter = 'A';
>+
>+ if (qemuDomainDiskGetBackendAlias(disk, qemuCaps, &backendAlias) < 0)
>+ goto cleanup;
>+
>+ if (backendAlias &&
>+ virAsprintf(&backendStr, "drive%c=%s", driveLetter, backendAlias) < 0)
>+ goto cleanup;
>+
>+ if (bootindex &&
>+ virAsprintf(&bootindexStr, "bootindex%c=%u", driveLetter, bootindex) < 0)
>+ goto cleanup;
>+
>+ if (!explicitfdc) {
>+ if (backendStr) {
>+ virCommandAddArg(cmd, "-global");
>+ virCommandAddArgFormat(cmd, "isa-fdc.%s", backendStr);
>+ }
>+
>+ if (bootindexStr) {
>+ virCommandAddArg(cmd, "-global");
>+ virCommandAddArgFormat(cmd, "isa-fdc.%s", bootindexStr);
>+ }
>+ } else {
>+ virBufferStrcat(&fdc_opts, backendStr, ",", NULL);
>+ virBufferStrcat(&fdc_opts, bootindexStr, ",", NULL);
> }
>- } else {
>+
>+ VIR_FREE(backendAlias);
>+ VIR_FREE(backendStr);
>+ VIR_FREE(bootindexStr);
>+ }
>+
>+
Two empty lines.
>+ if (explicitfdc && hasfloppy) {
> /* Newer Q35 machine types require an explicit FDC controller */
>- virBufferAddLit(&fdc_opts, "isa-fdc,");
>- virBufferStrcat(&fdc_opts, backendStr, ",", NULL);
>- virBufferStrcat(&fdc_opts, bootindexStr, NULL);
> virBufferTrim(&fdc_opts, ",", -1);
> virCommandAddArg(cmd, "-device");
> virCommandAddArgBuffer(cmd, &fdc_opts);
>@@ -2276,11 +2304,7 @@ qemuBuildDiskCommandLine(virCommandPtr cmd,
> return -1;
>
> if (!qemuDiskBusNeedsDriveArg(disk->bus)) {
>- if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) {
>- if (qemuBuildFloppyCommandLineOptions(cmd, def, disk, qemuCaps,
>- bootindex) < 0)
>- return -1;
>- } else {
>+ if (disk->bus != VIR_DOMAIN_DISK_BUS_FDC) {
> virCommandAddArg(cmd, "-device");
>
> if (!(optstr = qemuBuildDiskDeviceStr(def, disk, bootindex,
>@@ -2331,10 +2355,6 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
> bootindex = bootCD;
> bootCD = 0;
> break;
>- case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
>- bootindex = bootFloppy;
>- bootFloppy = 0;
>- break;
> case VIR_DOMAIN_DISK_DEVICE_DISK:
> case VIR_DOMAIN_DISK_DEVICE_LUN:
> bootindex = bootDisk;
>@@ -2348,6 +2368,10 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
> return -1;
> }
>
>+ if (qemuBuildFloppyCommandLineControllerOptions(cmd, def, qemuCaps, bootFloppy) < 0)
>+ return -1;
>+
>+
Two empty lines.
> return 0;
> }
>
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180809/1ca343bd/attachment-0001.sig>
More information about the libvir-list
mailing list