Introduce qemuDomainChangeBootIndex api to support update device's bootindex.
These function will be used in following patches to support change device's
(support cdrom, disk and net) bootindex with virsh command like
'virsh update-device <domain> <file> [--flag]'.
Signed-off-by: Jiang Jiacheng <jiangjiacheng(a)huawei.com>
---
src/qemu/qemu_conf.c | 24 ++++++++++++++++++++++++
src/qemu/qemu_conf.h | 5 +++++
src/qemu/qemu_monitor.c | 12 ++++++++++++
src/qemu/qemu_monitor.h | 6 ++++++
src/qemu/qemu_monitor_json.c | 22 ++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 6 ++++++
6 files changed, 75 insertions(+)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 3b75cdeb95..b653f44f25 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1571,3 +1571,27 @@ qemuGetMemoryBackingPath(virQEMUDriver *driver,
*memPath = g_strdup_printf("%s/%s", domainPath, alias);
return 0;
}
+
+int
+qemuDomainChangeBootIndex(virDomainObj *vm,
+ virDomainDeviceInfo *devInfo,
+ int newBootIndex)
+{
+ int ret = -1;
+ qemuDomainObjPrivate *priv = vm->privateData;
+
+ if (!devInfo->alias) {
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+ _("cannot change boot index: device alias not found"));
+ return -1;
+ }
+
+ VIR_DEBUG("Change dev: %s boot index from %d to %d", devInfo->alias,
+ devInfo->bootIndex, newBootIndex);
+
+ qemuDomainObjEnterMonitor(vm);
+ ret = qemuMonitorSetBootIndex(priv->mon, devInfo->alias, newBootIndex);
+ qemuDomainObjExitMonitor(vm);
+
+ return ret;
+}
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index c40c452f58..4e2cd84fe5 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -359,3 +359,8 @@ int qemuGetMemoryBackingPath(virQEMUDriver *driver,
const virDomainDef *def,
const char *alias,
char **memPath);
+
+int qemuDomainChangeBootIndex(virDomainObj *vm,
+ virDomainDeviceInfo *devInfo,
+ int newBootIndex)
+ ATTRIBUTE_NONNULL(2);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c2808c75a3..1b120d766d 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -4417,3 +4417,15 @@ qemuMonitorExtractQueryStats(virJSONValue *info)
return g_steal_pointer(&hash_table);
}
+
+int
+qemuMonitorSetBootIndex(qemuMonitor *mon,
+ const char *name,
+ int bootIndex)
+{
+ VIR_DEBUG("name=%s, bootIndex=%d", name, bootIndex);
+
+ QEMU_CHECK_MONITOR(mon);
+
+ return qemuMonitorJSONSetBootIndex(mon, name, bootIndex);
+}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 63269e15bc..f27431a3f2 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1529,3 +1529,9 @@ qemuMonitorQueryStats(qemuMonitor *mon,
GHashTable *
qemuMonitorExtractQueryStats(virJSONValue *info);
+
+int
+qemuMonitorSetBootIndex(qemuMonitor *mon,
+ const char *name,
+ int bootIndex)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 70fba50e6c..5cc1f2665a 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -8665,3 +8665,25 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
return virJSONValueObjectStealArray(reply, "return");
}
+
+int
+qemuMonitorJSONSetBootIndex(qemuMonitor *mon,
+ const char *name,
+ int bootIndex)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) reply = NULL;
+
+ if (!(cmd = qemuMonitorJSONMakeCommand("qom-set", "s:path",
name,
+ "s:property",
"bootindex",
+ "i:value", bootIndex, NULL)))
+ return -1;
+
+ if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+ return -1;
+
+ if (qemuMonitorJSONCheckError(cmd, reply) < 0)
+ return -1;
+
+ return 0;
+}
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index a53e6423df..8283c9b29a 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -818,3 +818,9 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
qemuMonitorQueryStatsTargetType target,
char **vcpus,
GPtrArray *providers);
+
+int
+qemuMonitorJSONSetBootIndex(qemuMonitor *mon,
+ const char *name,
+ int bootIndex)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
--
2.33.0