[libvirt] Re: [PATCH 3/6] Introduce virStorageFileMetadata structure

Daniel P. Berrange berrange at redhat.com
Wed Sep 30 09:27:19 UTC 2009


On Tue, Sep 29, 2009 at 09:56:46AM +0100, Mark McLoughlin wrote:
> Introduce a metadata structure and make virStorageGetMetadataFromFD()
> fill it in.
> 
> * src/util/storage_file.h: add virStorageFileMetadata
> 
> * src/backend/storage_backend_fs.c: virStorageGetMetadataFromFD() now
>   fills in the virStorageFileMetadata structure
> ---
>  src/storage/storage_backend_fs.c |   65 ++++++++++++++++++-------------------
>  src/util/storage_file.h          |    8 +++++
>  2 files changed, 40 insertions(+), 33 deletions(-)
> 
> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index 87c30cd..7db73bf 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -287,24 +287,13 @@ static int
>  virStorageGetMetadataFromFD(virConnectPtr conn,
>                              const char *path,
>                              int fd,
> -                            int *format,
> -                            bool *encrypted,
> -                            char **backingStore,
> -                            unsigned long long *capacity)
> +                            virStorageFileMetadata *meta)
>  {
>      unsigned char head[20*512]; /* vmdk4GetBackingStore needs this much. */
>      int len, i;
>  
> -    if (format) /* If all else fails, call it a raw file */
> -        *format = VIR_STORAGE_FILE_RAW;
> -    if (encrypted)
> -        *encrypted = false;
> -    if (backingStore)
> -        *backingStore = NULL;
> -    /* Do not overwrite capacity
> -     * if (capacity)
> -     *     *capacity = 0;
> -     */
> +    /* If all else fails, call it a raw file */
> +    meta->format = VIR_STORAGE_FILE_RAW;
>  
>      if ((len = read(fd, head, sizeof(head))) < 0) {
>          virReportSystemError(conn, errno, _("cannot read header '%s'"), path);
> @@ -345,9 +334,9 @@ virStorageGetMetadataFromFD(virConnectPtr conn,
>          }
>  
>          /* Optionally extract capacity from file */
> -        if (fileTypeInfo[i].sizeOffset != -1 && capacity) {
> +        if (fileTypeInfo[i].sizeOffset != -1) {
>              if (fileTypeInfo[i].endian == LV_LITTLE_ENDIAN) {
> -                *capacity =
> +                meta->capacity =
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+7] << 56) |
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+6] << 48) |
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+5] << 40) |
> @@ -357,7 +346,7 @@ virStorageGetMetadataFromFD(virConnectPtr conn,
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+1] << 8) |
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset]);
>              } else {
> -                *capacity =
> +                meta->capacity =
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset] << 56) |
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+1] << 48) |
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+2] << 40) |
> @@ -368,25 +357,24 @@ virStorageGetMetadataFromFD(virConnectPtr conn,
>                      ((unsigned long long)head[fileTypeInfo[i].sizeOffset+7]);
>              }
>              /* Avoid unlikely, but theoretically possible overflow */
> -            if (*capacity > (ULLONG_MAX / fileTypeInfo[i].sizeMultiplier))
> +            if (meta->capacity > (ULLONG_MAX / fileTypeInfo[i].sizeMultiplier))
>                  continue;
> -            *capacity *= fileTypeInfo[i].sizeMultiplier;
> +            meta->capacity *= fileTypeInfo[i].sizeMultiplier;
>          }
>  
> -        if (fileTypeInfo[i].qcowCryptOffset != -1 && encrypted) {
> +        if (fileTypeInfo[i].qcowCryptOffset != -1) {
>              int crypt_format;
>  
>              crypt_format = (head[fileTypeInfo[i].qcowCryptOffset] << 24) |
>                  (head[fileTypeInfo[i].qcowCryptOffset+1] << 16) |
>                  (head[fileTypeInfo[i].qcowCryptOffset+2] << 8) |
>                  head[fileTypeInfo[i].qcowCryptOffset+3];
> -            *encrypted = crypt_format != 0;
> +            meta->encrypted = crypt_format != 0;
>          }
>  
>          /* Validation passed, we know the file format now */
> -        if (format)
> -            *format = fileTypeInfo[i].type;
> -        if (fileTypeInfo[i].getBackingStore != NULL && backingStore) {
> +        meta->format = fileTypeInfo[i].type;
> +        if (fileTypeInfo[i].getBackingStore != NULL) {
>              char *base;
>  
>              switch (fileTypeInfo[i].getBackingStore(conn, &base, head, len)) {
> @@ -400,9 +388,9 @@ virStorageGetMetadataFromFD(virConnectPtr conn,
>                  return -1;
>              }
>              if (base != NULL) {
> -                *backingStore = absolutePathFromBaseFile(path, base);
> +                meta->backingStore = absolutePathFromBaseFile(path, base);
>                  VIR_FREE(base);
> -                if (*backingStore == NULL) {
> +                if (meta->backingStore == NULL) {
>                      virReportOOMError(conn);
>                      return -1;
>                  }
> @@ -419,8 +407,7 @@ virStorageGetMetadataFromFD(virConnectPtr conn,
>          if (!virFileHasSuffix(path, fileTypeInfo[i].extension))
>              continue;
>  
> -        if (format)
> -            *format = fileTypeInfo[i].type;
> +        meta->format = fileTypeInfo[i].type;
>          return 0;
>      }
>  
> @@ -436,7 +423,7 @@ virStorageBackendProbeTarget(virConnectPtr conn,
>                               virStorageEncryptionPtr *encryption)
>  {
>      int fd, ret;
> -    bool encrypted;
> +    virStorageFileMetadata meta;
>  
>      if (encryption)
>          *encryption = NULL;
> @@ -455,16 +442,28 @@ virStorageBackendProbeTarget(virConnectPtr conn,
>          return ret; /* Take care to propagate ret, it is not always -1 */
>      }
>  
> -    if (virStorageGetMetadataFromFD(conn, target->path, fd,
> -                                    &target->format, &encrypted,
> -                                    backingStore, capacity) < 0) {
> +    memset(&meta, 0, sizeof(meta));
> +
> +    if (virStorageGetMetadataFromFD(conn, target->path, fd, &meta) < 0) {
>          close(fd);
>          return -1;
>      }
>  
>      close(fd);
>  
> -    if (encryption != NULL && encrypted) {
> +    target->format = meta.format;
> +
> +    if (backingStore) {
> +        *backingStore = meta.backingStore;
> +        meta.backingStore = NULL;
> +    }
> +
> +    VIR_FREE(meta.backingStore);
> +
> +    if (capacity && meta.capacity)
> +        *capacity = meta.capacity;
> +
> +    if (encryption != NULL && meta.encrypted) {
>          if (VIR_ALLOC(*encryption) < 0) {
>              virReportOOMError(conn);
>              if (backingStore)
> diff --git a/src/util/storage_file.h b/src/util/storage_file.h
> index 7bccbe4..b458c0e 100644
> --- a/src/util/storage_file.h
> +++ b/src/util/storage_file.h
> @@ -25,6 +25,7 @@
>  #define __VIR_STORAGE_FILE_H__
>  
>  #include "util.h"
> +#include <stdbool.h>
>  
>  enum virStorageFileFormat {
>      VIR_STORAGE_FILE_RAW = 0,
> @@ -43,4 +44,11 @@ enum virStorageFileFormat {
>  
>  VIR_ENUM_DECL(virStorageFileFormat);
>  
> +typedef struct _virStorageFileMetadata {
> +    int format;
> +    char *backingStore;
> +    unsigned long long capacity;
> +    bool encrypted;
> +} virStorageFileMetadata;
> +
>  #endif /* __VIR_STORAGE_FILE_H__ */

ACK

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list