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/po/POTFILES.in b/po/POTFILES.in index dd06ab3..09dcd99 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -34,6 +34,7 @@ src/conf/object_event.c src/conf/secret_conf.c src/conf/snapshot_conf.c src/conf/storage_conf.c +src/conf/storage_feature_conf.c src/conf/virchrdev.c src/cpu/cpu.c src/cpu/cpu_generic.c 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 = \ STORAGE_CONF_SOURCES = \ conf/storage_conf.h conf/storage_conf.c +# Storage driver generic impl APIs +STORAGE_FEATURE_CONF_SOURCES = \ + conf/storage_feature_conf.h conf/storage_feature_conf.c + # Interface driver generic impl APIs INTERFACE_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) \ $(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+ + */ + +#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, + 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; + + 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); + +#endif /* __VIR_STORAGE_FEATURE_CONF_H__ */ -- 2.0.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list