]> git.proxmox.com Git - qemu-server.git/commitdiff
live clone_vm : suspend or freezefs before block-job-cancel
authorAlexandre Derumier <aderumier@odiso.com>
Tue, 3 Jan 2017 14:03:19 +0000 (15:03 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Thu, 5 Jan 2017 08:09:46 +0000 (09:09 +0100)
if qga is enabled, we try to freeze the fs before cancelling block job.
if not , we pause the vm.

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
PVE/API2/Qemu.pm
PVE/QemuServer.pm

index 90d31f66f7059990e6953d39f59984b0ba6915e9..0bae42451341f7530e3845f967f6c85370c70dca 100644 (file)
@@ -2472,7 +2472,7 @@ __PACKAGE__->register_method({
                        $skipcomplete = undef if $total_jobs == $i; #finish after last drive
 
                        my $newdrive = PVE::QemuServer::clone_disk($storecfg, $vmid, $running, $opt, $drive, $snapname,
-                                                                  $newid, $storage, $format, $fullclone->{$opt}, $newvollist, $jobs, $skipcomplete);
+                                                                  $newid, $storage, $format, $fullclone->{$opt}, $newvollist, $jobs, $skipcomplete, $oldconf->{agent});
 
                        $newconf->{$opt} = PVE::QemuServer::print_drive($vmid, $newdrive);
 
index 95858325d6375aa8409479181a790b89b2d05fda..6d8943cf8c72d33bb8dc4015875bc44a321ff21e 100644 (file)
@@ -5907,7 +5907,7 @@ sub qemu_img_format {
 }
 
 sub qemu_drive_mirror {
-    my ($vmid, $drive, $dst_volid, $vmiddst, $is_zero_initialized, $jobs, $skipcomplete) = @_;
+    my ($vmid, $drive, $dst_volid, $vmiddst, $is_zero_initialized, $jobs, $skipcomplete, $qga) = @_;
 
     $jobs = {} if !$jobs;
 
@@ -5970,11 +5970,11 @@ sub qemu_drive_mirror {
     }
 
 
-    qemu_drive_mirror_monitor ($vmid, $vmiddst, $jobs, $skipcomplete);
+    qemu_drive_mirror_monitor ($vmid, $vmiddst, $jobs, $skipcomplete, $qga);
 }
 
 sub qemu_drive_mirror_monitor {
-    my ($vmid, $vmiddst, $jobs, $skipcomplete) = @_;
+    my ($vmid, $vmiddst, $jobs, $skipcomplete, $qga) = @_;
 
     eval {
 
@@ -6023,8 +6023,25 @@ sub qemu_drive_mirror_monitor {
                last if $skipcomplete; #do the complete later
 
                if ($vmiddst && $vmiddst != $vmid) {
+                   if ($qga) {
+                       print "freeze filesystem\n";
+                       eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-freeze"); };
+                   } else {
+                       print "suspend vm\n";
+                       eval { PVE::QemuServer::vm_suspend($vmid, 1); };
+                   }
+
                    # if we clone a disk for a new target vm, we don't switch the disk
                    PVE::QemuServer::qemu_blockjobs_cancel($vmid, $jobs);
+
+                   if ($qga) {
+                       print "unfreeze filesystem\n";
+                       eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-thaw"); };
+                   } else {
+                       print "resume vm\n";
+                       eval {  PVE::QemuServer::vm_resume($vmid, 1, 1); };
+                   }
+
                    last;
                } else {
 
@@ -6109,7 +6126,7 @@ sub qemu_blockjobs_finish_tunnel {
 
 sub clone_disk {
     my ($storecfg, $vmid, $running, $drivename, $drive, $snapname,
-       $newvmid, $storage, $format, $full, $newvollist, $jobs, $skipcomplete) = @_;
+       $newvmid, $storage, $format, $full, $newvollist, $jobs, $skipcomplete, $qga) = @_;
 
     my $newvolid;
 
@@ -6151,7 +6168,7 @@ sub clone_disk {
                    if $drive->{iothread};
            }
 
-           qemu_drive_mirror($vmid, $drivename, $newvolid, $newvmid, $sparseinit, $jobs, $skipcomplete);
+           qemu_drive_mirror($vmid, $drivename, $newvolid, $newvmid, $sparseinit, $jobs, $skipcomplete, $qga);
        }
     }