});
};
-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) = @_;
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};
}
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);
# 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.
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));
}
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;