]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuConfig.pm
Make agent a property string, add fstrim_cloned_disks
[qemu-server.git] / PVE / QemuConfig.pm
index d2828876387444f9a57dce2560f31a8b9f98ab51..b24773cc9e9052f312f1894fff1ba6992fb3a93e 100644 (file)
@@ -55,7 +55,7 @@ sub has_feature {
        my ($ds, $drive) = @_;
 
        return if PVE::QemuServer::drive_is_cdrom($drive);
-       return if $backup_only && !$drive->{backup};
+       return if $backup_only && defined($drive->{backup}) && !$drive->{backup};
        my $volid = $drive->{file};
        $err = 1 if !PVE::Storage::volume_has_feature($storecfg, $feature, $volid, $snapname, $running);
    });
@@ -71,13 +71,16 @@ sub get_replicatable_volumes {
     my $test_volid = sub {
        my ($volid, $attr) = @_;
 
+       return if $attr->{cdrom};
+
+       return if !$cleanup && !$attr->{replicate};
+
        if ($volid =~ m|^/|) {
            return if !$attr->{replicate};
+           return if $cleanup || $noerr;
            die "unable to replicate local file/device '$volid'\n";
        }
 
-       return if $attr->{cdrom};
-
        my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid, $noerr);
        return if !$storeid;
 
@@ -87,9 +90,10 @@ sub get_replicatable_volumes {
        my ($path, $owner, $vtype) = PVE::Storage::path($storecfg, $volid);
        return if !$owner || ($owner != $vmid);
 
-       die "unable to replicate volume '$volid', type '$vtype'\n" if $vtype ne 'images';
-
-       return if !$cleanup && !$attr->{replicate};
+       if ($vtype ne 'images') {
+           return if $cleanup || $noerr;
+           die "unable to replicate volume '$volid', type '$vtype'\n";
+       }
 
        if (!PVE::Storage::volume_has_feature($storecfg, 'replicate', $volid)) {
            return if $cleanup || $noerr;
@@ -116,29 +120,23 @@ sub __snapshot_save_vmstate {
 
     my $snap = $conf->{snapshots}->{$snapname};
 
-    my $target;
-
-    # search shared storage first
-    PVE::QemuServer::foreach_writable_storage($conf, sub {
-       my ($sid) = @_;
-       my $scfg = PVE::Storage::storage_config($storecfg, $sid);
-       return if !$scfg->{shared};
-
-       $target = $sid if !$target || $scfg->{path}; # prefer file based storage
-    });
+    # first, use explicitly configured storage
+    my $target = $conf->{vmstatestorage};
 
     if (!$target) {
-       # now search local storage
-       PVE::QemuServer::foreach_writable_storage($conf, sub {
+       my ($shared, $local);
+       PVE::QemuServer::foreach_storage_used_by_vm($conf, sub {
            my ($sid) = @_;
            my $scfg = PVE::Storage::storage_config($storecfg, $sid);
-           return if $scfg->{shared};
-
-           $target = $sid if !$target || $scfg->{path}; # prefer file based storage;
+           my $dst = $scfg->{shared} ? \$shared : \$local;
+           $$dst = $sid if !$$dst || $scfg->{path}; # prefer file based storage
        });
-    }
 
-    $target = 'local' if !$target;
+       # second, use shared storage where VM has at least one disk
+       # third, use local storage where VM has at least one disk
+       # fall back to local storage
+       $target = $shared // $local // 'local';
+    }
 
     my $driver_state_size = 500; # assume 32MB is enough to safe all driver state;
     # we abort live save after $conf->{memory}, so we need at max twice that space
@@ -162,8 +160,8 @@ sub __snapshot_check_freeze_needed {
     my ($class, $vmid, $config, $save_vmstate) = @_;
 
     my $running = $class->__snapshot_check_running($vmid);
-    if ($save_vmstate) {
-       return ($running, $running && $config->{agent} && PVE::QemuServer::qga_check_running($vmid));
+    if (!$save_vmstate) {
+       return ($running, $running && PVE::QemuServer::parse_guest_agent($config)->{enabled} && PVE::QemuServer::qga_check_running($vmid));
     } else {
        return ($running, 0);
     }