]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: block: Introduce helpers for properly testing for 'raw' and 'luks' images
authorPeter Krempa <pkrempa@redhat.com>
Tue, 12 Dec 2023 16:11:45 +0000 (17:11 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 14 Dec 2023 15:03:40 +0000 (16:03 +0100)
Unfortunately a LUKS image to be decrypted by qemu has
VIR_STORAGE_FILE_RAW as format, but has encryption properties populated.

Many places in the code don't check it properly and also don't check
properly whether the image is indeed LUKS to be decrypted by qemu.

Introduce helpers which will simplify this task.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Spellchecked-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_block.c
src/qemu/qemu_block.h

index 7e9daf0bdc2720ff812568a0980cc79680223cb5..87dddf7c4a1cb5eca90155b0e97e14a0d2bf78f0 100644 (file)
@@ -3237,6 +3237,49 @@ qemuBlockReopenReadOnly(virDomainObj *vm,
     return qemuBlockReopenAccess(vm, src, true, asyncJob);
 }
 
+
+/**
+ * qemuBlockStorageSourceIsLUKS:
+ * @src: storage source object
+ *
+ * Returns true if @src is an image in 'luks' format, which is to be decrypted
+ * in qemu (rather than transparently by the transport layer or host's kernel).
+ */
+bool
+qemuBlockStorageSourceIsLUKS(const virStorageSource *src)
+{
+    if (src->format != VIR_STORAGE_FILE_RAW)
+        return false;
+
+    if (src->encryption &&
+        src->encryption->engine == VIR_STORAGE_ENCRYPTION_ENGINE_QEMU &&
+        src->encryption->format == VIR_STORAGE_ENCRYPTION_FORMAT_LUKS)
+        return true;
+
+    return false;
+}
+
+
+/**
+ * qemuBlockStorageSourceIsRaw:
+ * @src: storage source object
+ *
+ * Returns true if @src is a true 'raw' image. This specifically excludes
+ * LUKS encrypted images to be decrypted by qemu.
+ */
+bool
+qemuBlockStorageSourceIsRaw(const virStorageSource *src)
+{
+    if (src->format != VIR_STORAGE_FILE_RAW)
+        return false;
+
+    if (qemuBlockStorageSourceIsLUKS(src))
+        return false;
+
+    return true;
+}
+
+
 /**
  * qemuBlockStorageSourceNeedSliceLayer:
  * @src: source to inspect
index 0eab0d822c1101ae825cede608f551ae0fa01c0c..9a9aa9790099f0d55686076f618c5fa035c619c3 100644 (file)
@@ -267,6 +267,11 @@ qemuBlockReopenReadOnly(virDomainObj *vm,
                         virStorageSource *src,
                         virDomainAsyncJob asyncJob);
 
+bool
+qemuBlockStorageSourceIsLUKS(const virStorageSource *src);
+bool
+qemuBlockStorageSourceIsRaw(const virStorageSource *src);
+
 bool
 qemuBlockStorageSourceNeedsStorageSliceLayer(const virStorageSource *src);