summaryrefslogtreecommitdiff
path: root/monitor.c
diff options
context:
space:
mode:
authorMiguel Di Ciurcio Filho <miguel.filho@gmail.com>2010-07-19 15:25:01 -0300
committerKevin Wolf <kwolf@redhat.com>2010-08-03 15:57:22 +0200
commit1a215ff97ea86cb9b66d9d4221c4126be9e22d46 (patch)
tree8ee47ca89af222dbd03cb1d24458aad9cf981aab /monitor.c
parent579a00e6f8688be834a2dc3cdcb3a9473d3331dd (diff)
downloadqemu-1a215ff97ea86cb9b66d9d4221c4126be9e22d46.tar.gz
qemu-1a215ff97ea86cb9b66d9d4221c4126be9e22d46.tar.bz2
qemu-1a215ff97ea86cb9b66d9d4221c4126be9e22d46.zip
loadvm: improve tests before bdrv_snapshot_goto()
This patch improves the resilience of the load_vmstate() function, doing further and better ordered tests. In load_vmstate(), if there is any error on bdrv_snapshot_goto(), except if the error is on VM state device, load_vmstate() will return zero and the VM will be started with major corruption chances. The current process: - test if there is any writable device without snapshot support - if exists return -error - get the device that saves the VM state, possible return -error but unlikely because it was tested earlier - flush I/O - run bdrv_snapshot_goto() on devices - if fails, give an warning and goes to the next (not good!) - if fails on the VM state device, return zero (not good!) - check if the requested snapshot exists on the device that saves the VM state and the state is not zero - if fails return -error - open the file with the VM state - if fails return -error - load the VM state - if fails return -error - return zero New behavior: - get the device that saves the VM state - if fails return -error - check if the requested snapshot exists on the device that saves the VM state and the state is not zero - if fails return -error - test if there is any writable device without snapshot support - if exists return -error - test if the devices with snapshot support have the requested snapshot - if anyone fails, return -error - flush I/O - run snapshot_goto() on devices - if anyone fails, return -error - open the file with the VM state - if fails return -error - load the VM state - if fails return -error - return zero do_loadvm must not call vm_start if any error has occurred in load_vmstate. Signed-off-by: Miguel Di Ciurcio Filho <miguel.filho@gmail.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'monitor.c')
-rw-r--r--monitor.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/monitor.c b/monitor.c
index 5366c36525..c313d5ac14 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2274,8 +2274,9 @@ static void do_loadvm(Monitor *mon, const QDict *qdict)
vm_stop(0);
- if (load_vmstate(name) >= 0 && saved_vm_running)
+ if (load_vmstate(name) == 0 && saved_vm_running) {
vm_start();
+ }
}
int monitor_get_fd(Monitor *mon, const char *fdname)