[libvirt] [PATCHv4 2/4] snapshot: Add flag VIR_DOMAIN_SNAPSHOT_REVERT_STOPPED

Peter Krempa pkrempa at redhat.com
Mon Nov 19 16:06:10 UTC 2012


The current snapshot reverting api supported changing the state of the
machine after the snapshot was reverted to either started or paused.

This patch adds the ability to revert the state but to stopped state.
---
Fixed comment regarding use of this flag on transient domains.
---
 include/libvirt/libvirt.h.in |  1 +
 src/libvirt.c                | 31 ++++++++++++++++---------------
 tools/virsh-snapshot.c       |  3 +++
 tools/virsh.pod              | 15 +++++++++------
 4 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 49a361a..d3ee588 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -3875,6 +3875,7 @@ typedef enum {
     VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING = 1 << 0, /* Run after revert */
     VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED  = 1 << 1, /* Pause after revert */
     VIR_DOMAIN_SNAPSHOT_REVERT_FORCE   = 1 << 2, /* Allow risky reverts */
+    VIR_DOMAIN_SNAPSHOT_REVERT_STOPPED = 1 << 3, /* Revert into stopped state */
 } virDomainSnapshotRevertFlags;

 /* Revert the domain to a point-in-time snapshot.  The
diff --git a/src/libvirt.c b/src/libvirt.c
index bdb1dc6..1e04d27 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -18638,17 +18638,17 @@ error:
  *
  * Revert the domain to a given snapshot.
  *
- * Normally, the domain will revert to the same state the domain was
- * in while the snapshot was taken (whether inactive, running, or
- * paused), except that disk snapshots default to reverting to
- * inactive state.  Including VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING in
- * @flags overrides the snapshot state to guarantee a running domain
- * after the revert; or including VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED in
- * @flags guarantees a paused domain after the revert.  These two
- * flags are mutually exclusive.  While a persistent domain does not
- * need either flag, it is not possible to revert a transient domain
- * into an inactive state, so transient domains require the use of one
- * of these two flags.
+ * Normally, the domain will revert to the same state the domain was in while
+ * the snapshot was taken (whether inactive, running, or paused), except that
+ * disk snapshots default to reverting to inactive state.  Including
+ * VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING in @flags overrides the snapshot state to
+ * guarantee a running domain after the revert; or including
+ * VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED in @flags guarantees a paused domain after
+ * the revert. With VIR_DOMAIN_SNAPSHOT_REVERT_STOPPED contained in the flags
+ * the domain's memory state is not restored. These three flags are mutually
+ * exclusive. While a persistent domain does not need any of these flags,
+ * it is not possible to revert a transient domain into an inactive state,
+ * so transient domains require the use of either the running or paused flag.
  *
  * Reverting to any snapshot discards all configuration changes made since
  * the last snapshot.  Additionally, reverting to a snapshot from a running
@@ -18697,11 +18697,12 @@ virDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
         goto error;
     }

-    if ((flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) &&
-        (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
+    if ((!!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) +
+         !!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)  +
+         !!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_STOPPED)) > 1) {
         virReportInvalidArg(flags,
-                            _("running and paused flags in %s are mutually exclusive"),
-                            __FUNCTION__);
+                            _("running, paused and stopped flags in %s are "
+                              "mutually exclusive"), __FUNCTION__);
         goto error;
     }

diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c
index 0bd9583..57d2baf 100644
--- a/tools/virsh-snapshot.c
+++ b/tools/virsh-snapshot.c
@@ -1517,6 +1517,7 @@ static const vshCmdOptDef opts_snapshot_revert[] = {
     {"current", VSH_OT_BOOL, 0, N_("revert to current snapshot")},
     {"running", VSH_OT_BOOL, 0, N_("after reverting, change state to running")},
     {"paused", VSH_OT_BOOL, 0, N_("after reverting, change state to paused")},
+    {"stopped", VSH_OT_BOOL, 0, N_("after reverting, change state to stopped")},
     {"force", VSH_OT_BOOL, 0, N_("try harder on risky reverts")},
     {NULL, 0, 0, NULL}
 };
@@ -1536,6 +1537,8 @@ cmdDomainSnapshotRevert(vshControl *ctl, const vshCmd *cmd)
         flags |= VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING;
     if (vshCommandOptBool(cmd, "paused"))
         flags |= VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED;
+    if (vshCommandOptBool(cmd, "stopped"))
+        flags |= VIR_DOMAIN_SNAPSHOT_REVERT_STOPPED;
     /* We want virsh snapshot-revert --force to work even when talking
      * to older servers that did the unsafe revert by default but
      * reject the flag, so we probe without the flag, and only use it
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 29be39e..e940c5f 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -2810,7 +2810,7 @@ Output the name of the parent snapshot, if any, for the given
 I<snapshot>, or for the current snapshot with I<--current>.

 =item B<snapshot-revert> I<domain> {I<snapshot> | I<--current>}
-[{I<--running> | I<--paused>}] [I<--force>]
+[{I<--running> | I<--paused> | I<--stopped>}] [I<--force>]

 Revert the given domain to the snapshot specified by I<snapshot>, or to
 the current snapshot with I<--current>.  Be aware
@@ -2821,11 +2821,14 @@ the original snapshot was taken.

 Normally, reverting to a snapshot leaves the domain in the state it was
 at the time the snapshot was created, except that a disk snapshot with
-no vm state leaves the domain in an inactive state.  Passing either the
-I<--running> or I<--paused> flag will perform additional state changes
-(such as booting an inactive domain, or pausing a running domain).  Since
-transient domains cannot be inactive, it is required to use one of these
-flags when reverting to a disk snapshot of a transient domain.
+no vm state leaves the domain in an inactive state.  Passing one of the
+I<--running>, I<--paused> or I<--stopped> flag will perform additional
+state changes such as booting an inactive domain, pausing a running domain
+or shutting the domain down after the snapshot is reverted.  Since
+transient domains cannot be inactive, it is required to use one of
+I<--running> or I<--paused> flags when reverting to a disk snapshot of a
+transient domain. The I<--stopped> flag cannot be used on snapshots
+of transient domains.

 There are two cases where a snapshot revert involves extra risk, which
 requires the use of I<--force> to proceed.  One is the case of a
-- 
1.8.0




More information about the libvir-list mailing list