|
|
cd9d16 |
From 5202e9d55b745eddde9ba6bd08af32fcae347e93 Mon Sep 17 00:00:00 2001
|
|
|
cd9d16 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
cd9d16 |
Date: Wed, 26 Oct 2011 11:21:50 +0200
|
|
|
cd9d16 |
Subject: [PATCH] qcow: Fix bdrv_write_compressed error handling
|
|
|
cd9d16 |
MIME-Version: 1.0
|
|
|
cd9d16 |
Content-Type: text/plain; charset=UTF-8
|
|
|
cd9d16 |
Content-Transfer-Encoding: 8bit
|
|
|
cd9d16 |
|
|
|
cd9d16 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
cd9d16 |
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
cd9d16 |
(cherry picked from commit 64ebe71aa0e498d24e8c02b133192142fce3a0d0)
|
|
|
cd9d16 |
|
|
|
cd9d16 |
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
|
|
cd9d16 |
[AF: backported]
|
|
|
cd9d16 |
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
|
cd9d16 |
---
|
|
|
cd9d16 |
block/qcow.c | 30 +++++++++++++++++++-----------
|
|
|
cd9d16 |
1 file changed, 19 insertions(+), 11 deletions(-)
|
|
|
cd9d16 |
|
|
|
cd9d16 |
diff --git a/block/qcow.c b/block/qcow.c
|
|
|
cd9d16 |
index 227b104..115b820 100644
|
|
|
cd9d16 |
--- a/block/qcow.c
|
|
|
cd9d16 |
+++ b/block/qcow.c
|
|
|
cd9d16 |
@@ -926,8 +926,6 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
|
|
|
cd9d16 |
return -EINVAL;
|
|
|
cd9d16 |
|
|
|
cd9d16 |
out_buf = qemu_malloc(s->cluster_size + (s->cluster_size / 1000) + 128);
|
|
|
cd9d16 |
- if (!out_buf)
|
|
|
cd9d16 |
- return -1;
|
|
|
cd9d16 |
|
|
|
cd9d16 |
/* best compression, small window, no zlib header */
|
|
|
cd9d16 |
memset(&strm, 0, sizeof(strm));
|
|
|
cd9d16 |
@@ -935,8 +933,8 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
|
|
|
cd9d16 |
Z_DEFLATED, -12,
|
|
|
cd9d16 |
9, Z_DEFAULT_STRATEGY);
|
|
|
cd9d16 |
if (ret != 0) {
|
|
|
cd9d16 |
- qemu_free(out_buf);
|
|
|
cd9d16 |
- return -1;
|
|
|
cd9d16 |
+ ret = -EINVAL;
|
|
|
cd9d16 |
+ goto fail;
|
|
|
cd9d16 |
}
|
|
|
cd9d16 |
|
|
|
cd9d16 |
strm.avail_in = s->cluster_size;
|
|
|
cd9d16 |
@@ -946,9 +944,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
|
|
|
cd9d16 |
|
|
|
cd9d16 |
ret = deflate(&strm, Z_FINISH);
|
|
|
cd9d16 |
if (ret != Z_STREAM_END && ret != Z_OK) {
|
|
|
cd9d16 |
- qemu_free(out_buf);
|
|
|
cd9d16 |
deflateEnd(&strm;;
|
|
|
cd9d16 |
- return -1;
|
|
|
cd9d16 |
+ ret = -EINVAL;
|
|
|
cd9d16 |
+ goto fail;
|
|
|
cd9d16 |
}
|
|
|
cd9d16 |
out_len = strm.next_out - out_buf;
|
|
|
cd9d16 |
|
|
|
cd9d16 |
@@ -956,19 +954,29 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
|
|
|
cd9d16 |
|
|
|
cd9d16 |
if (ret != Z_STREAM_END || out_len >= s->cluster_size) {
|
|
|
cd9d16 |
/* could not compress: write normal cluster */
|
|
|
cd9d16 |
- bdrv_write(bs, sector_num, buf, s->cluster_sectors);
|
|
|
cd9d16 |
+ ret = bdrv_write(bs, sector_num, buf, s->cluster_sectors);
|
|
|
cd9d16 |
+ if (ret < 0) {
|
|
|
cd9d16 |
+ goto fail;
|
|
|
cd9d16 |
+ }
|
|
|
cd9d16 |
} else {
|
|
|
cd9d16 |
cluster_offset = get_cluster_offset(bs, sector_num << 9, 2,
|
|
|
cd9d16 |
out_len, 0, 0);
|
|
|
cd9d16 |
+ if (cluster_offset == 0) {
|
|
|
cd9d16 |
+ ret = -EIO;
|
|
|
cd9d16 |
+ goto fail;
|
|
|
cd9d16 |
+ }
|
|
|
cd9d16 |
+
|
|
|
cd9d16 |
cluster_offset &= s->cluster_offset_mask;
|
|
|
cd9d16 |
- if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) {
|
|
|
cd9d16 |
- qemu_free(out_buf);
|
|
|
cd9d16 |
- return -1;
|
|
|
cd9d16 |
+ ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len);
|
|
|
cd9d16 |
+ if (ret < 0) {
|
|
|
cd9d16 |
+ goto fail;
|
|
|
cd9d16 |
}
|
|
|
cd9d16 |
}
|
|
|
cd9d16 |
|
|
|
cd9d16 |
+ ret = 0;
|
|
|
cd9d16 |
+fail:
|
|
|
cd9d16 |
qemu_free(out_buf);
|
|
|
cd9d16 |
- return 0;
|
|
|
cd9d16 |
+ return ret;
|
|
|
cd9d16 |
}
|
|
|
cd9d16 |
|
|
|
cd9d16 |
static int qcow_flush(BlockDriverState *bs)
|
|
|
cd9d16 |
--
|
|
|
cd9d16 |
1.7.11.2
|
|
|
cd9d16 |
|