Enable bootindex can be set to -1, it means cancel the device's bootindex.
Change bootindex's type from unsigned int to int and modify other related
codes concered with type.
Signed-off-by: Jiang Jiacheng <jiangjiacheng(a)huawei.com>
---
src/conf/device_conf.h | 4 ++--
src/conf/domain_conf.c | 15 ++++++++++-----
src/conf/domain_postparse.c | 2 +-
src/qemu/qemu_command.c | 38 ++++++++++++++++++-------------------
src/qemu/qemu_process.c | 8 ++++----
src/qemu/qemu_validate.c | 6 +++---
6 files changed, 39 insertions(+), 34 deletions(-)
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index f2907dc596..a9df2e6e5d 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -139,11 +139,11 @@ struct _virDomainDeviceInfo {
char *romfile;
/* bootIndex is only used for disk, network interface, hostdev
* and redirdev devices */
- unsigned int bootIndex;
+ int bootIndex;
/* 'effectiveBootIndex' is same as 'bootIndex' (if provided in the
XML) but
* not formatted back. This allows HV drivers to update it if <os><boot ..
* is present. */
- unsigned int effectiveBootIndex;
+ int effectiveBootIndex;
/* Valid for any PCI device. Can be used for NIC to get
* stable numbering in Linux */
unsigned int acpiIndex;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c904d9c63d..fe7e5f9116 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -5093,7 +5093,7 @@ virDomainDeviceInfoFormat(virBuffer *buf,
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) {
- virBufferAsprintf(buf, "<boot order='%u'",
info->bootIndex);
+ virBufferAsprintf(buf, "<boot order='%d'",
info->bootIndex);
if (info->loadparm)
virBufferAsprintf(buf, " loadparm='%s'",
info->loadparm);
@@ -5254,10 +5254,15 @@ virDomainDeviceBootParseXML(xmlNodePtr node,
{
g_autofree char *loadparm = NULL;
- if (virXMLPropUInt(node, "order", 10,
- VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
- &info->bootIndex) < 0)
+ if (virXMLPropInt(node, "order", 10,
+ VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
+ &info->bootIndex, -1) < 0)
return -1;
+ if (info->bootIndex == 0 || info->bootIndex < -1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("incorrect boot order '%d', expecting positive
integer or -1"),
+ info->bootIndex);
+ }
info->effectiveBootIndex = info->bootIndex;
@@ -27652,7 +27657,7 @@ virDomainDeviceInfoCheckBootIndex(virDomainDef *def
G_GNUC_UNUSED,
if (info->bootIndex == data->newInfo->bootIndex) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("boot order %u is already used by another device"),
+ _("boot order %d is already used by another device"),
data->newInfo->bootIndex);
return -1;
}
diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c
index df59de2d0d..9810de7437 100644
--- a/src/conf/domain_postparse.c
+++ b/src/conf/domain_postparse.c
@@ -1041,7 +1041,7 @@ virDomainDefCollectBootOrder(virDomainDef *def G_GNUC_UNUSED,
*/
return 0;
}
- order = g_strdup_printf("%u", info->bootIndex);
+ order = g_strdup_printf("%d", info->bootIndex);
if (virHashLookup(bootHash, order)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a31b8ee438..e124800bcc 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1765,7 +1765,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
virTristateSwitch shareRW = VIR_TRISTATE_SWITCH_ABSENT;
g_autofree char *chardev = NULL;
g_autofree char *drive = NULL;
- unsigned int bootindex = 0;
+ int bootindex = 0;
unsigned int logical_block_size = 0;
unsigned int physical_block_size = 0;
g_autoptr(virJSONValue) wwn = NULL;
@@ -1951,7 +1951,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
"S:drive", drive,
"S:chardev", chardev,
"s:id", disk->info.alias,
- "p:bootindex", bootindex,
+ "z:bootindex", bootindex,
"p:logical_block_size", logical_block_size,
"p:physical_block_size", physical_block_size,
"A:wwn", &wwn,
@@ -2019,25 +2019,25 @@ qemuCommandAddExtDevice(virCommand *cmd,
static void
qemuBuildFloppyCommandLineControllerOptionsImplicit(virCommand *cmd,
- unsigned int bootindexA,
- unsigned int bootindexB)
+ int bootindexA,
+ int bootindexB)
{
if (bootindexA > 0) {
virCommandAddArg(cmd, "-global");
- virCommandAddArgFormat(cmd, "isa-fdc.bootindexA=%u", bootindexA);
+ virCommandAddArgFormat(cmd, "isa-fdc.bootindexA=%d", bootindexA);
}
if (bootindexB > 0) {
virCommandAddArg(cmd, "-global");
- virCommandAddArgFormat(cmd, "isa-fdc.bootindexB=%u", bootindexB);
+ virCommandAddArgFormat(cmd, "isa-fdc.bootindexB=%d", bootindexB);
}
}
static int
qemuBuildFloppyCommandLineControllerOptionsExplicit(virCommand *cmd,
- unsigned int bootindexA,
- unsigned int bootindexB,
+ int bootindexA,
+ int bootindexB,
const virDomainDef *def,
virQEMUCaps *qemuCaps)
{
@@ -2045,8 +2045,8 @@ qemuBuildFloppyCommandLineControllerOptionsExplicit(virCommand
*cmd,
if (virJSONValueObjectAdd(&props,
"s:driver", "isa-fdc",
- "p:bootindexA", bootindexA,
- "p:bootindexB", bootindexB,
+ "z:bootindexA", bootindexA,
+ "z:bootindexB", bootindexB,
NULL) < 0)
return -1;
@@ -2062,8 +2062,8 @@ qemuBuildFloppyCommandLineControllerOptions(virCommand *cmd,
const virDomainDef *def,
virQEMUCaps *qemuCaps)
{
- unsigned int bootindexA = 0;
- unsigned int bootindexB = 0;
+ int bootindexA = 0;
+ int bootindexB = 0;
bool hasfloppy = false;
size_t i;
@@ -2286,7 +2286,7 @@ qemuBuildVHostUserFsDevProps(virDomainFSDef *fs,
"s:chardev", chardev_alias,
"P:queue-size", fs->queue_size,
"s:tag", fs->dst,
- "p:bootindex", fs->info.bootIndex,
+ "z:bootindex", fs->info.bootIndex,
NULL) < 0)
return NULL;
@@ -3762,7 +3762,7 @@ qemuBuildNicDevProps(virDomainDef *def,
"s:netdev", netdev,
"s:id", net->info.alias,
"s:mac", macaddr,
- "p:bootindex", net->info.effectiveBootIndex,
+ "z:bootindex", net->info.effectiveBootIndex,
NULL) < 0)
return NULL;
@@ -4576,7 +4576,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
"s:driver", "vfio-pci",
"s:host", host,
"s:id", dev->info->alias,
- "p:bootindex",
dev->info->effectiveBootIndex,
+ "z:bootindex",
dev->info->effectiveBootIndex,
"S:failover_pair_id", failover_pair_id,
NULL) < 0)
return NULL;
@@ -4643,7 +4643,7 @@ qemuBuildUSBHostdevDevProps(const virDomainDef *def,
"p:hostbus", hostbus,
"p:hostaddr", hostaddr,
"s:id", dev->info->alias,
- "p:bootindex", dev->info->bootIndex,
+ "z:bootindex", dev->info->bootIndex,
"T:guest-reset", guestReset,
"T:guest-resets-all", guestResetsAll,
NULL) < 0)
@@ -4733,7 +4733,7 @@ qemuBuildSCSIHostdevDevProps(const virDomainDef *def,
"s:driver", "scsi-generic",
"s:drive", backendAlias,
"s:id", dev->info->alias,
- "p:bootindex", dev->info->bootIndex,
+ "z:bootindex", dev->info->bootIndex,
NULL) < 0)
return NULL;
@@ -4831,7 +4831,7 @@ qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
"s:sysfsdev", mdevPath,
"S:display", qemuOnOffAuto(mdevsrc->display),
"B:ramfb", ramfb,
- "p:bootindex", dev->info->bootIndex,
+ "z:bootindex", dev->info->bootIndex,
NULL) < 0)
return NULL;
@@ -9022,7 +9022,7 @@ qemuBuildRedirdevDevProps(const virDomainDef *def,
"s:chardev", chardev,
"s:id", dev->info.alias,
"S:filter", filter,
- "p:bootindex", dev->info.bootIndex,
+ "z:bootindex", dev->info.bootIndex,
NULL) < 0)
return NULL;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 32f03ff79a..327307de9c 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6264,10 +6264,10 @@ static void
qemuProcessPrepareDeviceBootorder(virDomainDef *def)
{
size_t i;
- unsigned int bootCD = 0;
- unsigned int bootFloppy = 0;
- unsigned int bootDisk = 0;
- unsigned int bootNetwork = 0;
+ int bootCD = 0;
+ int bootFloppy = 0;
+ int bootDisk = 0;
+ int bootNetwork = 0;
if (def->os.nBootDevs == 0)
return;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 6403266559..c3ecd03dfb 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -2520,7 +2520,7 @@ qemuValidateDomainMdevDefVFIOPCI(const virDomainHostdevDef
*hostdev,
}
/* VFIO-PCI does not support boot */
- if (hostdev->info->bootIndex) {
+ if (hostdev->info->bootIndex > 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("booting from assigned devices is not "
"supported by mediated devices of "
@@ -2576,7 +2576,7 @@ qemuValidateDomainMdevDefVFIOAP(const virDomainHostdevDef *hostdev,
}
/* VFIO-AP does not support boot */
- if (hostdev->info->bootIndex) {
+ if (hostdev->info->bootIndex > 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("booting from assigned devices is not "
"supported by mediated devices of "
@@ -2687,7 +2687,7 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef
*hostdev,
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
- if (hostdev->info->bootIndex) {
+ if (hostdev->info->bootIndex > 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("booting from assigned devices is not "
"supported by vhost SCSI devices"));
--
2.33.0