Index: /trunk/include/VBox/err.h
===================================================================
--- /trunk/include/VBox/err.h	(revision 23713)
+++ /trunk/include/VBox/err.h	(revision 23714)
@@ -573,27 +573,29 @@
 /** Vote for giving up.  */
 #define VERR_SSM_VOTE_FOR_GIVING_UP             (-1853)
+/** Don't call again until the final pass. */
+#define VINF_SSM_DONT_CALL_AGAIN                1854
 /** Giving up a live snapshot/migration attempt because of too many passes. */
-#define VERR_SSM_TOO_MANY_PASSES                (-1854)
+#define VERR_SSM_TOO_MANY_PASSES                (-1855)
 /** Giving up a live snapshot/migration attempt because the state grew to
  * big. */
-#define VERR_SSM_STATE_GREW_TOO_BIG             (-1855)
+#define VERR_SSM_STATE_GREW_TOO_BIG             (-1856)
 /** Giving up a live snapshot attempt because we're low on disk space.  */
-#define VERR_SSM_LOW_ON_DISK_SPACE              (-1856)
+#define VERR_SSM_LOW_ON_DISK_SPACE              (-1857)
 /** The operation was cancelled. */
-#define VERR_SSM_CANCELLED                      (-1857)
+#define VERR_SSM_CANCELLED                      (-1858)
 /** Nothing that can be cancelled.  */
-#define VERR_SSM_NO_PENDING_OPERATION           (-1858)
+#define VERR_SSM_NO_PENDING_OPERATION           (-1859)
 /** The operation has already been cancelled. */
-#define VERR_SSM_ALREADY_CANCELLED              (-1859)
+#define VERR_SSM_ALREADY_CANCELLED              (-1860)
 /** The machine was powered off while saving. */
-#define VERR_SSM_LIVE_POWERED_OFF               (-1860)
+#define VERR_SSM_LIVE_POWERED_OFF               (-1861)
 /** The live snapshot/migration operation was aborted because of a guru
  *  meditation. */
-#define VERR_SSM_LIVE_GURU_MEDITATION           (-1861)
+#define VERR_SSM_LIVE_GURU_MEDITATION           (-1862)
 /** The live snapshot/migration operation was aborted because of a fatal runtime
  *  error. */
-#define VERR_SSM_LIVE_FATAL_ERROR               (-1862)
+#define VERR_SSM_LIVE_FATAL_ERROR               (-1863)
 /** The VM was suspended while saving, don't resume execution. */
-#define VINF_SSM_LIVE_SUSPENDED                  1863
+#define VINF_SSM_LIVE_SUSPENDED                  1864
 /** @} */
 
Index: /trunk/include/VBox/err.mac
===================================================================
--- /trunk/include/VBox/err.mac	(revision 23713)
+++ /trunk/include/VBox/err.mac	(revision 23714)
@@ -193,15 +193,17 @@
 %define VERR_SSM_GCPTR_OVERFLOW    (-1850)
 %define VINF_SSM_VOTE_FOR_ANOTHER_PASS    1851
-%define VERR_SSM_VOTE_FOR_GIVING_UP    (-1852)
-%define VERR_SSM_TOO_MANY_PASSES    (-1853)
-%define VERR_SSM_STATE_GREW_TOO_BIG    (-1854)
-%define VERR_SSM_LOW_ON_DISK_SPACE    (-1855)
-%define VERR_SSM_CANCELLED    (-1856)
-%define VERR_SSM_NO_PENDING_OPERATION    (-1857)
-%define VERR_SSM_ALREADY_CANCELLED    (-1858)
-%define VERR_SSM_LIVE_POWERED_OFF    (-1859)
-%define VERR_SSM_LIVE_GURU_MEDITATION    (-1860)
-%define VERR_SSM_LIVE_FATAL_ERROR    (-1861)
-%define VINF_SSM_LIVE_SUSPENDED    1862
+%define VINF_SSM_VOTE_DONE_DONT_CALL_AGAIN    1852
+%define VERR_SSM_VOTE_FOR_GIVING_UP    (-1853)
+%define VINF_SSM_DONT_CALL_AGAIN    1854
+%define VERR_SSM_TOO_MANY_PASSES    (-1855)
+%define VERR_SSM_STATE_GREW_TOO_BIG    (-1856)
+%define VERR_SSM_LOW_ON_DISK_SPACE    (-1857)
+%define VERR_SSM_CANCELLED    (-1858)
+%define VERR_SSM_NO_PENDING_OPERATION    (-1859)
+%define VERR_SSM_ALREADY_CANCELLED    (-1860)
+%define VERR_SSM_LIVE_POWERED_OFF    (-1861)
+%define VERR_SSM_LIVE_GURU_MEDITATION    (-1862)
+%define VERR_SSM_LIVE_FATAL_ERROR    (-1863)
+%define VINF_SSM_LIVE_SUSPENDED    1864
 %define VERR_VM_ATRESET_NOT_FOUND    (-1900)
 %define VERR_VM_REQUEST_INVALID_TYPE    (-1901)
Index: /trunk/src/VBox/VMM/SSM.cpp
===================================================================
--- /trunk/src/VBox/VMM/SSM.cpp	(revision 23713)
+++ /trunk/src/VBox/VMM/SSM.cpp	(revision 23714)
@@ -899,6 +899,12 @@
 {
     if (uPass == 0)
-        return ssmR3SelfSaveExec(pVM, pSSM);
-    return VINF_SUCCESS;
+    {
+        int rc = ssmR3SelfSaveExec(pVM, pSSM);
+        if (RT_SUCCESS(rc))
+            rc = VINF_SSM_DONT_CALL_AGAIN;
+        return rc;
+    }
+    AssertFailed();
+    return VERR_INTERNAL_ERROR_3;
 }
 
@@ -4408,5 +4414,9 @@
             pSSM->rc = rc;
         else
+        {
+            if (rc == VINF_SSM_DONT_CALL_AGAIN)
+                pUnit->fDoneLive = true;
             rc = ssmR3DataFlushBuffer(pSSM); /* will return SSMHANDLE::rc if it is set */
+        }
         if (RT_FAILURE(rc))
         {
