[pve-devel] [PATCH qemu-server 1/4] add forcemachine rollback code

Dominik Csapak d.csapak at proxmox.com
Thu Sep 13 12:15:04 CEST 2018


this was in guest-common, makes more sense to do it here

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/QemuConfig.pm | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index b24773c..5cc2d48 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -281,6 +281,25 @@ sub __snapshot_delete_vol_snapshot {
     push @$unused, $volid;
 }
 
+sub __snapshot_rollback_hook {
+    my ($class, $vmid, $conf, $snap, $prepare, $data) = @_;
+
+    if ($prepare) {
+	# we save the machine of the current config
+	$data->{oldmachine} = $conf->{machine};
+    } else {
+	# Note: old code did not store 'machine', so we try to be smart
+	# and guess the snapshot was generated with kvm 1.4 (pc-i440fx-1.4).
+	$data->{forcemachine} = $conf->{machine} || 'pc-i440fx-1.4';
+
+	# we remove the 'machine' configuration if not explicitly specified
+	# in the original config.
+	delete $conf->{machine} if $snap->{vmstate} && !defined($data->{oldmachine});
+    }
+
+    return;
+}
+
 sub __snapshot_rollback_vol_possible {
     my ($class, $drive, $snapname) = @_;
 
@@ -309,10 +328,20 @@ sub __snapshot_rollback_vm_stop {
 }
 
 sub __snapshot_rollback_vm_start {
-    my ($class, $vmid, $vmstate, $forcemachine) = @_;
+    my ($class, $vmid, $vmstate, $data) = @_;
 
     my $storecfg = PVE::Storage::config();
     my $statefile = PVE::Storage::path($storecfg, $vmstate);
+
+    # workaround for cyclic dependcy
+    # works with old and new pve-guest-common
+    # (without and with rollback hook respectively)
+    my $forcemachine;
+    if (ref($data) eq 'HASH') {
+	$forcemachine = $data->{forcemachine};
+    } elsif (!ref($data)) {
+	$forcemachine = $data;
+    }
     PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, undef, undef, undef, $forcemachine);
 }
 
-- 
2.11.0





More information about the pve-devel mailing list