From fb4d1ba27e192b9611d1fc97ad464160b61832f2 Mon Sep 17 00:00:00 2001 From: Oguz Bektas Date: Tue, 22 Oct 2019 12:34:27 +0200 Subject: [PATCH] pending apply/hotplug: don't hard code force to true Each pending options has a hash value which has the 'force' information encoded as entry. But, this can be { force => 1 } or { force => 0 }, so we actually need to check the value and not just set force to the hash directly, as else we have force always truthy.. fixes a bug where 'detach' caused disks to be destroyed immediately, because $force parameter was always true since hash is true. Signed-off-by: Oguz Bektas Signed-off-by: Thomas Lamprecht --- PVE/QemuServer.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 3408898d..a054199c 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -4856,7 +4856,8 @@ sub vmconfig_hotplug_pending { my $hotplug_features = parse_hotplug_features(defined($conf->{hotplug}) ? $conf->{hotplug} : '1'); my $pending_delete_hash = PVE::QemuConfig->parse_pending_delete($conf->{pending}->{delete}); - while (my ($opt, $force) = each %$pending_delete_hash) { + foreach my $opt (keys %$pending_delete_hash) { + my $force = $pending_delete_hash->{$opt}->{force}; next if $selection && !$selection->{$opt}; eval { if ($opt eq 'hotplug') { @@ -5054,8 +5055,9 @@ sub vmconfig_apply_pending { # cold plug my $pending_delete_hash = PVE::QemuConfig->parse_pending_delete($conf->{pending}->{delete}); - while (my ($opt, $force) = each %$pending_delete_hash) { + foreach my $opt (keys %$pending_delete_hash) { die "internal error" if $opt =~ m/^unused/; + my $force = $pending_delete_hash->{$opt}->{force}; $conf = PVE::QemuConfig->load_config($vmid); # update/reload if (!defined($conf->{$opt})) { PVE::QemuConfig->remove_from_pending_delete($conf, $opt);