diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 9877ce24..38bdaabd 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -3084,7 +3084,7 @@ __PACKAGE__->register_method({ # sending a graceful shutdown command to paused VMs runs into timeouts, and even worse, when # the VM gets resumed later, it still gets the request delivered and powers off - if (PVE::QemuServer::vm_is_paused($vmid)) { + if (PVE::QemuServer::vm_is_paused($vmid, 1)) { if ($param->{forceStop}) { warn "VM is paused - stop instead of shutdown\n"; $shutdown = 0; @@ -3160,7 +3160,7 @@ __PACKAGE__->register_method({ my $node = extract_param($param, 'node'); my $vmid = extract_param($param, 'vmid'); - die "VM is paused - cannot shutdown\n" if PVE::QemuServer::vm_is_paused($vmid); + die "VM is paused - cannot shutdown\n" if PVE::QemuServer::vm_is_paused($vmid, 1); die "VM $vmid not running\n" if !PVE::QemuServer::check_running($vmid); diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index f41c61f7..111eeb07 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -224,7 +224,9 @@ sub prepare { } } - $self->{vm_was_paused} = 1 if PVE::QemuServer::vm_is_paused($vmid); + # Do not treat a suspended VM as paused, as it might wake up + # during migration and remain paused after migration finishes. + $self->{vm_was_paused} = 1 if PVE::QemuServer::vm_is_paused($vmid, 0); } my ($loc_res, $mapped_res, $missing_mappings_by_node) = PVE::QemuServer::check_local_resources($conf, 1); diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 28956755..2cd89485 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -8497,7 +8497,7 @@ sub complete_migration_storage { } sub vm_is_paused { - my ($vmid) = @_; + my ($vmid, $include_suspended) = @_; my $qmpstatus = eval { PVE::QemuConfig::assert_config_exists_on_node($vmid); mon_cmd($vmid, "query-status"); @@ -8505,8 +8505,8 @@ sub vm_is_paused { warn "$@\n" if $@; return $qmpstatus && ( $qmpstatus->{status} eq "paused" || - $qmpstatus->{status} eq "suspended" || - $qmpstatus->{status} eq "prelaunch" + $qmpstatus->{status} eq "prelaunch" || + ($include_suspended && $qmpstatus->{status} eq "suspended") ); } diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm index b38d7e74..f811cbf2 100644 --- a/PVE/VZDump/QemuServer.pm +++ b/PVE/VZDump/QemuServer.pm @@ -67,7 +67,9 @@ sub prepare { $self->{vm_was_paused} = 0; if (!PVE::QemuServer::check_running($vmid)) { $self->{vm_was_running} = 0; - } elsif (PVE::QemuServer::vm_is_paused($vmid)) { + } elsif (PVE::QemuServer::vm_is_paused($vmid, 0)) { + # Do not treat a suspended VM as paused, as it would cause us to skip + # fs-freeze even if the VM wakes up before we reach qga_fs_freeze. $self->{vm_was_paused} = 1; }