[pve-devel] [qemu-server 5/5] PVE/QemuMigrate.pm - use PVE::QemuServer::foreach_volid

Dietmar Maurer dietmar at proxmox.com
Tue Jun 13 08:38:58 CEST 2017


Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
 PVE/QemuMigrate.pm | 42 +++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
index 22c0d7d..2527cba 100644
--- a/PVE/QemuMigrate.pm
+++ b/PVE/QemuMigrate.pm
@@ -269,9 +269,7 @@ sub sync_disks {
 	}
 
 	my $test_volid = sub {
-	    my ($volid, $is_cdrom, $snapname) = @_;
-
-	    return if !$volid;
+	    my ($volid, $is_cdrom, $snaprefs) = @_;
 
 	    if ($volid =~ m|^/|) {
 		$local_volumes->{$volid} = 'config';
@@ -281,8 +279,9 @@ sub sync_disks {
 	    if ($is_cdrom) {
 		if ($volid eq 'cdrom') {
 		    my $msg = "can't migrate local cdrom drive";
-		    $msg .= " (referenced in snapshot '$snapname')"
-			if defined($snapname);
+		    if (defined($snaprefs)) {
+			my $snapnames = join(', ', sort keys %$snaprefs);
+			$msg .= " (referenced in snapshot - $snapnames)"
 
 		    &$log_error("$msg\n");
 		    return;
@@ -301,7 +300,7 @@ sub sync_disks {
 
 	    $sharedvm = 0;
 
-	    $local_volumes->{$volid} = defined($snapname) ? 'snapshot' : 'config';
+	    $local_volumes->{$volid} = defined($snaprefs) ? 'snapshot' : 'config';
 
 	    die "local cdrom image\n" if $is_cdrom;
 
@@ -310,7 +309,7 @@ sub sync_disks {
 	    die "owned by other VM (owner = VM $owner)\n"
 		if !$owner || ($owner != $self->{vmid});
 
-	    if (defined($snapname)) {
+	    if (defined($snaprefs)) {
 		# we cannot migrate shapshots on local storage
 		# exceptions: 'zfspool' or 'qcow2' files (on directory storage)
 
@@ -325,26 +324,19 @@ sub sync_disks {
 		if PVE::Storage::volume_is_base_and_used($self->{storecfg}, $volid);
 	};
 
-	my $test_drive = sub {
-	    my ($ds, $drive, $snapname) = @_;
-
-	    eval {
-		&$test_volid($drive->{file}, PVE::QemuServer::drive_is_cdrom($drive), $snapname);
-	    };
-
-	    &$log_error($@, $drive->{file}) if $@;
-	};
-
-	foreach my $snapname (keys %{$conf->{snapshots}}) {
+	PVE::QemuServer::foreach_volid($conf, sub {
+	    my ($volid, $attr) = @_;
 	    eval {
-		&$test_volid($conf->{snapshots}->{$snapname}->{'vmstate'}, 0, undef)
-		    if defined($conf->{snapshots}->{$snapname}->{'vmstate'});
+		if ($attr->{referenced_in_config}) {
+		    $test_volid->($volid, $attr->{cdrom}, undef);
+		} else {
+		    $test_volid->($volid, $attr->{cdrom}, $attr->{referenced_in_snapshot});
+		}
 	    };
-	    &$log_error($@, $conf->{snapshots}->{$snapname}->{'vmstate'}) if $@;
-
-	    PVE::QemuServer::foreach_drive($conf->{snapshots}->{$snapname}, $test_drive, $snapname);
-	}
-	PVE::QemuServer::foreach_drive($conf, $test_drive);
+	    if (my $err = $@) {
+		&$log_error($err, $volid);
+	    }
+        });
 
 	foreach my $vol (sort keys %$local_volumes) {
 	    if ($local_volumes->{$vol} eq 'storage') {
-- 
2.11.0




More information about the pve-devel mailing list