From 2279d5605c1ba2fedc6a07b0b7a7f69742523caf Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 1 Apr 2014 19:13:51 -0600 Subject: [PATCH] conf: modify tracking of encrypted images A future patch will merge virStorageFileMetadata and virStorageSource, but I found it easier to do if both structs use the same information for tracking whether a source file needs encryption keys. * src/util/virstoragefile.h (_virStorageFileMetadata): Prepare full encryption struct instead of just a bool. * src/storage/storage_backend_fs.c (virStorageBackendProbeTarget): Use transfer semantics. * src/storage/storage_backend_gluster.c (virStorageBackendGlusterRefreshVol): Likewise. * src/util/virstoragefile.c (virStorageFileGetMetadataInternal): Populate struct. (virStorageFileFreeMetadata): Adjust clients. * tests/virstoragetest.c (testStorageChain): Likewise. Signed-off-by: Eric Blake --- src/storage/storage_backend_fs.c | 6 +++--- src/storage/storage_backend_gluster.c | 6 +++--- src/util/virstoragefile.c | 4 +++- src/util/virstoragefile.h | 3 ++- tests/virstoragetest.c | 4 ++-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 501fa8d258..de6521cda8 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -142,9 +142,9 @@ virStorageBackendProbeTarget(virStorageSourcePtr target, if (meta && meta->capacity) target->capacity = meta->capacity; - if (encryption && meta && meta->encrypted) { - if (VIR_ALLOC(*encryption) < 0) - goto cleanup; + if (encryption && meta && meta->encryption) { + *encryption = meta->encryption; + meta->encryption = NULL; switch (target->format) { case VIR_STORAGE_FILE_QCOW: diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c index 4aec44bae2..d131f13204 100644 --- a/src/storage/storage_backend_gluster.c +++ b/src/storage/storage_backend_gluster.c @@ -310,9 +310,9 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state, } if (meta->capacity) vol->target.capacity = meta->capacity; - if (meta->encrypted) { - if (VIR_ALLOC(vol->target.encryption) < 0) - goto cleanup; + if (meta->encryption) { + vol->target.encryption = meta->encryption; + meta->encryption = NULL; if (vol->target.format == VIR_STORAGE_FILE_QCOW || vol->target.format == VIR_STORAGE_FILE_QCOW2) vol->target.encryption->format = VIR_STORAGE_ENCRYPTION_FORMAT_QCOW; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 137bacc269..e6a985de09 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -837,7 +837,8 @@ virStorageFileGetMetadataInternal(const char *path, crypt_format = virReadBufInt32BE(buf + fileTypeInfo[format].qcowCryptOffset); - meta->encrypted = crypt_format != 0; + if (crypt_format && VIR_ALLOC(meta->encryption) < 0) + goto cleanup; } if (fileTypeInfo[format].getBackingStore != NULL) { @@ -1209,6 +1210,7 @@ virStorageFileFreeMetadata(virStorageFileMetadata *meta) VIR_FREE(meta->compat); VIR_FREE(meta->directory); virBitmapFree(meta->features); + virStorageEncryptionFree(meta->encryption); VIR_FREE(meta); } diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index aa06d41a67..56105d0c09 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -114,8 +114,9 @@ struct _virStorageFileMetadata { int backingStoreFormat; /* enum virStorageFileFormat */ bool backingStoreIsFile; virStorageFileMetadataPtr backingMeta; + + virStorageEncryptionPtr encryption; unsigned long long capacity; - bool encrypted; virBitmapPtr features; /* bits described by enum virStorageFileFeature */ char *compat; }; diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index 2890651e9f..3089d70919 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Red Hat, Inc. + * Copyright (C) 2013-2014 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -284,7 +284,7 @@ testStorageChain(const void *args) NULLSTR(elt->backingStoreRaw), NULLSTR(elt->directory), elt->backingStoreFormat, elt->backingStoreIsFile, - elt->capacity, elt->encrypted) < 0) { + elt->capacity, !!elt->encryption) < 0) { VIR_FREE(expect); VIR_FREE(actual); goto cleanup; -- GitLab