From ea918b11970fea767085ce6e13cf0fcdc43b8c71 Mon Sep 17 00:00:00 2001 From: Juan Quintela <quintela@redhat.com> Date: Thu, 31 Dec 2009 03:02:42 -0200 Subject: [PATCH 1/4] fix barriers support during migration RH-Author: Juan Quintela <quintela@redhat.com> Message-id: <1262228562-446-1-git-send-email-quintela@redhat.com> Patchwork-id: 6029 O-Subject: [PATCH] fix barriers support during migration Bugzilla: 549938 RH-Acked-by: Marcelo Tosatti <mtosatti@redhat.com> RH-Acked-by: Glauber Costa <glommer@redhat.com> RH-Acked-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> --- qemu/hw/ide.c | 21 ++++++++++++++------- qemu/hw/virtio-blk.c | 16 +++++++++++----- 2 files changed, 25 insertions(+), 12 deletions(-) Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- qemu/hw/ide.c | 21 ++++++++++++++------- qemu/hw/virtio-blk.c | 16 +++++++++++----- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/qemu/hw/ide.c b/qemu/hw/ide.c index 5c7cfca..44f3526 100644 --- a/qemu/hw/ide.c +++ b/qemu/hw/ide.c @@ -2869,14 +2869,21 @@ static void ide_save(QEMUFile* f, IDEState *s, int version_id) qemu_put_8s(f, &s->sense_key); qemu_put_8s(f, &s->asc); /* XXX: if a transfer is pending, we do not save it yet */ - if (version_id > 4) { - qemu_get_8s(f, &s->bs->enable_write_cache); + if (version_id > 3) { + uint8_t write_cache = 0; + if (s->bs) { + write_cache = s->bs->enable_write_cache; + } + /* should we advertise barriers? */ + qemu_put_8s(f, &write_cache); } } /* load per IDE drive data */ static void ide_load(QEMUFile* f, IDEState *s, int version_id) { + uint8_t write_cache = 0; + s->mult_sectors=qemu_get_be32(f); s->identify_set=qemu_get_be32(f); if (s->identify_set) { @@ -2900,11 +2907,11 @@ static void ide_load(QEMUFile* f, IDEState *s, int version_id) qemu_get_8s(f, &s->sense_key); qemu_get_8s(f, &s->asc); /* XXX: if a transfer is pending, we do not save it yet */ - if (version_id > 4) { - /* should we advertise barriers? */ - qemu_put_8s(f, &s->bs->enable_write_cache); - } else { - s->bs->enable_write_cache = 0; + if (version_id > 3) { + qemu_get_8s(f, &write_cache); + } + if (s->bs) { + s->bs->enable_write_cache = write_cache; } } diff --git a/qemu/hw/virtio-blk.c b/qemu/hw/virtio-blk.c index 720243d..1737585 100644 --- a/qemu/hw/virtio-blk.c +++ b/qemu/hw/virtio-blk.c @@ -328,14 +328,19 @@ static void virtio_blk_save(QEMUFile *f, void *opaque, int version_id) } qemu_put_sbyte(f, 0); if (version_id > 2) { + uint8_t write_cache = 0; + if (s->bs) { + write_cache = s->bs->enable_write_cache; + } /* should we advertise barriers? */ - qemu_put_8s(f, &s->bs->enable_write_cache); + qemu_put_8s(f, &write_cache); } } static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id) { VirtIOBlock *s = opaque; + uint8_t write_cache = 0; if (version_id < 2 || version_id > 3) return -EINVAL; @@ -348,9 +353,10 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id) s->rq = req->next; } if (version_id > 2) { - qemu_get_8s(f, &s->bs->enable_write_cache); - } else { - s->bs->enable_write_cache = 0; + qemu_get_8s(f, &write_cache); + } + if (s->bs) { + s->bs->enable_write_cache = write_cache; } return 0; @@ -385,7 +391,7 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output); qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s); - if (version_id < 3) { + if (version_id < 3 && s->bs) { s->bs->enable_write_cache = 0; } register_savevm("virtio-blk", virtio_blk_id++, version_id, -- 1.6.3.rc4.29.g8146