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);
});
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
my ($class, $vmid, $config, $save_vmstate) = @_;
my $running = $class->__snapshot_check_running($vmid);
- if ($save_vmstate) {
+ if (!$save_vmstate) {
return ($running, $running && $config->{agent} && PVE::QemuServer::qga_check_running($vmid));
} else {
return ($running, 0);