[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