https://bugzilla.redhat.com/show_bug.cgi?id=1138516
This patch introduces two generic storage_conf functions to handle
saving and deleting the volume XML to/from the stateDir.
The virStorageVolSaveStatus will format the volume XML into a file
and save the file in pool->stateDir.
The virStorageVolDeleteStatus will search for the file in the stateDir
and remove it.
These are useful for certain fields/data in the volume XML that cannot
be determined or saved along with the volume or in some meta-data for
the volume. Prior to a pool refresh operation the pool's volume list
is cleared in order to be restored during the refresh. If there were
fields that are not otherwise obtainable, the defaults will be used
which may or may not be correct.
Additionally, the libvirtd daemon reload/restart processing will be
able to make use of the saved XML data and follow the same path with
respect to regenerating the list of volumes in the pool and thus not
having the same issue.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/conf/storage_conf.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++
src/conf/storage_conf.h | 6 +++++
src/libvirt_private.syms | 2 ++
3 files changed, 65 insertions(+)
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 0901dca..9ea00e5 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1662,6 +1662,63 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
}
+int
+virStorageVolSaveStatus(virStoragePoolObjPtr pool,
+ virStorageVolDefPtr vol)
+{
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ char *xml = NULL;
+ char *statusFile = NULL;
+ int ret = -1;
+
+ if (virAsprintf(&statusFile, "%s/%s.xml", pool->stateDir,
vol->name) < 0)
+ goto cleanup;
+
+ if (!(xml = virStorageVolDefFormat(pool->def, vol))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to generate XML"));
+ goto cleanup;
+ }
+
+ virUUIDFormat(pool->def->uuid, uuidstr);
+ ret = virXMLSaveFile(statusFile,
+ virXMLPickShellSafeComment(vol->name, uuidstr),
+ "vol-edit", xml);
+ cleanup:
+ VIR_FREE(xml);
+ VIR_FREE(statusFile);
+ return ret;
+}
+
+
+int
+virStorageVolDeleteStatus(virStoragePoolObjPtr pool,
+ virStorageVolDefPtr vol)
+{
+ char *statusFile = NULL;
+ int ret = -1;
+
+ if (virAsprintf(&statusFile, "%s/%s.xml", pool->stateDir,
vol->name) < 0)
+ goto cleanup;
+
+ if (virFileExists(statusFile)) {
+ if (unlink(statusFile) < 0) {
+ virReportSystemError(errno,
+ _("cannot remove vol status file
'%s'"),
+ statusFile);
+ goto cleanup;
+ }
+ }
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(statusFile);
+
+ return ret;
+}
+
+
virStoragePoolObjPtr
virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
const unsigned char *uuid)
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 064c78c..9f25287 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -360,6 +360,12 @@ virStorageVolDefParseNode(virStoragePoolDefPtr pool,
xmlNodePtr root);
char *virStorageVolDefFormat(virStoragePoolDefPtr pool,
virStorageVolDefPtr def);
+int virStorageVolSaveStatus(virStoragePoolObjPtr pool,
+ virStorageVolDefPtr vol)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+int virStorageVolDeleteStatus(virStoragePoolObjPtr pool,
+ virStorageVolDefPtr vol)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
virStoragePoolObjPtr
virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7ceb54d..a84a293 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -784,6 +784,8 @@ virStorageVolDefFree;
virStorageVolDefParseFile;
virStorageVolDefParseNode;
virStorageVolDefParseString;
+virStorageVolDeleteStatus;
+virStorageVolSaveStatus;
virStorageVolTypeFromString;
virStorageVolTypeToString;
--
2.1.0