From patchwork Tue Dec 1 23:38:34 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 39937 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7DB281007D4 for ; Wed, 2 Dec 2009 10:39:21 +1100 (EST) Received: from localhost ([127.0.0.1]:37737 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFcJS-00072F-Kq for incoming@patchwork.ozlabs.org; Tue, 01 Dec 2009 18:39:18 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFcIw-000720-Tu for qemu-devel@nongnu.org; Tue, 01 Dec 2009 18:38:46 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFcIr-0006zS-Th for qemu-devel@nongnu.org; Tue, 01 Dec 2009 18:38:46 -0500 Received: from [199.232.76.173] (port=48157 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFcIr-0006zJ-Pb for qemu-devel@nongnu.org; Tue, 01 Dec 2009 18:38:41 -0500 Received: from fmmailgate03.web.de ([217.72.192.234]:42386) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFcIr-0008JG-7o for qemu-devel@nongnu.org; Tue, 01 Dec 2009 18:38:41 -0500 Received: from smtp08.web.de (fmsmtp08.dlan.cinetic.de [172.20.5.216]) by fmmailgate03.web.de (Postfix) with ESMTP id D427713605184; Wed, 2 Dec 2009 00:38:39 +0100 (CET) Received: from [88.65.43.185] (helo=[192.168.1.10]) by smtp08.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #314) id 1NFcIp-00028r-00; Wed, 02 Dec 2009 00:38:39 +0100 Message-ID: <4B15A8FA.5080804@web.de> Date: Wed, 02 Dec 2009 00:38:34 +0100 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: Anthony Liguori X-Enigmail-Version: 0.95.7 X-Sender: jan.kiszka@web.de X-Provags-ID: V01U2FsdGVkX1+O4XKTHMQXa3cA5h3rJ2mi4ssHxlF+qcJECPi/ VQJUAfBbW1hjiFlWxVVkzInXlZgfS67G0DcWDRxb5xQ5TXn+oi OrhDHuPsc= X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.4-2.6 Cc: Pierre Riteau , qemu-devel , Liran Schour , Juan Quintela Subject: [Qemu-devel] [PATCH] vmstate: Avoid seeking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 Acked-by: Ryan Harper --- hw/virtio-net.c | 7 ++----- savevm.c | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 2f147e5..9ccd4c8 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -745,12 +745,9 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) if (version_id >= 5) { n->mac_table.in_use = qemu_get_be32(f); + qemu_get_buffer(f, n->mac_table.macs, n->mac_table.in_use * ETH_ALEN); /* MAC_TABLE_ENTRIES may be different from the saved image */ - if (n->mac_table.in_use <= MAC_TABLE_ENTRIES) { - qemu_get_buffer(f, n->mac_table.macs, - n->mac_table.in_use * ETH_ALEN); - } else if (n->mac_table.in_use) { - qemu_fseek(f, n->mac_table.in_use * ETH_ALEN, SEEK_CUR); + if (n->mac_table.in_use > MAC_TABLE_ENTRIES) { n->mac_table.multi_overflow = n->mac_table.uni_overflow = 1; n->mac_table.in_use = 0; } diff --git a/savevm.c b/savevm.c index 8fe9349..1e54a42 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); + 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 = {