diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java index 89270c10a62..22575ee8eed 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java @@ -709,7 +709,7 @@ public class KVMStorageProcessor implements StorageProcessor { srcFile.setFormat(PhysicalDiskFormat.RAW); QemuImgFile destFile = new QemuImgFile(snapshotFile); - destFile.setFormat(srcFile.getFormat()); + destFile.setFormat(snapshotDisk.getFormat()); s_logger.debug("Backing up RBD snapshot " + rbdSnapshot + " to " + snapshotFile); QemuImg q = new QemuImg(cmd.getWaitInMillSeconds()); @@ -1225,13 +1225,7 @@ public class KVMStorageProcessor implements StorageProcessor { VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(disk.getName()); newVol.setSize(disk.getVirtualSize()); - - /** - * We have to force the format of RBD volumes to RAW - */ - if (primaryPool.getType() == StoragePoolType.RBD) { - newVol.setFormat(ImageFormat.RAW); - } + newVol.setFormat(ImageFormat.valueOf(disk.getFormat().toString().toUpperCase())); return new CopyCmdAnswer(newVol); } catch (CloudRuntimeException e) { diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 503c51b5520..09400c77c30 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -1150,7 +1150,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { if (srcPool.getType() != StoragePoolType.RBD) { newDisk = destPool.createPhysicalDisk(name, Storage.ProvisioningType.THIN, disk.getVirtualSize()); } else { - newDisk = destPool.createPhysicalDisk(name, sourceFormat, Storage.ProvisioningType.THIN, disk.getVirtualSize()); + newDisk = destPool.createPhysicalDisk(name, Storage.ProvisioningType.THIN, disk.getVirtualSize()); } } } else { @@ -1201,10 +1201,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { } } else if ((srcPool.getType() != StoragePoolType.RBD) && (destPool.getType() == StoragePoolType.RBD)) { /** - * Qemu doesn't support writing to RBD format 2 directly, so we have to write to a temporary RAW file first - * which we then convert to RBD format 2. - * - * A HUGE performance gain can be achieved here if QCOW2 -> RBD format 2 can be done in one step + * Using qemu-img we copy the QCOW2 disk to RAW (on RBD) directly. + * To do so it's mandatory that librbd on the system is at least 0.67.7 (Ceph Dumpling) */ s_logger.debug("The source image is not RBD, but the destination is. We will convert into RBD format 2"); String sourceFile;