From: Peter Krempa Date: Tue, 12 Dec 2023 16:11:45 +0000 (+0100) Subject: qemu: block: Introduce helpers for properly testing for 'raw' and 'luks' images X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=04b94593d172e1497e4accce812d4b5c5f5dfe04;p=libvirt.git qemu: block: Introduce helpers for properly testing for 'raw' and 'luks' images 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 Reviewed-by: Ján Tomko Spellchecked-by: Ján Tomko --- diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 7e9daf0bdc..87dddf7c4a 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -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 diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index 0eab0d822c..9a9aa97900 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -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);