X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FAbstractConfig.pm;h=23512d0ae924a7e90f0385936ba1b3a3b6149bdb;hp=277434d04cf0d30acbc84793f462df51a46ba8b2;hb=0037d63436e875e2a980e2a35d197ae402ec581e;hpb=ba9db5df17358a54dc8f17133647aac5b0f8c47d diff --git a/src/PVE/AbstractConfig.pm b/src/PVE/AbstractConfig.pm index 277434d..23512d0 100644 --- a/src/PVE/AbstractConfig.pm +++ b/src/PVE/AbstractConfig.pm @@ -136,9 +136,10 @@ sub remove_lock { $class->lock_config($vmid, sub { my $conf = $class->load_config($vmid); if (!$conf->{lock}) { - die "no lock found trying to remove lock '$lock'\n"; + my $lockstring = defined($lock) ? "'$lock' " : "any"; + die "no lock found trying to remove $lockstring lock\n"; } elsif (defined($lock) && $conf->{lock} ne $lock) { - die "found lock '$conf->{lock}' trying to remove lock '$lock'\n"; + die "found lock '$conf->{lock}' trying to remove '$lock' lock\n"; } delete $conf->{lock}; $class->write_config($vmid, $conf); @@ -285,6 +286,13 @@ sub __snapshot_rollback_vm_start { die "abstract method - implement me\n"; } +# Get list of volume IDs which are referenced in $conf, but not in $snap. +sub __snapshot_rollback_get_unused { + my ($class, $conf, $snap) = @_; + + die "abstract method - implement me\n"; +} + # Iterate over all configured volumes, calling $func for each key/value pair. sub __snapshot_foreach_volume { my ($class, $conf, $func) = @_; @@ -460,6 +468,9 @@ sub snapshot_delete { my $snap; my $unused = []; + $class->set_lock($vmid, 'snapshot-delete') + if (!$drivehash); # doesn't already have a 'snapshot' lock + my $unlink_parent = sub { my ($confref, $new_parent) = @_; @@ -478,7 +489,6 @@ sub snapshot_delete { my $conf = $class->load_config($vmid); if (!$drivehash) { - $class->check_lock($conf); die "you can't delete a snapshot if vm is a template\n" if $class->is_template($conf); } @@ -504,7 +514,7 @@ sub snapshot_delete { $snap->{snapstate} = 'delete'; } else { delete $conf->{snapshots}->{$snapname}; - delete $conf->{lock} if $drivehash; + delete $conf->{lock}; foreach my $volid (@$unused) { $class->add_unused_volume($conf, $volid); } @@ -529,7 +539,7 @@ sub snapshot_delete { return if $snapname eq 'vzdump' && $vs ne 'rootfs' && !$volume->{backup}; if (!$drivehash || $drivehash->{$vs}) { - eval { $class->__snapshot_delete_vol_snapshot($vmid, $vs, $volume, $snapname); }; + eval { $class->__snapshot_delete_vol_snapshot($vmid, $vs, $volume, $snapname, $unused); }; if (my $err = $@) { die $err if !$force; warn $err; @@ -538,7 +548,6 @@ sub snapshot_delete { # save changes (remove mp from snapshot) $class->lock_config($vmid, $updatefn, $vs) if !$force; - push @$unused, $volume->{volume}; }); # now cleanup config @@ -603,6 +612,12 @@ sub snapshot_rollback { my $forcemachine; if (!$prepare) { + my $unused = $class->__snapshot_rollback_get_unused($conf, $snap); + + foreach my $volid (@$unused) { + $class->add_unused_volume($conf, $volid); + } + my $has_machine_config = defined($conf->{machine}); # copy snapshot config to current config