Skip to content

Commit

Permalink
cpus: Let vm_stop[_force_state]() always flush block devices
Browse files Browse the repository at this point in the history
Even if the VM is already stopped, we cannot assume that all data has
already been successfully flushed to disk. The flush during the previous
vm_stop() could have failed.

Run bdrv_flush_all() unconditionally so that we get an error each time
if the block device isn't really flushed.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
kevmw authored and stefanhaRH committed Jul 19, 2013
1 parent 323004a commit 594a45c
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions cpus.c
Expand Up @@ -443,11 +443,12 @@ static int do_vm_stop(RunState state)
pause_all_vcpus();
runstate_set(state);
vm_state_notify(0, state);
bdrv_drain_all();
ret = bdrv_flush_all();
monitor_protocol_event(QEVENT_STOP, NULL);
}

bdrv_drain_all();
ret = bdrv_flush_all();

return ret;
}

Expand Down Expand Up @@ -1126,7 +1127,9 @@ int vm_stop_force_state(RunState state)
return vm_stop(state);
} else {
runstate_set(state);
return 0;
/* Make sure to return an error if the flush in a previous vm_stop()
* failed. */
return bdrv_flush_all();
}
}

Expand Down

0 comments on commit 594a45c

Please sign in to comment.