]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuConfig.pm
fix #1013 : migrate : sync_disk : --targetstorage with offline disk
[qemu-server.git] / PVE / QemuConfig.pm
index c1037379b9789aba12f229572c151228d669d500..6ba0cc3d1773fb047ddcdd2a22001f020ab7d0ad 100644 (file)
@@ -20,7 +20,7 @@ mkdir $confdir;
 my $lock_dir = "/var/lock/qemu-server";
 mkdir $lock_dir;
 
-my $MAX_UNUSED_DISKS = 8;
+my $MAX_UNUSED_DISKS = 256;
 
 # BEGIN implemented abstract methods from PVE::AbstractConfig
 
@@ -125,7 +125,7 @@ sub __snapshot_save_vmstate {
 
     if (!$target) {
        my ($shared, $local);
-       PVE::QemuServer::foreach_writable_storage($conf, sub {
+       PVE::QemuServer::foreach_storage_used_by_vm($conf, sub {
            my ($sid) = @_;
            my $scfg = PVE::Storage::storage_config($storecfg, $sid);
            my $dst = $scfg->{shared} ? \$shared : \$local;
@@ -146,9 +146,7 @@ sub __snapshot_save_vmstate {
     my $scfg = PVE::Storage::storage_config($storecfg, $target);
     $name .= ".raw" if $scfg->{path}; # add filename extension for file base storage
     $snap->{vmstate} = PVE::Storage::vdisk_alloc($storecfg, $target, $vmid, 'raw', $name, $size*1024);
-    # always overwrite machine if we save vmstate. This makes sure we
-    # can restore it later using correct machine type
-    $snap->{machine} = PVE::QemuServer::get_current_qemu_machine($vmid);
+    $snap->{runningmachine} = PVE::QemuServer::get_current_qemu_machine($vmid);
 }
 
 sub __snapshot_check_running {
@@ -161,7 +159,7 @@ sub __snapshot_check_freeze_needed {
 
     my $running = $class->__snapshot_check_running($vmid);
     if (!$save_vmstate) {
-       return ($running, $running && $config->{agent} && PVE::QemuServer::qga_check_running($vmid));
+       return ($running, $running && PVE::QemuServer::parse_guest_agent($config)->{enabled} && PVE::QemuServer::qga_check_running($vmid));
     } else {
        return ($running, 0);
     }
@@ -281,6 +279,39 @@ 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 {
+       # if we have a 'runningmachine' entry in the snapshot we use that
+       # for the forcemachine parameter, else we use the old logic
+       if (defined($conf->{runningmachine})) {
+           $data->{forcemachine} = $conf->{runningmachine};
+           delete $conf->{runningmachine};
+       } 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});
+       }
+
+       if ($conf->{vmgenid}) {
+           # tell the VM that it's another generation, so it can react
+           # appropriately, e.g. dirty-mark copies of distributed databases or
+           # re-initializing its random number generator
+           $conf->{vmgenid} = PVE::QemuServer::generate_uuid();
+       }
+    }
+
+    return;
+}
+
 sub __snapshot_rollback_vol_possible {
     my ($class, $drive, $snapname) = @_;
 
@@ -309,11 +340,11 @@ 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);
-    PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, undef, undef, undef, $forcemachine);
+    PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, undef, undef, undef, $data->{forcemachine});
 }
 
 sub __snapshot_rollback_get_unused {