| From 35538bdb46122fdf90ca869df29869b8aeaefa09 Mon Sep 17 00:00:00 2001 |
| From: Stefan Hajnoczi <stefanha@redhat.com> |
| Date: Tue, 25 Mar 2014 14:23:42 +0100 |
| Subject: [PATCH 35/49] dmg: drop broken bdrv_pread() loop |
| |
| RH-Author: Kevin Wolf <kwolf@redhat.com> |
| Message-id: <1395753835-7591-36-git-send-email-kwolf@redhat.com> |
| Patchwork-id: n/a |
| O-Subject: [virt-devel] [EMBARGOED RHEL-7.0 qemu-kvm PATCH 35/48] dmg: drop broken bdrv_pread() loop |
| Bugzilla: 1066691 |
| RH-Acked-by: Jeff Cody <jcody@redhat.com> |
| RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com> |
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> |
| |
| From: Stefan Hajnoczi <stefanha@redhat.com> |
| |
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1066691 |
| Upstream status: Series embargoed |
| |
| It is not necessary to check errno for EINTR and the block layer does |
| not produce short reads. Therefore we can drop the loop that attempts |
| to read a compressed chunk. |
| |
| The loop is buggy because it incorrectly adds the transferred bytes |
| twice: |
| |
| do { |
| ret = bdrv_pread(...); |
| i += ret; |
| } while (ret >= 0 && ret + i < s->lengths[chunk]); |
| |
| Luckily we can drop the loop completely and perform a single |
| bdrv_pread(). |
| |
| Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| |
| block/dmg.c | 15 ++------------- |
| 1 files changed, 2 insertions(+), 13 deletions(-) |
| |
| diff --git a/block/dmg.c b/block/dmg.c |
| index f4f3e8e..1cc5426 100644 |
| |
| |
| @@ -298,21 +298,10 @@ static inline int dmg_read_chunk(BlockDriverState *bs, int sector_num) |
| s->current_chunk = s->n_chunks; |
| switch (s->types[chunk]) { |
| case 0x80000005: { /* zlib compressed */ |
| - int i; |
| - |
| /* we need to buffer, because only the chunk as whole can be |
| * inflated. */ |
| - i = 0; |
| - do { |
| - ret = bdrv_pread(bs->file, s->offsets[chunk] + i, |
| - s->compressed_chunk + i, |
| - s->lengths[chunk] - i); |
| - if (ret < 0 && errno == EINTR) { |
| - ret = 0; |
| - } |
| - i += ret; |
| - } while (ret >= 0 && ret + i < s->lengths[chunk]); |
| - |
| + ret = bdrv_pread(bs->file, s->offsets[chunk], |
| + s->compressed_chunk, s->lengths[chunk]); |
| if (ret != s->lengths[chunk]) { |
| return -1; |
| } |
| -- |
| 1.7.1 |
| |