[pve-devel] [PATCH qemu-server 7/7] Use parameter lock for importovf

Dominic Jäger d.jaeger at proxmox.com
Fri Oct 25 11:24:07 CEST 2019


Previously creating a VM on another node between locking the config with
lock_config_full and writing to it for the first time with write_config
was possible.

Using create_and_lock_config eliminates this possibility. This means
that now a parameter lock in the config is used instead of flock only.

Signed-off-by: Dominic Jäger <d.jaeger at proxmox.com>
---
 PVE/CLI/qm.pm | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
index 97f0f88..3bf8e81 100755
--- a/PVE/CLI/qm.pm
+++ b/PVE/CLI/qm.pm
@@ -621,14 +621,14 @@ __PACKAGE__->register_method ({
 	    return;
 	}
 
-	$param->{name} = $parsed->{qm}->{name} if defined($parsed->{qm}->{name});
-	$param->{memory} = $parsed->{qm}->{memory} if defined($parsed->{qm}->{memory});
-	$param->{cores} = $parsed->{qm}->{cores} if defined($parsed->{qm}->{cores});
+	eval { PVE::QemuConfig->create_and_lock_config($vmid, 0); };
+	die "Import failed: $@" if $@;
 
-	# why is wait_for_lock exactly 1?
-	PVE::QemuConfig->lock_config_full($vmid, 1, sub {
-	    PVE::Cluster::check_vmid_unused($vmid);
-	    my $conf = $param;
+	my $conf = PVE::QemuConfig->load_config($vmid);
+	if (PVE::QemuConfig->has_lock($conf, "create")) {
+	    $conf->{name} = $parsed->{qm}->{name} if defined($parsed->{qm}->{name});
+	    $conf->{memory} = $parsed->{qm}->{memory} if defined($parsed->{qm}->{memory});
+	    $conf->{cores} = $parsed->{qm}->{cores} if defined($parsed->{qm}->{cores});
 
 	    eval {
 		# order matters, as do_import() will load_config() internally
@@ -639,7 +639,7 @@ __PACKAGE__->register_method ({
 		foreach my $disk (@{ $parsed->{disks} }) {
 		    my ($file, $drive) = ($disk->{backing_file}, $disk->{disk_address});
 		    PVE::QemuServer::ImportDisk::do_import($file, $vmid, $storeid,
-			0, { drive_name => $drive, format => $format });
+			1, { drive_name => $drive, format => $format });
 		}
 
 		# reload after disks entries have been created
@@ -653,7 +653,10 @@ __PACKAGE__->register_method ({
 		PVE::QemuServer::destroy_vm($storecfg, $vmid, undef, 1);
 		die "import failed - $err";
 	    }
-	});
+	    PVE::QemuConfig->remove_lock ($vmid, "create");
+	} else {
+	    die "Import failed as 'create' lock has gone lost!";
+	}
 
 	return undef;
 
-- 
2.20.1




More information about the pve-devel mailing list