From 21174c34b6b9ace9ad82e0deb13be752d28a5907 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Wed, 2 Dec 2009 12:36:35 +0100 Subject: [PATCH] vmstate: Avoid seeking Seeking on vmstate save/load does not work if the underlying file is a stream. We could try to make all QEMUFile* forward-seek-aware, but first attempts in this direction indicated that it's saner to convert the few qemu_fseek-on-vmstates users to plain reads/writes. This fixes various subtle vmstate corruptions where unused fields were involved. Signed-off-by: Jan Kiszka Signed-off-by: Juan Quintela Signed-off-by: Anthony Liguori --- savevm.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/savevm.c b/savevm.c index d6da050f36..55a2763f0f 100644 --- a/savevm.c +++ b/savevm.c @@ -959,13 +959,27 @@ const VMStateInfo vmstate_info_buffer = { static int get_unused_buffer(QEMUFile *f, void *pv, size_t size) { - qemu_fseek(f, size, SEEK_CUR); - return 0; + uint8_t buf[1024]; + int block_len; + + while (size > 0) { + block_len = MIN(sizeof(buf), size); + size -= block_len; + qemu_get_buffer(f, buf, block_len); + } + return 0; } static void put_unused_buffer(QEMUFile *f, void *pv, size_t size) { - qemu_fseek(f, size, SEEK_CUR); + static const uint8_t buf[1024]; + int block_len; + + while (size > 0) { + block_len = MIN(sizeof(buf), size); + size -= block_len; + qemu_put_buffer(f, buf, block_len); + } } const VMStateInfo vmstate_info_unused_buffer = {