]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: checkpoint: Split virDomainCheckpointRedefinePrep into two functions
authorPeter Krempa <pkrempa@redhat.com>
Wed, 4 Nov 2020 09:10:56 +0000 (10:10 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 9 Nov 2020 11:25:50 +0000 (12:25 +0100)
First one prepares and validates the definition, the second one actually
either updates an existing checkpoint or assigns definition for the new
one.

This will allow driver code to add extra validation between those
steps.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/checkpoint_conf.c
src/conf/checkpoint_conf.h
src/libvirt_private.syms
src/qemu/qemu_checkpoint.c
src/test/test_driver.c

index e175917eae9d9fd4956c02900614def5229d4b77..a8d18928debd09926131b01982372414bd45a52b 100644 (file)
@@ -513,16 +513,11 @@ virDomainCheckpointDefFormat(virDomainCheckpointDefPtr def,
 
 int
 virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
-                                virDomainCheckpointDefPtr *defptr,
-                                virDomainMomentObjPtr *chk,
-                                virDomainXMLOptionPtr xmlopt,
+                                virDomainCheckpointDefPtr def,
                                 bool *update_current)
 {
-    virDomainCheckpointDefPtr def = *defptr;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     virDomainMomentObjPtr parent = NULL;
-    virDomainMomentObjPtr other = NULL;
-    virDomainCheckpointDefPtr otherdef = NULL;
 
     virUUIDFormat(vm->def->uuid, uuidstr);
 
@@ -550,12 +545,26 @@ virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
     if (virDomainCheckpointGetCurrent(vm->checkpoints) == NULL)
         *update_current = true;
 
+    return 0;
+}
+
+
+virDomainMomentObjPtr
+virDomainCheckpointRedefineCommit(virDomainObjPtr vm,
+                                  virDomainCheckpointDefPtr *defptr,
+                                  virDomainXMLOptionPtr xmlopt)
+{
+    virDomainCheckpointDefPtr def = *defptr;
+    virDomainMomentObjPtr other = NULL;
+    virDomainCheckpointDefPtr otherdef = NULL;
+    virDomainMomentObjPtr chk = NULL;
+
     other = virDomainCheckpointFindByName(vm->checkpoints, def->parent.name);
     if (other) {
         otherdef = virDomainCheckpointObjGetDef(other);
         if (!virDomainDefCheckABIStability(otherdef->parent.dom,
                                            def->parent.dom, xmlopt))
-            return -1;
+            return NULL;
 
         /* Drop and rebuild the parent relationship, but keep all
          * child relations by reusing chk.  */
@@ -563,8 +572,11 @@ virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
         virObjectUnref(otherdef);
         other->def = &(*defptr)->parent;
         *defptr = NULL;
-        *chk = other;
+        chk = other;
+    } else {
+        chk = virDomainCheckpointAssignDef(vm->checkpoints, def);
+        *defptr = NULL;
     }
 
-    return 0;
+    return chk;
 }
index f115b98c2bb7405977b7bb7b9a2264e505746060..631f863151416605555aedf19eaf9b99c384db7e 100644 (file)
@@ -90,10 +90,14 @@ virDomainCheckpointDefFormat(virDomainCheckpointDefPtr def,
 int
 virDomainCheckpointAlignDisks(virDomainCheckpointDefPtr checkpoint);
 
-int virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
-                                    virDomainCheckpointDefPtr *def,
-                                    virDomainMomentObjPtr *checkpoint,
-                                    virDomainXMLOptionPtr xmlopt,
-                                    bool *update_current);
+int
+virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
+                                virDomainCheckpointDefPtr def,
+                                bool *update_current);
+
+virDomainMomentObjPtr
+virDomainCheckpointRedefineCommit(virDomainObjPtr vm,
+                                  virDomainCheckpointDefPtr *defptr,
+                                  virDomainXMLOptionPtr xmlopt);
 
 VIR_ENUM_DECL(virDomainCheckpoint);
index 279d8fe619166b64a607bbcf8661993cd59ab0be..ddddc8f2d1f646a597c986e27abce4ec10344935 100644 (file)
@@ -86,6 +86,7 @@ virDomainCheckpointDefFormat;
 virDomainCheckpointDefNew;
 virDomainCheckpointDefParseString;
 virDomainCheckpointFormatConvertXMLFlags;
+virDomainCheckpointRedefineCommit;
 virDomainCheckpointRedefinePrep;
 virDomainCheckpointTypeFromString;
 virDomainCheckpointTypeToString;
index 050d78140a3cec66a1366318c10af31fdcb8255b..48bcc775e4990a73aacb73741fda6da6430c5112 100644 (file)
@@ -377,22 +377,14 @@ qemuCheckpointRedefine(virQEMUDriverPtr driver,
                        virDomainCheckpointDefPtr *def,
                        bool *update_current)
 {
-    virDomainMomentObjPtr chk = NULL;
-
-    if (virDomainCheckpointRedefinePrep(vm, def, &chk, driver->xmlopt,
-                                        update_current) < 0)
+    if (virDomainCheckpointRedefinePrep(vm, *def, update_current) < 0)
         return NULL;
 
     /* XXX Should we validate that the redefined checkpoint even
      * makes sense, such as checking that qemu-img recognizes the
      * checkpoint bitmap name in at least one of the domain's disks?  */
 
-    if (chk)
-        return chk;
-
-    chk = virDomainCheckpointAssignDef(vm->checkpoints, *def);
-    *def = NULL;
-    return chk;
+    return virDomainCheckpointRedefineCommit(vm, def, driver->xmlopt);
 }
 
 
index 5c02a8ebb077c72114dccd217d45f1c64f69c947..cd502781e17438717e96b5cf05b3b6ece78e663f 100644 (file)
@@ -8989,9 +8989,10 @@ testDomainCheckpointCreateXML(virDomainPtr domain,
         goto cleanup;
 
     if (redefine) {
-        if (virDomainCheckpointRedefinePrep(vm, &def, &chk,
-                                            privconn->xmlopt,
-                                            &update_current) < 0)
+        if (virDomainCheckpointRedefinePrep(vm, def, &update_current) < 0)
+            goto cleanup;
+
+        if (!(chk = virDomainCheckpointRedefineCommit(vm, &def, privconn->xmlopt)))
             goto cleanup;
     } else {
         if (!(def->parent.dom = virDomainDefCopy(vm->def,
@@ -9002,9 +9003,7 @@ testDomainCheckpointCreateXML(virDomainPtr domain,
 
         if (virDomainCheckpointAlignDisks(def) < 0)
             goto cleanup;
-    }
 
-    if (!chk) {
         if (!(chk = virDomainCheckpointAssignDef(vm->checkpoints, def)))
             goto cleanup;