diff mbox series

[07/10] RFC: Add get_current_snapshot_info to get the snapshot state.

Message ID 1520930033-18885-8-git-send-email-junyan.he@intel.com
State New
Headers show
Series RFC: Optimize nvdimm kind memory for snapshot. | expand

Commit Message

He, Junyan March 13, 2018, 8:33 a.m. UTC
From: Junyan He <junyan.he@intel.com>

We need to know the snapshot saving information when we do dependent
snapshot saving, e.g the name of previous snapshot. Add this global
function to query the snapshot status is usable.

Signed-off-by: Junyan He <junyan.he@intel.com>
---
 include/migration/snapshot.h |  3 +++
 migration/savevm.c           | 27 +++++++++++++++++++++++++++
 2 files changed, 30 insertions(+)
diff mbox series

Patch

diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
index c85b6ec..0b950ce 100644
--- a/include/migration/snapshot.h
+++ b/include/migration/snapshot.h
@@ -15,7 +15,10 @@ 
 #ifndef QEMU_MIGRATION_SNAPSHOT_H
 #define QEMU_MIGRATION_SNAPSHOT_H
 
+#include "block/snapshot.h"
+
 int save_snapshot(const char *name, Error **errp);
 int load_snapshot(const char *name, Error **errp);
+int get_current_snapshot_info(QEMUSnapshotInfo *sn);
 
 #endif
diff --git a/migration/savevm.c b/migration/savevm.c
index 1bbd6aa..3a9b904 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2212,6 +2212,29 @@  int qemu_loadvm_state(QEMUFile *f)
     return ret;
 }
 
+static int in_snap_saving;
+static QEMUSnapshotInfo in_snap_saving_sn;
+
+int get_current_snapshot_info(QEMUSnapshotInfo *sn)
+{
+    if (in_snap_saving && sn) {
+        memcpy(sn, &in_snap_saving_sn, sizeof(QEMUSnapshotInfo));
+    }
+
+    return in_snap_saving;
+}
+
+static void set_current_snapshot_info(QEMUSnapshotInfo *sn)
+{
+    if (sn) {
+        memcpy(&in_snap_saving_sn, sn, sizeof(QEMUSnapshotInfo));
+        in_snap_saving = 1;
+    } else {
+        memset(&in_snap_saving_sn, 0, sizeof(QEMUSnapshotInfo));
+        in_snap_saving = 0;
+    }
+}
+
 int save_snapshot(const char *name, Error **errp)
 {
     BlockDriverState *bs, *bs1;
@@ -2282,6 +2305,8 @@  int save_snapshot(const char *name, Error **errp)
         strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
     }
 
+    set_current_snapshot_info(sn);
+
     /* save the VM state */
     f = qemu_fopen_bdrv(bs, 1);
     if (!f) {
@@ -2313,6 +2338,8 @@  int save_snapshot(const char *name, Error **errp)
     ret = 0;
 
  the_end:
+    set_current_snapshot_info(NULL);
+
     if (aio_context) {
         aio_context_release(aio_context);
     }