PVE/QemuMigrate.pm - use PVE::QemuServer::foreach_volid

This commit is contained in:
Dietmar Maurer 2017-06-13 08:32:37 +02:00
parent 39019f75c7
commit aee6abe5ba

View File

@ -269,21 +269,22 @@ sub sync_disks {
} }
my $test_volid = sub { my $test_volid = sub {
my ($volid, $is_cdrom, $snapname) = @_; my ($volid, $attr) = @_;
return if !$volid;
if ($volid =~ m|^/|) { if ($volid =~ m|^/|) {
$local_volumes->{$volid} = 'config'; $local_volumes->{$volid} = 'config';
die "local file/device\n"; die "local file/device\n";
} }
if ($is_cdrom) { my $snaprefs = $attr->{referenced_in_snapshot};
if ($attr->{cdrom}) {
if ($volid eq 'cdrom') { if ($volid eq 'cdrom') {
my $msg = "can't migrate local cdrom drive"; my $msg = "can't migrate local cdrom drive";
$msg .= " (referenced in snapshot '$snapname')" if (defined($snaprefs) && !$attr->{referenced_in_config))
if defined($snapname); my $snapnames = join(', ', sort keys %$snaprefs);
$msg .= " (referenced in snapshot - $snapnames)"
}
&$log_error("$msg\n"); &$log_error("$msg\n");
return; return;
} }
@ -301,16 +302,16 @@ sub sync_disks {
$sharedvm = 0; $sharedvm = 0;
$local_volumes->{$volid} = defined($snapname) ? 'snapshot' : 'config'; $local_volumes->{$volid} = $attr->{referenced_in_config) ? 'config' : 'snapshot';
die "local cdrom image\n" if $is_cdrom; die "local cdrom image\n" if $attr->{cdrom};
my ($path, $owner) = PVE::Storage::path($self->{storecfg}, $volid); my ($path, $owner) = PVE::Storage::path($self->{storecfg}, $volid);
die "owned by other VM (owner = VM $owner)\n" die "owned by other VM (owner = VM $owner)\n"
if !$owner || ($owner != $self->{vmid}); if !$owner || ($owner != $self->{vmid});
if (defined($snapname)) { if (defined($snaprefs)) {
# we cannot migrate shapshots on local storage # we cannot migrate shapshots on local storage
# exceptions: 'zfspool' or 'qcow2' files (on directory storage) # exceptions: 'zfspool' or 'qcow2' files (on directory storage)
@ -325,26 +326,13 @@ sub sync_disks {
if PVE::Storage::volume_is_base_and_used($self->{storecfg}, $volid); if PVE::Storage::volume_is_base_and_used($self->{storecfg}, $volid);
}; };
my $test_drive = sub { PVE::QemuServer::foreach_volid($conf, sub {
my ($ds, $drive, $snapname) = @_; my ($volid, $attr) = @_;
eval { $test_volid->($volid, $attr); };
eval { if (my $err = $@) {
&$test_volid($drive->{file}, PVE::QemuServer::drive_is_cdrom($drive), $snapname); &$log_error($err, $volid);
}; }
});
&$log_error($@, $drive->{file}) if $@;
};
foreach my $snapname (keys %{$conf->{snapshots}}) {
eval {
&$test_volid($conf->{snapshots}->{$snapname}->{'vmstate'}, 0, undef)
if defined($conf->{snapshots}->{$snapname}->{'vmstate'});
};
&$log_error($@, $conf->{snapshots}->{$snapname}->{'vmstate'}) if $@;
PVE::QemuServer::foreach_drive($conf->{snapshots}->{$snapname}, $test_drive, $snapname);
}
PVE::QemuServer::foreach_drive($conf, $test_drive);
foreach my $vol (sort keys %$local_volumes) { foreach my $vol (sort keys %$local_volumes) {
if ($local_volumes->{$vol} eq 'storage') { if ($local_volumes->{$vol} eq 'storage') {