提交 94e45309 编写于 作者: P Peter Krempa

qemu: command: Setup floppy drives via -device for blockdev

To allow referring to the drives via the QOM id we need to setup the
floppy drives with a proper ID. This means that -device should be used
for them.

There are the following quirks:
- FDC needs to be instantiated prior to any floppy device
- floppy drive specified via -device does not support 'bootindex'
    (hacked around by passing bootindexA=1 to the FDC)
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 fb64e176
...@@ -2060,6 +2060,10 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, ...@@ -2060,6 +2060,10 @@ qemuBuildDiskDeviceStr(const virDomainDef *def,
goto error; goto error;
break; break;
case VIR_DOMAIN_DISK_BUS_FDC:
virBufferAsprintf(&opt, "floppy,unit=%d", disk->info.addr.drive.unit);
break;
default: default:
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("unsupported disk bus '%s' with device setup"), bus); _("unsupported disk bus '%s' with device setup"), bus);
...@@ -2181,17 +2185,20 @@ qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd, ...@@ -2181,17 +2185,20 @@ qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd,
else else
driveLetter = 'A'; driveLetter = 'A';
if (qemuDomainDiskGetBackendAlias(disk, qemuCaps, &backendAlias) < 0)
goto cleanup;
if (backendAlias &&
virAsprintf(&backendStr, "drive%c=%s", driveLetter, backendAlias) < 0)
goto cleanup;
if (bootindex && if (bootindex &&
virAsprintf(&bootindexStr, "bootindex%c=%u", driveLetter, bootindex) < 0) virAsprintf(&bootindexStr, "bootindex%c=%u", driveLetter, bootindex) < 0)
goto cleanup; goto cleanup;
/* with -blockdev we setup the floppy device and it's backend with -device */
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
if (qemuDomainDiskGetBackendAlias(disk, qemuCaps, &backendAlias) < 0)
goto cleanup;
if (backendAlias &&
virAsprintf(&backendStr, "drive%c=%s", driveLetter, backendAlias) < 0)
goto cleanup;
}
if (!explicitfdc) { if (!explicitfdc) {
if (backendStr) { if (backendStr) {
virCommandAddArg(cmd, "-global"); virCommandAddArg(cmd, "-global");
...@@ -2304,7 +2311,8 @@ qemuBuildDiskCommandLine(virCommandPtr cmd, ...@@ -2304,7 +2311,8 @@ qemuBuildDiskCommandLine(virCommandPtr cmd,
return -1; return -1;
if (!qemuDiskBusNeedsDriveArg(disk->bus)) { if (!qemuDiskBusNeedsDriveArg(disk->bus)) {
if (disk->bus != VIR_DOMAIN_DISK_BUS_FDC) { if (disk->bus != VIR_DOMAIN_DISK_BUS_FDC ||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
virCommandAddArg(cmd, "-device"); virCommandAddArg(cmd, "-device");
if (!(optstr = qemuBuildDiskDeviceStr(def, disk, bootindex, if (!(optstr = qemuBuildDiskDeviceStr(def, disk, bootindex,
...@@ -2328,6 +2336,7 @@ qemuBuildDisksCommandLine(virCommandPtr cmd, ...@@ -2328,6 +2336,7 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
unsigned int bootCD = 0; unsigned int bootCD = 0;
unsigned int bootFloppy = 0; unsigned int bootFloppy = 0;
unsigned int bootDisk = 0; unsigned int bootDisk = 0;
bool blockdev = virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV);
for (i = 0; i < def->os.nBootDevs; i++) { for (i = 0; i < def->os.nBootDevs; i++) {
switch (def->os.bootDevs[i]) { switch (def->os.bootDevs[i]) {
...@@ -2343,6 +2352,12 @@ qemuBuildDisksCommandLine(virCommandPtr cmd, ...@@ -2343,6 +2352,12 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
} }
} }
/* If we want to express the floppy drives via -device, the controller needs
* to be instantiated prior to that */
if (blockdev &&
qemuBuildFloppyCommandLineControllerOptions(cmd, def, qemuCaps, bootFloppy) < 0)
return -1;
for (i = 0; i < def->ndisks; i++) { for (i = 0; i < def->ndisks; i++) {
virDomainDiskDefPtr disk = def->disks[i]; virDomainDiskDefPtr disk = def->disks[i];
unsigned int bootindex = 0; unsigned int bootindex = 0;
...@@ -2363,12 +2378,17 @@ qemuBuildDisksCommandLine(virCommandPtr cmd, ...@@ -2363,12 +2378,17 @@ qemuBuildDisksCommandLine(virCommandPtr cmd,
} }
} }
if (qemuBuildDiskCommandLine(cmd, def, disk, qemuCaps, /* The floppy device itself does not support the bootindex property
bootindex) < 0) * so we need to set it up for the controller */
if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
bootindex = 0;
if (qemuBuildDiskCommandLine(cmd, def, disk, qemuCaps, bootindex) < 0)
return -1; return -1;
} }
if (qemuBuildFloppyCommandLineControllerOptions(cmd, def, qemuCaps, bootFloppy) < 0) if (!blockdev &&
qemuBuildFloppyCommandLineControllerOptions(cmd, def, qemuCaps, bootFloppy) < 0)
return -1; return -1;
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册