[libvirt] [PATCHv1 03/13] Separate out virStorageFeatureParse

Peter Krempa pkrempa at redhat.com
Mon Apr 13 05:41:12 UTC 2015


On Fri, Apr 10, 2015 at 14:58:55 +0200, Ján Tomko wrote:
> To allow sharing the function between snapshot_conf and storage_conf.
> ---
>  po/POTFILES.in                  |  1 +
>  src/Makefile.am                 |  5 ++++
>  src/conf/storage_conf.c         | 32 ++++-----------------
>  src/conf/storage_feature_conf.c | 62 +++++++++++++++++++++++++++++++++++++++++
>  src/conf/storage_feature_conf.h | 22 +++++++++++++++
>  5 files changed, 96 insertions(+), 26 deletions(-)
>  create mode 100644 src/conf/storage_feature_conf.c
>  create mode 100644 src/conf/storage_feature_conf.h
> 

...

> diff --git a/src/Makefile.am b/src/Makefile.am
> index 91a4c17..4e8679a 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -309,6 +309,10 @@ NWFILTER_CONF_SOURCES =						\

>  		conf/interface_conf.c conf/interface_conf.h
> @@ -342,6 +346,7 @@ CONF_SOURCES =							\
>  		$(NWFILTER_CONF_SOURCES)			\
>  		$(NODE_DEVICE_CONF_SOURCES)			\
>  		$(STORAGE_CONF_SOURCES)				\
> +		$(STORAGE_FEATURE_CONF_SOURCES)     \

The backslash at the end is not indented with tabs thus it's improperly
aligned when viewed with the git tool that formats 8 spaces for tabs.

>  		$(INTERFACE_CONF_SOURCES)			\
>  		$(SECRET_CONF_SOURCES)				\
>  		$(CPU_CONF_SOURCES)				\
> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
> index 339f08f..a5b5c1b 100644
> --- a/src/conf/storage_conf.c
> +++ b/src/conf/storage_conf.c
> @@ -36,6 +36,7 @@
>  #include "virerror.h"
>  #include "datatypes.h"
>  #include "storage_conf.h"
> +#include "storage_feature_conf.h"
>  #include "virstoragefile.h"
>  
>  #include "virxml.h"
> @@ -1255,9 +1256,6 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>      char *unit = NULL;
>      char *backingStore = NULL;
>      xmlNodePtr node;
> -    xmlNodePtr *nodes = NULL;
> -    size_t i;
> -    int n;
>  
>      virCheckFlags(VIR_VOL_XML_PARSE_NO_CAPACITY |
>                    VIR_VOL_XML_PARSE_OPT_CAPACITY, NULL);
> @@ -1392,31 +1390,13 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
>      if (virXPathNode("./target/nocow", ctxt))
>          ret->target.nocow = true;
>  
> -    if (virXPathNode("./target/features", ctxt)) {
> -        if ((n = virXPathNodeSet("./target/features/*", ctxt, &nodes)) < 0)
> -            goto error;
> -
> -        if (!ret->target.compat && VIR_STRDUP(ret->target.compat, "1.1") < 0)
> -            goto error;
> -
> -        if (!(ret->target.features = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST)))
> -            goto error;
> -
> -        for (i = 0; i < n; i++) {
> -            int f = virStorageFileFeatureTypeFromString((const char*)nodes[i]->name);
> -
> -            if (f < 0) {
> -                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported feature %s"),
> -                               (const char*)nodes[i]->name);
> -                goto error;
> -            }
> -            ignore_value(virBitmapSetBit(ret->target.features, f));
> -        }
> -        VIR_FREE(nodes);
> -    }
> +    if (virStorageFeaturesParse(ctxt,
> +                                "./target/features",
> +                                &ret->target.compat,
> +                                &ret->target.features) < 0)
> +        goto error;
>  
>   cleanup:
> -    VIR_FREE(nodes);
>      VIR_FREE(allocation);
>      VIR_FREE(capacity);
>      VIR_FREE(unit);
> diff --git a/src/conf/storage_feature_conf.c b/src/conf/storage_feature_conf.c
> new file mode 100644
> index 0000000..77e6406
> --- /dev/null
> +++ b/src/conf/storage_feature_conf.c
> @@ -0,0 +1,62 @@
> +/*
> + * storage_feature_conf.c: config handling for storage file features
> + *
> + * Copyright: Red Hat, Inc
> + *
> + * LGLPv2.1+
> + */

I like this compact header, but I'm not sure if the rest of upstream has
the same opinion.


> +
> +#include <config.h>
> +
> +#include "storage_feature_conf.h"
> +#include "viralloc.h"
> +#include "virerror.h"
> +#include "virstoragefile.h"
> +#include "virstring.h"
> +
> +#define VIR_FROM_THIS VIR_FROM_STORAGE
> +
> +int virStorageFeaturesParse(xmlXPathContextPtr ctxt,

return type on the same line

> +                            const char *xpath,
> +                            char **compat,
> +                            virBitmapPtr *features)
> +{
> +    xmlNodePtr *nodes = NULL;
> +    char *feat_xpath = NULL;
> +    size_t i;
> +    int n;
> +    int ret = -1;
> +
> +    if (!virXPathNode(xpath, ctxt))
> +        return 0;
> +
> +    if (!*compat && VIR_STRDUP(*compat, "1.1") < 0)
> +        return -1;

Is there a specific reason that you check whether the compat string is
not assigned previously?

> +
> +    if (virAsprintf(&feat_xpath, "%s/*", xpath) < 0)
> +        goto cleanup;
> +
> +    if ((n = virXPathNodeSet(feat_xpath, ctxt, &nodes)) < 0)
> +        goto cleanup;
> +
> +    if (!(*features = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST)))
> +        goto cleanup;
> +
> +    for (i = 0; i < n; i++) {
> +        int f = virStorageFileFeatureTypeFromString((const char*)nodes[i]->name);
> +
> +        if (f < 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported feature %s"),
> +                           (const char*)nodes[i]->name);
> +            goto cleanup;
> +        }
> +        ignore_value(virBitmapSetBit(*features, f));
> +    }
> +
> +    ret = 0;
> +
> + cleanup:
> +    VIR_FREE(nodes);
> +    VIR_FREE(feat_xpath);
> +    return ret;
> +}
> diff --git a/src/conf/storage_feature_conf.h b/src/conf/storage_feature_conf.h
> new file mode 100644
> index 0000000..a411b66
> --- /dev/null
> +++ b/src/conf/storage_feature_conf.h
> @@ -0,0 +1,22 @@
> +/*
> + * storage_feature_conf.h: config handling for storage file features
> + *
> + * Copyright: Red Hat, Inc
> + *
> + * LGLPv2.1+
> + */
> +
> +#ifndef __VIR_STORAGE_FEATURE_CONF_H__
> +# define __VIR_STORAGE_FEATURE_CONF_H__
> +
> +# include "internal.h"
> +
> +# include "virbitmap.h"
> +# include "virxml.h"
> +
> +int virStorageFeaturesParse(xmlXPathContextPtr ctxt,
> +                            const char *xpath,
> +                            char **compat,
> +                            virBitmapPtr *features);

All four arguments are ATTRIBUTE_NONNULL.

> +
> +#endif /* __VIR_STORAGE_FEATURE_CONF_H__ */

The code looks okay, but I'm not entirely sure about the licence
section, so I'd rather have another opinion.

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150413/eb1b8c27/attachment-0001.sig>


More information about the libvir-list mailing list