diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index 593bc1ea820..a322d5741bc 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -606,6 +606,7 @@ public void createVolume(CreateVolumeSpec v, ReturnValueCompletion if (v.isEncrypted()) { try { + v.setSize(alignSize(v.getSize())); getVolumeEncryptionExtension().createEncryptedEmptyVolume(encryptionBackend(), v, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); @@ -657,7 +658,9 @@ public void trashVolume(String installPath, Completion comp) { public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { if (dst.isEncrypted()) { try { - getVolumeEncryptionExtension().cloneEncryptedVolumeFromImage(encryptionBackend(), srcInstallPath, dst, comp); + ZbsVolumeEncryptionBackend backend = encryptionBackend(); + dst.setSize(alignSize(dst.getSize())); + getVolumeEncryptionExtension().cloneEncryptedVolumeFromImage(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); } @@ -750,7 +753,9 @@ public void handle(ErrorCode errCode, Map data) { public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { if (dst.isEncrypted()) { try { - getVolumeEncryptionExtension().copyEncryptedVolumeFromSnapshot(encryptionBackend(), srcInstallPath, dst, comp); + ZbsVolumeEncryptionBackend backend = encryptionBackend(); + dst.setSize(alignSize(dst.getSize())); + getVolumeEncryptionExtension().copyEncryptedVolumeFromSnapshot(backend, srcInstallPath, dst, comp); } catch (OperationFailureException e) { comp.fail(e.getErrorCode()); } @@ -880,7 +885,7 @@ public void expandVolume(VolumeInventory volume, long size, ReturnValueCompletio comp.fail(operr("cannot find ZBS volume encryption extension")); return; } - exts.get(0).resizeEncryptedVolume(self.getUuid(), volume, size, comp); + exts.get(0).resizeEncryptedVolume(self.getUuid(), volume, alignSize(size), comp); return; } diff --git a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java index 44e69e2fc1f..c475df30815 100644 --- a/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java +++ b/storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedVolumeCloner.java @@ -142,15 +142,11 @@ public void fail(ErrorCode errorCode) { private void resolveCloneVirtualSize(ZbsVolumeEncryptionBackend backend, String srcInstallPath, String resolvedSrcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion completion) { - if (dst.getSize() > 0) { - completion.success(dst.getSize()); - return; - } - Long dbSize = findSourceVirtualSizeInDb(backend, srcInstallPath); if (dbSize != null && dbSize > 0) { - dst.setSize(dbSize); - completion.success(dbSize); + long virtualSize = Math.max(dst.getSize(), dbSize); + dst.setSize(virtualSize); + completion.success(virtualSize); return; } @@ -165,8 +161,9 @@ public void success(VolumeStats stats) { return; } - dst.setSize(size); - completion.success(size); + long virtualSize = Math.max(dst.getSize(), size); + dst.setSize(virtualSize); + completion.success(virtualSize); } @Override