]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Add monitor infrastructure for 'snapshot-load' QMP command
authorPeter Krempa <pkrempa@redhat.com>
Wed, 6 Nov 2024 14:59:34 +0000 (15:59 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 18 Nov 2024 12:51:13 +0000 (13:51 +0100)
Libvirt currently loads snapshots via the '-loadvm' commandline option
but that uses the same logic as the 'loadvm' text monitor command used
to pick the disk image with the 'vmstate' section. Since libvirt now
implements our own logic to pick the 'vmstate' device it can happen that
we pick a different than qemu and thus qemu would fail to load the
snapshot. This happens currently on VMs with UEFI firmware with NVRAM
image in qcow2 format.

To fix this libvirt will need to use the 'snapshot-load' QMP command
instead of relying on '-savevm'.

Implement the monitor bits for 'snapshot-load'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index fd888e2468fc0e6b3f0ae657c3d3f887195d3b2e..73f37d26eb19b099ef5c2639a7d0678cd25d4c01 100644 (file)
@@ -2780,6 +2780,22 @@ qemuMonitorSnapshotSave(qemuMonitor *mon,
 }
 
 
+int
+qemuMonitorSnapshotLoad(qemuMonitor *mon,
+                        const char *jobname,
+                        const char *snapshotname,
+                        const char *vmstate_disk,
+                        const char **disks)
+{
+    VIR_DEBUG("jobname='%s', snapshotname='%s', vmstate_disk='%s'",
+              jobname, snapshotname, vmstate_disk);
+
+    QEMU_CHECK_MONITOR(mon);
+
+    return qemuMonitorJSONSnapshotLoad(mon, jobname, snapshotname, vmstate_disk, disks);
+}
+
+
 int
 qemuMonitorSnapshotDelete(qemuMonitor *mon,
                           const char *jobname,
index 035c9a7e3cae1ea8a85e7686b89430014cc0710d..aded7713155786f60ff895d810f7e5c42d2fc53b 100644 (file)
@@ -1626,6 +1626,13 @@ qemuMonitorSnapshotSave(qemuMonitor *mon,
                         const char *vmstate_disk,
                         const char **disks);
 
+int
+qemuMonitorSnapshotLoad(qemuMonitor *mon,
+                        const char *jobname,
+                        const char *snapshotname,
+                        const char *vmstate_disk,
+                        const char **disks);
+
 int
 qemuMonitorSnapshotDelete(qemuMonitor *mon,
                           const char *jobname,
index c594b331067ac5964138aecdf6182c22f96eff53..b3924461a903152dd7a628e6b50911a87a5c698c 100644 (file)
@@ -8754,6 +8754,37 @@ qemuMonitorJSONSnapshotSave(qemuMonitor *mon,
 }
 
 
+int
+qemuMonitorJSONSnapshotLoad(qemuMonitor *mon,
+                            const char *jobname,
+                            const char *snapshotname,
+                            const char *vmstate_disk,
+                            const char **disks)
+{
+    g_autoptr(virJSONValue) cmd = NULL;
+    g_autoptr(virJSONValue) reply = NULL;
+    g_autoptr(virJSONValue) devices = virJSONValueNewArray();
+
+    for (; *disks; disks++) {
+        if (virJSONValueArrayAppendString(devices, *disks) < 0)
+            return -1;
+    }
+
+    if (!(cmd = qemuMonitorJSONMakeCommand("snapshot-load",
+                                           "s:job-id", jobname,
+                                           "s:tag", snapshotname,
+                                           "s:vmstate", vmstate_disk,
+                                           "a:devices", &devices,
+                                           NULL)))
+        return -1;
+
+    if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+        return -1;
+
+    return qemuMonitorJSONCheckError(cmd, reply);
+}
+
+
 int
 qemuMonitorJSONSnapshotDelete(qemuMonitor *mon,
                               const char *jobname,
index ab3c2cb7c8e2ed48ee769e5aa4e3807f313d66a0..0214e9e9ff59141bb52baf6459c4066051e9544a 100644 (file)
@@ -804,6 +804,13 @@ qemuMonitorJSONSnapshotSave(qemuMonitor *mon,
                             const char *vmstate_disk,
                             const char **disks);
 
+int
+qemuMonitorJSONSnapshotLoad(qemuMonitor *mon,
+                            const char *jobname,
+                            const char *snapshotname,
+                            const char *vmstate_disk,
+                            const char **disks);
+
 int
 qemuMonitorJSONSnapshotDelete(qemuMonitor *mon,
                               const char *jobname,