]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/AbstractConfig.pm
set 'snapshot-delete' lock when deleting snapshot
[pve-common.git] / src / PVE / AbstractConfig.pm
index 277434d04cf0d30acbc84793f462df51a46ba8b2..23512d0ae924a7e90f0385936ba1b3a3b6149bdb 100644 (file)
@@ -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