if src storeid == dst storeid, and storage support fast copy,
use it instead using qemu-img convert

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/QemuServer.pm | 52 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 7965c05..13c99d2 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -6063,38 +6063,44 @@ sub clone_disk {
     } else {
 
        my ($storeid, $volname) = PVE::Storage::parse_volume_id($drive->{file});
+       my $src_storeid = $storeid;
        $storeid = $storage if $storage;
 
-       my ($defFormat, $validFormats) = 
PVE::Storage::storage_default_format($storecfg, $storeid);
-       if (!$format) {
-           my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
-           $format = qemu_img_format($scfg, $volname);
-       }
+       if ((!$running || $snapname) && $storeid eq $src_storeid && 
PVE::Storage::volume_has_feature($storecfg, 'storagecopy', $drive->{file})) {
+           $newvolid = PVE::Storage::vdisk_copy($storecfg, $drive->{file}, 
$newvmid, $snapname);
+       } else {
+
+           my ($defFormat, $validFormats) = 
PVE::Storage::storage_default_format($storecfg, $storeid);
+           if (!$format) {
+               my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+               $format = qemu_img_format($scfg, $volname);
+           }
 
-       # test if requested format is supported - else use default
-       my $supported = grep { $_ eq $format } @$validFormats;
-       $format = $defFormat if !$supported;
+           # test if requested format is supported - else use default
+           my $supported = grep { $_ eq $format } @$validFormats;
+           $format = $defFormat if !$supported;
 
-       my ($size) = PVE::Storage::volume_size_info($storecfg, $drive->{file}, 
3);
+           my ($size) = PVE::Storage::volume_size_info($storecfg, 
$drive->{file}, 3);
 
-       print "create full clone of drive $drivename ($drive->{file})\n";
-       $newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $newvmid, 
$format, undef, ($size/1024));
-       push @$newvollist, $newvolid;
+           print "create full clone of drive $drivename ($drive->{file})\n";
+           $newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, 
$newvmid, $format, undef, ($size/1024));
+           push @$newvollist, $newvolid;
 
-       PVE::Storage::activate_volumes($storecfg, [$newvolid]);
+           PVE::Storage::activate_volumes($storecfg, [$newvolid]);
 
-       my $sparseinit = PVE::Storage::volume_has_feature($storecfg, 
'sparseinit', $newvolid);
-       if (!$running || $snapname) {
-           qemu_img_convert($drive->{file}, $newvolid, $size, $snapname, 
$sparseinit);
-       } else {
+           my $sparseinit = PVE::Storage::volume_has_feature($storecfg, 
'sparseinit', $newvolid);
+           if (!$running || $snapname) {
+               qemu_img_convert($drive->{file}, $newvolid, $size, $snapname, 
$sparseinit);
+           } else {
 
-           my $kvmver = get_running_qemu_version ($vmid);
-           if (!qemu_machine_feature_enabled (undef, $kvmver, 2, 7)) {
-               die "drive-mirror with iothread requires qemu version 2.7 or 
higher\n"
-                   if $drive->{iothread};
-           }
+               my $kvmver = get_running_qemu_version ($vmid);
+               if (!qemu_machine_feature_enabled (undef, $kvmver, 2, 7)) {
+                   die "drive-mirror with iothread requires qemu version 2.7 
or higher\n"
+                       if $drive->{iothread};
+               }
 
-           qemu_drive_mirror($vmid, $drivename, $newvolid, $newvmid, 
$sparseinit, $jobs, $skipcomplete);
+               qemu_drive_mirror($vmid, $drivename, $newvolid, $newvmid, 
$sparseinit, $jobs, $skipcomplete);
+           }
        }
     }
 
-- 
2.1.4

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to