qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [5985] Fix handling of disk-only snapshots (Kevin Wolf)
Date: Thu, 11 Dec 2008 21:06:49 +0000	[thread overview]
Message-ID: <E1LAskD-0008VZ-HW@cvs.savannah.gnu.org> (raw)

Revision: 5985
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5985
Author:   aliguori
Date:     2008-12-11 21:06:49 +0000 (Thu, 11 Dec 2008)

Log Message:
-----------
Fix handling of disk-only snapshots (Kevin Wolf)

When creating a snapshot with multiple qcow2 disks attached, the current
behaviour is that qemu creates a disk snapshot on all of them and
chooses one to write the VM state to.

Despite having the state only in one image, loadvm tries to restore the
VM state from the middle of nowhere if you run qemu a second time with
only one of the other images attached. In the lucky case it will fail
because there simply is no state, but it also can happen that it loads
the state of a different snapshot (the one this new one is based upon).

The fix is to write a zero VM state size to the images which don't
contain the state, and check this in loadvm.

I agree that you probably have to provoke such things intentionally to
get in a state like this with qemu itself. However, with my second patch
that adds snapshot support to qemu-img it could become a reasonable use
case to have snapshots with and without VM states on the same image.

Signed-off-by: Kevin Wolf <kwolf@suse.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

Modified Paths:
--------------
    trunk/savevm.c

Modified: trunk/savevm.c
===================================================================
--- trunk/savevm.c	2008-12-11 21:03:10 UTC (rev 5984)
+++ trunk/savevm.c	2008-12-11 21:06:49 UTC (rev 5985)
@@ -1020,6 +1020,7 @@
     BlockDriverInfo bdi1, *bdi = &bdi1;
     QEMUFile *f;
     int saved_vm_running;
+    uint32_t vm_state_size;
 #ifdef _WIN32
     struct _timeb tb;
 #else
@@ -1079,7 +1080,7 @@
         goto the_end;
     }
     ret = qemu_savevm_state(f);
-    sn->vm_state_size = qemu_ftell(f);
+    vm_state_size = qemu_ftell(f);
     qemu_fclose(f);
     if (ret < 0) {
         term_printf("Error %d while writing VM\n", ret);
@@ -1098,6 +1099,8 @@
                                 bdrv_get_device_name(bs1));
                 }
             }
+            /* Write VM state size only to the image that contains the state */
+            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
             ret = bdrv_snapshot_create(bs1, sn);
             if (ret < 0) {
                 term_printf("Error while creating snapshot on '%s'\n",
@@ -1115,6 +1118,7 @@
 {
     BlockDriverState *bs, *bs1;
     BlockDriverInfo bdi1, *bdi = &bdi1;
+    QEMUSnapshotInfo sn;
     QEMUFile *f;
     int i, ret;
     int saved_vm_running;
@@ -1165,6 +1169,11 @@
         return;
     }
 
+    /* Don't even try to load empty VM states */
+    ret = bdrv_snapshot_find(bs, &sn, name);
+    if ((ret >= 0) && (sn.vm_state_size == 0))
+        goto the_end;
+
     /* restore the VM state */
     f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
     if (!f) {

                 reply	other threads:[~2008-12-11 21:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1LAskD-0008VZ-HW@cvs.savannah.gnu.org \
    --to=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).