[libvirt] [PATCHv2 1/4] util: storage: Allow metadata crawler to report useful errors

John Ferlan jferlan at redhat.com
Tue Sep 23 20:13:53 UTC 2014



On 09/18/2014 05:54 AM, Peter Krempa wrote:
> Add a new parameter to virStorageFileGetMetadata that will break the
> backing chain detection process and report useful error message rather
> than having to use virStorageFileChainGetBroken.
> 
> This patch just introduces the option, usage will be provided
> separately.
> ---
>  src/qemu/qemu_domain.c        |  3 ++-
>  src/security/virt-aa-helper.c |  2 +-
>  src/storage/storage_driver.c  | 24 +++++++++++++++++-------
>  src/storage/storage_driver.h  |  3 ++-
>  tests/virstoragetest.c        |  2 +-
>  5 files changed, 23 insertions(+), 11 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 5859ba7..19b935d 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -2693,7 +2693,8 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
> 
>      if (virStorageFileGetMetadata(disk->src,
>                                    uid, gid,
> -                                  cfg->allowDiskFormatProbing) < 0)
> +                                  cfg->allowDiskFormatProbing,
> +                                  false) < 0)
>          ret = -1;
> 
>   cleanup:
> diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
> index a06ba44..9afc8db 100644
> --- a/src/security/virt-aa-helper.c
> +++ b/src/security/virt-aa-helper.c
> @@ -932,7 +932,7 @@ get_files(vahControl * ctl)
>           */
>          if (!disk->src->backingStore) {
>              bool probe = ctl->allowDiskFormatProbing;
> -            virStorageFileGetMetadata(disk->src, -1, -1, probe);
> +            virStorageFileGetMetadata(disk->src, -1, -1, probe, false);
>          }
> 
>          /* XXX passing ignoreOpenFailure = true to get back to the behavior
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 433d7b7..c3b29c4 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -2783,6 +2783,7 @@ static int
>  virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
>                                   uid_t uid, gid_t gid,
>                                   bool allow_probe,
> +                                 bool report_broken,
>                                   virHashTablePtr cycle)
>  {
>      int ret = -1;
> @@ -2847,9 +2848,13 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
>      else
>          backingStore->format = backingFormat;
> 
> -    if (virStorageFileGetMetadataRecurse(backingStore,
> -                                         uid, gid, allow_probe,
> -                                         cycle) < 0) {
> +    if ((ret = virStorageFileGetMetadataRecurse(backingStore,
> +                                                uid, gid,
> +                                                allow_probe, report_broken,
> +                                                cycle)) < 0) {
> +        if (report_broken)
> +            goto cleanup;
> +
>          /* if we fail somewhere midway, just accept and return a
>           * broken chain */
>          ret = 0;
> @@ -2883,15 +2888,20 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
>   * format, since a malicious guest can turn a raw file into any
>   * other non-raw format at will.
>   *
> + * If @report_broken is true, the whole function fails with a possibly sane
> + * error instead of just returning a broken chain.
> + *
>   * Caller MUST free result after use via virStorageSourceFree.
>   */
>  int
>  virStorageFileGetMetadata(virStorageSourcePtr src,
>                            uid_t uid, gid_t gid,
> -                          bool allow_probe)
> +                          bool allow_probe,
> +                          bool report_broken)
>  {
> -    VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d",
> -              src->path, src->format, (int)uid, (int)gid, allow_probe);
> +    VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d, report_broken=%d",
> +              src->path, src->format, (int)uid, (int)gid,
> +              allow_probe, report_broken);
> 
>      virHashTablePtr cycle = NULL;
>      int ret = -1;
> @@ -2903,7 +2913,7 @@ virStorageFileGetMetadata(virStorageSourcePtr src,
>          src->format = allow_probe ? VIR_STORAGE_FILE_AUTO : VIR_STORAGE_FILE_RAW;
> 
>      ret = virStorageFileGetMetadataRecurse(src, uid, gid,
> -                                           allow_probe, cycle);
> +                                           allow_probe, report_broken, cycle);
> 
>      virHashFree(cycle);
>      return ret;
> diff --git a/src/storage/storage_driver.h b/src/storage/storage_driver.h
> index e773928..54a17a3 100644
> --- a/src/storage/storage_driver.h
> +++ b/src/storage/storage_driver.h
> @@ -50,7 +50,8 @@ bool virStorageFileSupportsSecurityDriver(virStorageSourcePtr src);
> 
>  int virStorageFileGetMetadata(virStorageSourcePtr src,
>                                uid_t uid, gid_t gid,
> -                              bool allow_probe)
> +                              bool allow_probe,
> +                              bool fail)

s/fail/report_broken

ACK

John
>      ATTRIBUTE_NONNULL(1);
> 
>  int virStorageTranslateDiskSourcePool(virConnectPtr conn,
> diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
> index e2ee3ff..29f5c7a 100644
> --- a/tests/virstoragetest.c
> +++ b/tests/virstoragetest.c
> @@ -119,7 +119,7 @@ testStorageFileGetMetadata(const char *path,
>      if (VIR_STRDUP(ret->path, path) < 0)
>          goto error;
> 
> -    if (virStorageFileGetMetadata(ret, uid, gid, allow_probe) < 0)
> +    if (virStorageFileGetMetadata(ret, uid, gid, allow_probe, false) < 0)
>          goto error;
> 
>      return ret;
> 




More information about the libvir-list mailing list