]> git.proxmox.com Git - pve-container.git/blobdiff - src/PVE/VZDump/LXC.pm
VZDump lock update, drop lock_aquire/lock_release
[pve-container.git] / src / PVE / VZDump / LXC.pm
index dddf17ef6be02aa45355b8c6f7d6c74f27f18ff4..57dcbe253610ed5f254cc68ad56db52c9eb94134 100644 (file)
@@ -94,28 +94,6 @@ my $check_mountpoint_empty = sub {
     });
 };
 
-my $lockconfig = sub {
-    my ($self, $vmid) = @_;
-
-    my $conf = PVE::LXC::load_config($vmid);
-
-    PVE::LXC::check_lock($conf);
-    $conf->{lock} = 'backup';
-
-    PVE::LXC::write_config($vmid, $conf);
-};
-
-my $unlockconfig = sub {
-    my ($self, $vmid) = @_;
-
-    my $conf = PVE::LXC::load_config($vmid);
-
-    if ($conf->{lock} && $conf->{lock} eq 'backup') {
-       delete $conf->{lock};
-       PVE::LXC::write_config($vmid, $conf);
-    }
-};
-
 sub prepare {
     my ($self, $task, $vmid, $mode) = @_;
 
@@ -132,6 +110,7 @@ sub prepare {
     my ($id_map, $rootuid, $rootgid) = PVE::LXC::parse_id_maps($conf);
     $task->{userns_cmd} = PVE::LXC::userns_command($id_map);
 
+    my $volid_list = [];
     PVE::LXC::foreach_mountpoint($conf, sub {
        my ($name, $data) = @_;
        my $volid = $data->{volume};
@@ -146,14 +125,17 @@ sub prepare {
        }
 
        push @$disks, $data;
+       push @$volid_list, $volid
+           if $type eq 'volume';
     });
-    my $volid_list = [map { $_->{volume} } @$disks];
 
     if ($mode eq 'snapshot') {
        if (!PVE::LXC::has_feature('vzdump', $conf, $storage_cfg)) {
            die "mode failure - some volumes do not support snapshots\n";
        }
 
+       unlock_vm($self, $vmid);
+
        if ($conf->{snapshots} && $conf->{snapshots}->{vzdump}) {
            $self->loginfo("found old vzdump snapshot (force removal)");
            PVE::LXC::snapshot_delete($vmid, 'vzdump', 1);
@@ -166,26 +148,21 @@ sub prepare {
        # set snapshot_count (freezes CT if snapshot_count > 1)
        $task->{snapshot_count} = scalar(@$volid_list);
     } elsif ($mode eq 'stop') {
-       &$lockconfig($self, $vmid);
-
        my $rootdir = $default_mount_point;
        mkpath $rootdir;
        &$check_mountpoint_empty($rootdir);
        PVE::Storage::activate_volumes($storage_cfg, $volid_list);
     } elsif ($mode eq 'suspend') {
-       &$lockconfig($self, $vmid);
-
        my $pid = PVE::LXC::find_lxc_pid($vmid);
        foreach my $disk (@$disks) {
            $disk->{dir} = "/proc/$pid/root$disk->{mp}";
        }
        $task->{snapdir} = $task->{tmpdir};
     } else {
+       unlock_vm($self, $vmid);
        die "unknown mode '$mode'\n"; # should not happen
     }
 
-    PVE::LXC::lock_release($vmid);
-
     if ($mode ne 'suspend') {
        # If we perform mount operations, let's unshare the mount namespace
        # to not influence the running host.
@@ -196,11 +173,35 @@ sub prepare {
 
 sub lock_vm {
     my ($self, $vmid) = @_;
-    PVE::LXC::lock_aquire($vmid);
+
+    my $lockconfig = sub {
+       my ($self, $vmid) = @_;
+
+       my $conf = PVE::LXC::load_config($vmid);
+
+       PVE::LXC::check_lock($conf);
+       $conf->{lock} = 'backup';
+
+       PVE::LXC::write_config($vmid, $conf);
+    };
+
+    PVE::LXC::lock_container($vmid, 10, $lockconfig, ($self, $vmid));
 }
 
 sub unlock_vm {
     my ($self, $vmid) = @_;
+
+    my $unlockconfig = sub {
+       my ($self, $vmid) = @_;
+
+       my $conf = PVE::LXC::load_config($vmid);
+
+       if ($conf->{lock} && $conf->{lock} eq 'backup') {
+           delete $conf->{lock};
+           PVE::LXC::write_config($vmid, $conf);
+       }
+    };
+
     PVE::LXC::lock_container($vmid, 60, $unlockconfig, ($self, $vmid));
 }
 
@@ -219,6 +220,7 @@ sub snapshot {
        if !($conf->{snapshots} && $conf->{snapshots}->{vzdump});
 
     my $disks = $task->{disks};
+    #todo: reevaluate bind/dev mount handling when implementing snapshots for mps
     my $volid_list = [map { $_->{volume} } @$disks];
 
     my $rootdir = $default_mount_point;