[libvirt] [PATCHv1.5 16/27] snapshot: conf: Use common parsing and formatting functions for source

Michal Privoznik mprivozn at redhat.com
Wed Nov 27 11:15:29 UTC 2013


On 26.11.2013 17:48, Peter Krempa wrote:
> Disk source elements for snapshots were using separate code from our
> config parser. As snapshots can be stored on more than just regular
> files, we will need the universal parser to allow us to expose a variety
> of snapshot disk targets. This patch reuses the config parsers and
> formatters to do the job.
> 
> This initial support only changes the code without any visible XML
> change.
> ---
>  src/conf/snapshot_conf.c | 70 +++++++++++++++++++++++++++++++++---------------
>  src/conf/snapshot_conf.h |  1 +
>  2 files changed, 49 insertions(+), 22 deletions(-)
> 
> diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
> index 94a74d2..7258daa 100644
> --- a/src/conf/snapshot_conf.c
> +++ b/src/conf/snapshot_conf.c
> @@ -128,27 +128,42 @@ virDomainSnapshotDiskDefParseXML(xmlNodePtr node,
>          }
>      }
> 
> -    cur = node->children;
> -    while (cur) {
> -        if (cur->type == XML_ELEMENT_NODE) {
> -            if (!def->file &&
> -                xmlStrEqual(cur->name, BAD_CAST "source")) {
> -                def->file = virXMLPropString(cur, "file");
> -            } else if (!def->format &&
> -                       xmlStrEqual(cur->name, BAD_CAST "driver")) {
> -                char *driver = virXMLPropString(cur, "type");
> -                def->format = virStorageFileFormatTypeFromString(driver);
> -                if (def->format <= 0) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR,
> -                                   _("unknown disk snapshot driver '%s'"),
> -                                   driver);
> -                    VIR_FREE(driver);
> -                    goto cleanup;
> -                }
> +    def->type = -1;
> +
> +    for (cur = node->children; cur; cur = cur->next) {
> +        if (cur->type != XML_ELEMENT_NODE)
> +            continue;
> +
> +        if (!def->file &&
> +            xmlStrEqual(cur->name, BAD_CAST "source")) {
> +
> +            int backingtype = def->type;
> +
> +            if (backingtype < 0)
> +                backingtype = VIR_DOMAIN_DISK_TYPE_FILE;

So far, def->type is never parsed, so the @backingtype is always
VIR_DOMAIN_DISK_TYPE_FILE. Mmm, okay.

> +
> +            if (virDomainDiskSourceDefParse(cur,
> +                                            backingtype,
> +                                            &def->file,
> +                                            NULL,
> +                                            NULL,
> +                                            NULL,
> +                                            NULL) < 0)
> +                goto cleanup;
> +
> +        } else if (!def->format &&
> +                   xmlStrEqual(cur->name, BAD_CAST "driver")) {
> +            char *driver = virXMLPropString(cur, "type");
> +            def->format = virStorageFileFormatTypeFromString(driver);
> +            if (def->format <= 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("unknown disk snapshot driver '%s'"),
> +                               driver);
>                  VIR_FREE(driver);
> +                goto cleanup;
>              }
> +            VIR_FREE(driver);
>          }
> -        cur = cur->next;
>      }
> 
>      if (!def->snapshot && (def->file || def->format))
> @@ -577,6 +592,8 @@ static void
>  virDomainSnapshotDiskDefFormat(virBufferPtr buf,
>                                 virDomainSnapshotDiskDefPtr disk)
>  {
> +    int type = disk->type;
> +
>      if (!disk->name)
>          return;
> 
> @@ -584,6 +601,13 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
>      if (disk->snapshot > 0)
>          virBufferAsprintf(buf, " snapshot='%s'",
>                            virDomainSnapshotLocationTypeToString(disk->snapshot));
> +
> +    if (type < 0)
> +        type = VIR_DOMAIN_DISK_TYPE_FILE;
> +    else
> +        virBufferAsprintf(buf, " type='%s'",
> +                          virDomainDiskTypeToString(type));
> +

This is a very thin line between no XML change and outputting a new
'type' attribute into XML. Doesn't make much sense now, but I see this
is to be changed in 25/27. Anyway, I think it would be better to save
these small snippets up till then.

>      if (!disk->file && disk->format == 0) {
>          virBufferAddLit(buf, "/>\n");
>          return;
> @@ -591,12 +615,14 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
> 
>      virBufferAddLit(buf, ">\n");
> 
> -    virBufferAdjustIndent(buf, 6);
>      if (disk->format > 0)
> -        virBufferEscapeString(buf, "<driver type='%s'/>\n",
> +        virBufferEscapeString(buf, "      <driver type='%s'/>\n",
>                                virStorageFileFormatTypeToString(disk->format));
> -    virBufferEscapeString(buf, "<source file='%s'/>\n", disk->file);
> -    virBufferAdjustIndent(buf, -6);
> +    virDomainDiskSourceDefFormatInternal(buf,
> +                                         type,
> +                                         disk->file,
> +                                         0, 0, 0, NULL, 0, NULL, NULL, 0);
> +
>      virBufferAddLit(buf, "    </disk>\n");
>  }
> 
> diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
> index ff3dca2..241d63c 100644
> --- a/src/conf/snapshot_conf.h
> +++ b/src/conf/snapshot_conf.h
> @@ -51,6 +51,7 @@ struct _virDomainSnapshotDiskDef {
>      char *name; /* name matching the <target dev='...' of the domain */
>      int index; /* index within snapshot->dom->disks that matches name */
>      int snapshot; /* enum virDomainSnapshotLocation */
> +    int type; /* enum virDomainDiskType */
>      char *file; /* new source file when snapshot is external */
>      int format; /* enum virStorageFileFormat */
>  };
> 

ACK to the rest.

Michal




More information about the libvir-list mailing list