});
}
- # and add used,owned/non-shared disks (just to be sure we have all)
+ # and add used, owned/non-shared disks (just to be sure we have all)
- PVE::QemuServer::foreach_drive($conf, sub {
- my ($ds, $drive) = @_;
+ PVE::QemuServer::foreach_volid($conf, sub {
+ my ($volid, $is_cdrom) = @_;
- my $volid = $drive->{file};
return if !$volid;
die "cant migrate local file/device '$volid'\n" if $volid =~ m|^/|;
- if (PVE::QemuServer::drive_is_cdrom($drive)) {
+ if ($is_cdrom) {
die "cant migrate local cdrom drive\n" if $volid eq 'cdrom';
return if $volid eq 'none';
$cdromhash->{$volid} = 1;
}
}
+sub foreach_volid {
+ my ($conf, $func) = @_;
+
+ my $volhash = {};
+
+ my $test_volid = sub {
+ my ($volid, $is_cdrom) = @_;
+
+ return if !$volid;
+
+ $volhash->{$volid} = $is_cdrom || 0;
+ };
+
+ PVE::QemuServer::foreach_drive($conf, sub {
+ my ($ds, $drive) = @_;
+ &$test_volid($drive->{file}, drive_is_cdrom($drive));
+ });
+
+ foreach my $snapname (keys %{$conf->{snapshots}}) {
+ my $snap = $conf->{snapshots}->{$snapname};
+ &$test_volid($snap->{vmstate}, 0);
+ PVE::QemuServer::foreach_drive($snap, sub {
+ my ($ds, $drive) = @_;
+ &$test_volid($drive->{file}, drive_is_cdrom($drive));
+ });
+ }
+
+ foreach my $volid (keys %$volhash) {
+ &$func($volid, $volhash->{$volid});
+ }
+}
+
sub config_to_command {
my ($storecfg, $vmid, $conf, $defaults) = @_;
my ($conf) = @_;
my $vollist = [];
- foreach_drive($conf, sub {
- my ($ds, $drive) = @_;
+ foreach_volid($conf, sub {
+ my ($volid, $is_cdrom) = @_;
- my ($sid, $volname) = PVE::Storage::parse_volume_id($drive->{file}, 1);
- return if !$sid;
+ return if $volid =~ m|^/|;
- my $volid = $drive->{file};
- return if !$volid || $volid =~ m|^/|;
+ my ($sid, $volname) = PVE::Storage::parse_volume_id($volid, 1);
+ return if !$sid;
push @$vollist, $volid;
});