mirror of
https://git.proxmox.com/git/pve-guest-common
synced 2025-08-02 19:13:04 +00:00
snapshot_delete: check for concurrent modifications at each step
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> Tested-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
parent
c261973c52
commit
990d9675c5
@ -823,6 +823,15 @@ sub snapshot_delete {
|
||||
$class->set_lock($vmid, 'snapshot-delete')
|
||||
if (!$drivehash); # doesn't already have a 'snapshot' lock
|
||||
|
||||
my $expected_lock = $drivehash ? 'snapshot' : 'snapshot-delete';
|
||||
|
||||
my $ensure_correct_lock = sub {
|
||||
my ($conf) = @_;
|
||||
|
||||
die "encountered invalid lock, expected '$expected_lock'\n"
|
||||
if !$class->has_lock($conf, $expected_lock);
|
||||
};
|
||||
|
||||
my $unlink_parent = sub {
|
||||
my ($confref, $new_parent) = @_;
|
||||
|
||||
@ -839,6 +848,8 @@ sub snapshot_delete {
|
||||
my ($drive) = @_;
|
||||
|
||||
my $conf = $class->load_config($vmid);
|
||||
$ensure_correct_lock->($conf);
|
||||
|
||||
$snap = $conf->{snapshots}->{$snapname};
|
||||
die "snapshot '$snapname' does not exist\n" if !defined($snap);
|
||||
|
||||
@ -850,6 +861,7 @@ sub snapshot_delete {
|
||||
#prepare
|
||||
$class->lock_config($vmid, sub {
|
||||
my $conf = $class->load_config($vmid);
|
||||
$ensure_correct_lock->($conf);
|
||||
|
||||
die "you can't delete a snapshot if vm is a template\n"
|
||||
if $class->is_template($conf);
|
||||
@ -890,6 +902,8 @@ sub snapshot_delete {
|
||||
# now cleanup config
|
||||
$class->lock_config($vmid, sub {
|
||||
my $conf = $class->load_config($vmid);
|
||||
$ensure_correct_lock->($conf);
|
||||
|
||||
$snap = $conf->{snapshots}->{$snapname};
|
||||
die "snapshot '$snapname' does not exist\n" if !defined($snap);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user