On 12/02/2016 10:38 AM, Olga Krishtal wrote:
After reusage of all possible storage pool structures
we will able to use some storage pool functions.
Signed-off-by: Olga Krishtal <okrishtal(a)virtuozzo.com>
---
src/Makefile.am | 2 +-
src/conf/storage_conf.c | 162 ----------------------------------------------
src/conf/storage_conf.h | 13 +---
src/libvirt_private.syms | 11 ++--
src/util/virpoolcommon.c | 125 +++++++++++++++++++++++++++++++++++
src/util/virpoolcommon.h | 16 +++++
src/util/virstoragefile.c | 73 +++++++++++++++++++++
src/util/virstoragefile.h | 3 +
8 files changed, 225 insertions(+), 180 deletions(-)
create mode 100644 src/util/virpoolcommon.c
I couldn't get this one to apply via "git am -3" - the src/Makefile.am
failed... Even removing that specific change, the volpoolcommon.h
changed - so there's something amiss with the patch.... I'll just make
some comments along the way...
I also suggest adding the virpool.c to the previous patch, then using
subsequent patches to remove code from storage_conf. The end result is
the same it's just "easier" to review...
diff --git a/src/Makefile.am b/src/Makefile.am
index f8d4a5b..13a4976 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -185,7 +185,7 @@ UTIL_SOURCES = \
util/viruuid.c util/viruuid.h \
util/virxdrdefs.h \
util/virxml.c util/virxml.h \
- util/virpoolcommon.h \
+ util/virpoolcommon.h util/virpoolcommon.c \
I think the file should be util/virpool.c
$(NULL)
EXTRA_DIST += $(srcdir)/util/keymaps.csv $(srcdir)/util/virkeycode-mapgen.py
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 7e7bb72..f452fba 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -96,10 +96,6 @@ VIR_ENUM_IMPL(virStoragePartedFs,
"ext2", "ext2",
"extended")
-VIR_ENUM_IMPL(virStoragePoolSourceAdapter,
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST,
- "default", "scsi_host", "fc_host")
-
The above stays here - I doubt it'll be used by fspool! It's very specific.
typedef const char *(*virStorageVolFormatToString)(int format);
typedef int (*virStorageVolFormatFromString)(const char *format);
@@ -328,73 +324,6 @@ virStorageVolDefFree(virStorageVolDefPtr def)
VIR_FREE(def);
}
-static void
-virStoragePoolSourceAdapterClear(virStoragePoolSourceAdapterPtr adapter)
-{
- if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
- VIR_FREE(adapter->data.fchost.wwnn);
- VIR_FREE(adapter->data.fchost.wwpn);
- VIR_FREE(adapter->data.fchost.parent);
- } else if (adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
- VIR_FREE(adapter->data.scsi_host.name);
- }
-}
-
The above stays
-void
-virStoragePoolSourceDeviceClear(virStoragePoolSourceDevicePtr dev)
-{
- VIR_FREE(dev->freeExtents);
- VIR_FREE(dev->path);
-}
-
Same
-void
-virStoragePoolSourceClear(virStoragePoolSourcePtr source)
-{
- size_t i;
-
- if (!source)
- return;
-
- for (i = 0; i < source->nhost; i++)
- VIR_FREE(source->hosts[i].name);
- VIR_FREE(source->hosts);
-
- for (i = 0; i < source->ndevice; i++)
- virStoragePoolSourceDeviceClear(&source->devices[i]);
- VIR_FREE(source->devices);
- VIR_FREE(source->dir);
- VIR_FREE(source->name);
- virStoragePoolSourceAdapterClear(&source->adapter);
- VIR_FREE(source->initiator.iqn);
- virStorageAuthDefFree(source->auth);
- VIR_FREE(source->vendor);
- VIR_FREE(source->product);
-}
-
-void
-virStoragePoolSourceFree(virStoragePoolSourcePtr source)
-{
- virStoragePoolSourceClear(source);
- VIR_FREE(source);
-}
-
-void
-virStoragePoolDefFree(virStoragePoolDefPtr def)
-{
- if (!def)
- return;
-
- VIR_FREE(def->name);
-
- virStoragePoolSourceClear(&def->source);
-
- VIR_FREE(def->target.path);
- VIR_FREE(def->target.perms.label);
- VIR_FREE(def);
-}
-
-
The above has some common and some specific stuff - it'll need to be
more closely looked at. The whole question of need for a virPoolObj I
raised in 1/15 comes into play...
void
virStoragePoolObjFree(virStoragePoolObjPtr obj)
{
@@ -730,83 +659,6 @@ virStoragePoolDefParseSourceString(const char *srcSpec,
return ret;
}
-static int
-virStorageDefParsePerms(xmlXPathContextPtr ctxt,
- virStoragePermsPtr perms,
- const char *permxpath)
I think this moves to virpool.c and is renamed to be more generic - that
is anything that says "Storage" needs to change...
-{
- char *mode;
- long long val;
- int ret = -1;
- xmlNodePtr relnode;
- xmlNodePtr node;
-
- node = virXPathNode(permxpath, ctxt);
- if (node == NULL) {
- /* Set default values if there is not <permissions> element */
- perms->mode = (mode_t) -1;
- perms->uid = (uid_t) -1;
- perms->gid = (gid_t) -1;
- perms->label = NULL;
- return 0;
- }
-
- relnode = ctxt->node;
- ctxt->node = node;
-
- if ((mode = virXPathString("string(./mode)", ctxt))) {
- int tmp;
-
- if (virStrToLong_i(mode, NULL, 8, &tmp) < 0 || (tmp & ~0777)) {
- VIR_FREE(mode);
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("malformed octal mode"));
- goto error;
- }
- perms->mode = tmp;
- VIR_FREE(mode);
- } else {
- perms->mode = (mode_t) -1;
- }
-
- if (virXPathNode("./owner", ctxt) == NULL) {
- perms->uid = (uid_t) -1;
- } else {
- /* We previously could output -1, so continue to parse it */
- if (virXPathLongLong("number(./owner)", ctxt, &val) < 0 ||
- ((uid_t)val != val &&
- val != -1)) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("malformed owner element"));
- goto error;
- }
-
- perms->uid = val;
- }
-
- if (virXPathNode("./group", ctxt) == NULL) {
- perms->gid = (gid_t) -1;
- } else {
- /* We previously could output -1, so continue to parse it */
- if (virXPathLongLong("number(./group)", ctxt, &val) < 0 ||
- ((gid_t) val != val &&
- val != -1)) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("malformed group element"));
- goto error;
- }
- perms->gid = val;
- }
-
- /* NB, we're ignoring missing labels here - they'll simply inherit */
- perms->label = virXPathString("string(./label)", ctxt);
-
- ret = 0;
- error:
- ctxt->node = relnode;
- return ret;
-}
-
static virStoragePoolDefPtr
virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
{
@@ -2125,20 +1977,6 @@ virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool)
return 0;
}
-virStoragePoolSourcePtr
-virStoragePoolSourceListNewSource(virStoragePoolSourceListPtr list)
-{
- virStoragePoolSourcePtr source;
-
- if (VIR_REALLOC_N(list->sources, list->nsources + 1) < 0)
- return NULL;
-
- source = &list->sources[list->nsources++];
- memset(source, 0, sizeof(*source));
-
- return source;
-}
-
I see this moving to virpool
char *
virStoragePoolSourceListFormat(virStoragePoolSourceListPtr def)
{
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 8a9a789..ad7de86 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -198,13 +198,8 @@ struct _virStorageDriverState {
virObjectEventStatePtr storageEventState;
};
-typedef struct _virStoragePoolSourceList virStoragePoolSourceList;
+typedef virPoolSourceList virStoragePoolSourceList;
typedef virStoragePoolSourceList *virStoragePoolSourceListPtr;
-struct _virStoragePoolSourceList {
- int type;
- unsigned int nsources;
- virPoolSourcePtr sources;
-};
typedef bool (*virStoragePoolObjListFilter)(virConnectPtr conn,
virStoragePoolDefPtr def);
@@ -290,10 +285,6 @@ int virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
int virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool);
void virStorageVolDefFree(virStorageVolDefPtr def);
-void virStoragePoolSourceClear(virStoragePoolSourcePtr source);
-void virStoragePoolSourceDeviceClear(virStoragePoolSourceDevicePtr dev);
-void virStoragePoolSourceFree(virStoragePoolSourcePtr source);
-void virStoragePoolDefFree(virStoragePoolDefPtr def);
These are TBD.
void virStoragePoolObjFree(virStoragePoolObjPtr pool);
void virStoragePoolObjListFree(virStoragePoolObjListPtr pools);
void virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
@@ -302,8 +293,6 @@ void virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
virStoragePoolSourcePtr
virStoragePoolDefParseSourceString(const char *srcSpec,
int pool_type);
-virStoragePoolSourcePtr
-virStoragePoolSourceListNewSource(virStoragePoolSourceListPtr list);
char *virStoragePoolSourceListFormat(virStoragePoolSourceListPtr def);
int virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 74dd527..a061799 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -867,7 +867,6 @@ virDomainSnapshotUpdateRelations;
# conf/storage_conf.h
virStoragePartedFsTypeToString;
virStoragePoolDefFormat;
-virStoragePoolDefFree;
virStoragePoolDefParseFile;
virStoragePoolDefParseNode;
virStoragePoolDefParseSourceString;
@@ -895,13 +894,9 @@ virStoragePoolSaveConfig;
virStoragePoolSaveState;
virStoragePoolSourceAdapterTypeFromString;
virStoragePoolSourceAdapterTypeToString;
-virStoragePoolSourceClear;
-virStoragePoolSourceDeviceClear;
virStoragePoolSourceFindDuplicate;
virStoragePoolSourceFindDuplicateDevices;
-virStoragePoolSourceFree;
virStoragePoolSourceListFormat;
-virStoragePoolSourceListNewSource;
virStoragePoolTypeFromString;
virStoragePoolTypeToString;
virStorageVolDefFindByKey;
@@ -2708,6 +2703,12 @@ virXPathULong;
virXPathULongHex;
virXPathULongLong;
+# util/virpoolcommon.h
virpool.h
+virStoragePoolDefFree;
+virStoragePoolSourceFree;
+virStoragePoolSourceDeviceClear;
+virStoragePoolSourceClear;
+virStoragePoolSourceListNewSource;
Your new names should not be "virStoragePool" - rather just "virPool"
obvious affect in code as well...
# Let emacs know we want case-insensitive sorting
# Local Variables:
diff --git a/src/util/virpoolcommon.c b/src/util/virpoolcommon.c
new file mode 100644
index 0000000..3ee6251
--- /dev/null
+++ b/src/util/virpoolcommon.c
virpool.c
@@ -0,0 +1,125 @@
+/*
+ * virpoolcommon.c: utility to operate common parts in storage pools and
+ * filesystem pools
Similar virpool.c - common pool ...
Based on earlier review - some of these API's don't move here.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <config.h>
+#include "virpoolcommon.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include "viralloc.h"
+#include "virxml.h"
+#include "viruuid.h"
+#include "virerror.h"
+#include "virlog.h"
+#include "virfile.h"
+#include "virendian.h"
+#include "virstring.h"
+#include "virutil.h"
+#include "dirname.h"
+#include "virbuffer.h"
+
+#define VIR_FROM_THIS VIR_FROM_STORAGE
+
+VIR_ENUM_IMPL(virStoragePoolSourceAdapter,
I wouldn't expect a "common" function to have "Storage" in the
name...
+ VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST,
+ "default", "scsi_host", "fc_host")
+
+static void
+virStoragePoolSourceAdapterClear(virPoolSourceAdapterPtr adapter)
+{
+ if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ VIR_FREE(adapter->data.fchost.wwnn);
+ VIR_FREE(adapter->data.fchost.wwpn);
+ VIR_FREE(adapter->data.fchost.parent);
+ } else if (adapter->type ==
+ VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
+ VIR_FREE(adapter->data.scsi_host.name);
+ }
+}
Above is specific to SCSI pool...
+
+void
+virStoragePoolSourceDeviceClear(virPoolSourceDevicePtr dev)
+{
+ VIR_FREE(dev->freeExtents);
+ VIR_FREE(dev->path);
+}
+
Above is specific to DISK pool
+void
+virStoragePoolSourceClear(virPoolSourcePtr source)
+{
+ size_t i;
+
+ if (!source)
+ return;
+
+ for (i = 0; i < source->nhost; i++)
+ VIR_FREE(source->hosts[i].name);
+ VIR_FREE(source->hosts);
+
+ for (i = 0; i < source->ndevice; i++)
+ virStoragePoolSourceDeviceClear(&source->devices[i]);
+ VIR_FREE(source->devices);
+ VIR_FREE(source->dir);
+ VIR_FREE(source->name);
+ virStoragePoolSourceAdapterClear(&source->adapter);
+ VIR_FREE(source->initiator.iqn);
+ virStorageAuthDefFree(source->auth);
+ VIR_FREE(source->vendor);
+ VIR_FREE(source->product);
+}
Above would just Clear "virPoolSource" things... leaving the
virStoragePoolSource things for the storage pool code.
+
+void
+virStoragePoolSourceFree(virPoolSourcePtr source)
+{
+ virStoragePoolSourceClear(source);
+ VIR_FREE(source);
+}
I think this stays in storage pool
+
+void
+virStoragePoolDefFree(virPoolDefPtr def)
+{
I don't think we even allocate a virPoolDef - it's just a convenience
structure within a virStoragePool type. Or inconvenience of typing a
few extra characters for structure dereference.
+ if (!def)
+ return;
+
+ VIR_FREE(def->name);
+
+ virStoragePoolSourceClear(&def->source);
+
+ VIR_FREE(def->target.path);
+ VIR_FREE(def->target.perms.label);
+ VIR_FREE(def);
+}
+
+
+virPoolSourcePtr
+virStoragePoolSourceListNewSource(virPoolSourceListPtr list)
+{
+ virPoolSourcePtr source;
+
+ if (VIR_REALLOC_N(list->sources, list->nsources + 1) < 0)
+ return NULL;
+
+ source = &list->sources[list->nsources++];
+ memset(source, 0, sizeof(*source));
+
+ return source;
+}
Beyond the "virStoragePool" -> "virPool" name change - I suspect
the
above changes a bit based on my comments from the first patch.
diff --git a/src/util/virpoolcommon.h b/src/util/virpoolcommon.h
index d54de36..c1c607f 100644
--- a/src/util/virpoolcommon.h
+++ b/src/util/virpoolcommon.h
@@ -142,6 +142,15 @@ struct _virPoolSource {
int format;
};
+typedef struct _virPoolSourceList virPoolSourceList;
+typedef virPoolSourceList *virPoolSourceListPtr;
+struct _virPoolSourceList {
+ int type;
+ unsigned int nsources;
+ virPoolSourcePtr sources;
+};
+
+
The above should have been a part of the original creation of virpool.h
typedef struct _virPoolTarget virPoolTarget;
typedef virPoolTarget *virPoolTargetPtr;
struct _virPoolTarget {
@@ -163,4 +172,11 @@ struct _virPoolDef {
virPoolSource source;
virPoolTarget target;
};
+
+void virStoragePoolSourceClear(virPoolSourcePtr source);
+void virStoragePoolSourceDeviceClear(virPoolSourceDevicePtr dev);
+void virStoragePoolSourceFree(virPoolSourcePtr source);
+void virStoragePoolDefFree(virPoolDefPtr def);
+virPoolSourcePtr
+virStoragePoolSourceListNewSource(virPoolSourceListPtr list);
# endif /* __VIR_POOL_COMMON_H__ */
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 272db67..318b33d 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -3537,3 +3537,76 @@ virStorageFileCheckCompat(const char *compat)
virStringFreeList(version);
return ret;
}
+
+int
+virStorageDefParsePerms(xmlXPathContextPtr ctxt,
+ virStoragePermsPtr perms,
+ const char *permxpath)
I think this should have moved to virpool
+{
+ char *mode;
+ long long val;
+ int ret = -1;
+ xmlNodePtr relnode;
+ xmlNodePtr node;
+
+ node = virXPathNode(permxpath, ctxt);
+ if (node == NULL) {
+ perms->mode = (mode_t) -1;
+ perms->uid = (uid_t) -1;
+ perms->gid = (gid_t) -1;
+ perms->label = NULL;
+ return 0;
+ }
+
+ relnode = ctxt->node;
+ ctxt->node = node;
+
+ if ((mode = virXPathString("string(./mode)", ctxt))) {
+ int tmp;
+
+ if (virStrToLong_i(mode, NULL, 8, &tmp) < 0 || (tmp & ~0777)) {
+ VIR_FREE(mode);
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("malformed octal mode"));
+ goto error;
+ }
+ perms->mode = tmp;
+ VIR_FREE(mode);
+ } else {
+ perms->mode = (mode_t) -1;
+ }
+
+ if (virXPathNode("./owner", ctxt) == NULL) {
+ perms->uid = (uid_t) -1;
+ } else {
+ if (virXPathLongLong("number(./owner)", ctxt, &val) < 0 ||
+ ((uid_t)val != val &&
+ val != -1)) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("malformed owner element"));
+ goto error;
+ }
+
+ perms->uid = val;
+ }
+
+ if (virXPathNode("./group", ctxt) == NULL) {
+ perms->gid = (gid_t) -1;
+ } else {
+ if (virXPathLongLong("number(./group)", ctxt, &val) < 0 ||
+ ((gid_t) val != val &&
+ val != -1)) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("malformed group element"));
+ goto error;
+ }
+ perms->gid = val;
+ }
+
+ perms->label = virXPathString("string(./label)", ctxt);
+
+ ret = 0;
+ error:
+ ctxt->node = relnode;
+ return ret;
+}
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 3d09468..8021d42 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -383,4 +383,7 @@ int virStorageFileCheckCompat(const char *compat);
virStorageSourcePtr virStorageSourceNewFromBackingAbsolute(const char *path);
+int virStorageDefParsePerms(xmlXPathContextPtr ctxt,
+ virStoragePermsPtr perms,
+ const char *permxpath);
Obviously affecting this.
John
#endif /* __VIR_STORAGE_FILE_H__ */