]> git.proxmox.com Git - qemu-server.git/commitdiff
migrate volumes used inside snapshots including vmstate
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 25 Sep 2012 05:42:01 +0000 (07:42 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 25 Sep 2012 06:09:50 +0000 (08:09 +0200)
Introduce new helper function foreach_volid()

PVE/QemuMigrate.pm
PVE/QemuServer.pm

index 764e5b19d0abf2c2bafb8194b9fdc1bfa87e5ac7..07116816b86c1f52f2b7760351e8cd5768d78192 100644 (file)
@@ -199,17 +199,16 @@ sub sync_disks {
             });
         }
 
-       # 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;
index d5266a0c4a02346153eb2dff80a113ee1fab3141..02374a425ccc6e934a2cbbe98884a356db6c1d93 100644 (file)
@@ -2082,6 +2082,38 @@ sub foreach_drive {
     }
 }
 
+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) = @_;
 
@@ -3010,14 +3042,13 @@ sub get_vm_volumes {
     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;
     });