* Re: [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling
@ 2011-10-19 5:52 Dong Xu Wang
2011-10-19 7:32 ` [Qemu-devel] [PATCH v2 " Kevin Wolf
0 siblings, 1 reply; 4+ messages in thread
From: Dong Xu Wang @ 2011-10-19 5:52 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-devel
On Tue, Oct 18, 2011 at 11:47 PM, Kevin Wolf <kwolf@redhat.com> wrote:
> If during allocation of compressed clusters the cluster was already
allocated
> uncompressed, fail and properly release the l2_table (the latter avoids a
> failed assertion).
>
> While at it, make it return some real error numbers instead of -1.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/qcow2-cluster.c | 6 ++++--
> block/qcow2.c | 11 ++++++-----
> 2 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
> index 2f76311..f4e049f 100644
> --- a/block/qcow2-cluster.c
> +++ b/block/qcow2-cluster.c
> @@ -568,8 +568,10 @@ uint64_t
qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
> }
>
> cluster_offset = be64_to_cpu(l2_table[l2_index]);
> - if (cluster_offset & QCOW_OFLAG_COPIED)
> - return cluster_offset & ~QCOW_OFLAG_COPIED;
> + if (cluster_offset & QCOW_OFLAG_COPIED) {
> + qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
> + return 0;
> + }
>
> if (cluster_offset)
> qcow2_free_any_clusters(bs, cluster_offset, 1);
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 4dc980c..bf399f3 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1054,7 +1054,7 @@ static int
qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> 9, Z_DEFAULT_STRATEGY);
> if (ret != 0) {
> g_free(out_buf);
> - return -1;
> + return -EINVAL;
> }
>
> strm.avail_in = s->cluster_size;
> @@ -1066,7 +1066,7 @@ static int
qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> if (ret != Z_STREAM_END && ret != Z_OK) {
> g_free(out_buf);
> deflateEnd(&strm);
> - return -1;
> + return -EINVAL;
> }
> out_len = strm.next_out - out_buf;
>
> @@ -1079,12 +1079,13 @@ static int
qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> cluster_offset = qcow2_alloc_compressed_cluster_offset(bs,
> sector_num << 9, out_len);
> if (!cluster_offset)
> - return -1;
> + return -EIO;
Should free out_buf here?
> cluster_offset &= s->cluster_offset_mask;
> BLKDBG_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED);
> - if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len)
!= out_len) {
> + ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len);
> + if (ret < 0) {
> g_free(out_buf);
> - return -1;
> + return ret;
> }
> }
>
> --
> 1.7.6.4
>
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread* [Qemu-devel] [PATCH v2 2/2] qcow2: Fix bdrv_write_compressed error handling
2011-10-19 5:52 [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling Dong Xu Wang
@ 2011-10-19 7:32 ` Kevin Wolf
2011-10-19 7:44 ` wdongxu
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Wolf @ 2011-10-19 7:32 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, wdongxu
If during allocation of compressed clusters the cluster was already allocated
uncompressed, fail and properly release the l2_table (the latter avoids a
failed assertion).
While at it, make it return some real error numbers instead of -1.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2-cluster.c | 6 ++++--
block/qcow2.c | 29 ++++++++++++++++++-----------
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 2f76311..f4e049f 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -568,8 +568,10 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
}
cluster_offset = be64_to_cpu(l2_table[l2_index]);
- if (cluster_offset & QCOW_OFLAG_COPIED)
- return cluster_offset & ~QCOW_OFLAG_COPIED;
+ if (cluster_offset & QCOW_OFLAG_COPIED) {
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ return 0;
+ }
if (cluster_offset)
qcow2_free_any_clusters(bs, cluster_offset, 1);
diff --git a/block/qcow2.c b/block/qcow2.c
index 4dc980c..91f4f04 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1053,8 +1053,8 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
Z_DEFLATED, -12,
9, Z_DEFAULT_STRATEGY);
if (ret != 0) {
- g_free(out_buf);
- return -1;
+ ret = -EINVAL;
+ goto fail;
}
strm.avail_in = s->cluster_size;
@@ -1064,9 +1064,9 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
ret = deflate(&strm, Z_FINISH);
if (ret != Z_STREAM_END && ret != Z_OK) {
- g_free(out_buf);
deflateEnd(&strm);
- return -1;
+ ret = -EINVAL;
+ goto fail;
}
out_len = strm.next_out - out_buf;
@@ -1074,22 +1074,29 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
if (ret != Z_STREAM_END || out_len >= s->cluster_size) {
/* could not compress: write normal cluster */
- bdrv_write(bs, sector_num, buf, s->cluster_sectors);
+ ret = bdrv_write(bs, sector_num, buf, s->cluster_sectors);
+ if (ret < 0) {
+ goto fail;
+ }
} else {
cluster_offset = qcow2_alloc_compressed_cluster_offset(bs,
sector_num << 9, out_len);
- if (!cluster_offset)
- return -1;
+ if (!cluster_offset) {
+ ret = -EIO;
+ goto fail;
+ }
cluster_offset &= s->cluster_offset_mask;
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED);
- if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) {
- g_free(out_buf);
- return -1;
+ ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len);
+ if (ret < 0) {
+ goto fail;
}
}
+ ret = 0;
+fail:
g_free(out_buf);
- return 0;
+ return ret;
}
static BlockDriverAIOCB *qcow2_aio_flush(BlockDriverState *bs,
--
1.7.6.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [Qemu-devel] [PATCH v2 2/2] qcow2: Fix bdrv_write_compressed error handling
2011-10-19 7:32 ` [Qemu-devel] [PATCH v2 " Kevin Wolf
@ 2011-10-19 7:44 ` wdongxu
0 siblings, 0 replies; 4+ messages in thread
From: wdongxu @ 2011-10-19 7:44 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-devel
Reviewed-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
引用 Kevin Wolf <kwolf@redhat.com>:
> If during allocation of compressed clusters the cluster was already allocated
> uncompressed, fail and properly release the l2_table (the latter avoids a
> failed assertion).
>
> While at it, make it return some real error numbers instead of -1.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/qcow2-cluster.c | 6 ++++--
> block/qcow2.c | 29 ++++++++++++++++++-----------
> 2 files changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
> index 2f76311..f4e049f 100644
> --- a/block/qcow2-cluster.c
> +++ b/block/qcow2-cluster.c
> @@ -568,8 +568,10 @@ uint64_t
> qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
> }
>
> cluster_offset = be64_to_cpu(l2_table[l2_index]);
> - if (cluster_offset & QCOW_OFLAG_COPIED)
> - return cluster_offset & ~QCOW_OFLAG_COPIED;
> + if (cluster_offset & QCOW_OFLAG_COPIED) {
> + qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
> + return 0;
> + }
>
> if (cluster_offset)
> qcow2_free_any_clusters(bs, cluster_offset, 1);
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 4dc980c..91f4f04 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1053,8 +1053,8 @@ static int
> qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
> Z_DEFLATED, -12,
> 9, Z_DEFAULT_STRATEGY);
> if (ret != 0) {
> - g_free(out_buf);
> - return -1;
> + ret = -EINVAL;
> + goto fail;
> }
>
> strm.avail_in = s->cluster_size;
> @@ -1064,9 +1064,9 @@ static int
> qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
>
> ret = deflate(&strm, Z_FINISH);
> if (ret != Z_STREAM_END && ret != Z_OK) {
> - g_free(out_buf);
> deflateEnd(&strm);
> - return -1;
> + ret = -EINVAL;
> + goto fail;
> }
> out_len = strm.next_out - out_buf;
>
> @@ -1074,22 +1074,29 @@ static int
> qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
>
> if (ret != Z_STREAM_END || out_len >= s->cluster_size) {
> /* could not compress: write normal cluster */
> - bdrv_write(bs, sector_num, buf, s->cluster_sectors);
> + ret = bdrv_write(bs, sector_num, buf, s->cluster_sectors);
> + if (ret < 0) {
> + goto fail;
> + }
> } else {
> cluster_offset = qcow2_alloc_compressed_cluster_offset(bs,
> sector_num << 9, out_len);
> - if (!cluster_offset)
> - return -1;
> + if (!cluster_offset) {
> + ret = -EIO;
> + goto fail;
> + }
> cluster_offset &= s->cluster_offset_mask;
> BLKDBG_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED);
> - if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len)
> != out_len) {
> - g_free(out_buf);
> - return -1;
> + ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len);
> + if (ret < 0) {
> + goto fail;
> }
> }
>
> + ret = 0;
> +fail:
> g_free(out_buf);
> - return 0;
> + return ret;
> }
>
> static BlockDriverAIOCB *qcow2_aio_flush(BlockDriverState *bs,
> --
> 1.7.6.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 1/2] qemu-img: Don't allow preallocation and compression at the same time
@ 2011-10-18 15:47 Kevin Wolf
2011-10-18 15:47 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling Kevin Wolf
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Wolf @ 2011-10-18 15:47 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
Only qcow and qcow2 can do compression at all, and they require unallocated
clusters when writing the compressed data.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
qemu-img.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/qemu-img.c b/qemu-img.c
index 6a39731..511f136 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -824,6 +824,8 @@ static int img_convert(int argc, char **argv)
if (compress) {
QEMUOptionParameter *encryption =
get_option_parameter(param, BLOCK_OPT_ENCRYPT);
+ QEMUOptionParameter *preallocation =
+ get_option_parameter(param, BLOCK_OPT_PREALLOC);
if (!drv->bdrv_write_compressed) {
error_report("Compression not supported for this file format");
@@ -837,6 +839,13 @@ static int img_convert(int argc, char **argv)
ret = -1;
goto out;
}
+
+ if (preallocation && strcmp(preallocation->value.s, "off")) {
+ error_report("Compression and preallocation not supported at "
+ "the same time");
+ ret = -1;
+ goto out;
+ }
}
/* Create the new image */
--
1.7.6.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling
2011-10-18 15:47 [Qemu-devel] [PATCH 1/2] qemu-img: Don't allow preallocation and compression at the same time Kevin Wolf
@ 2011-10-18 15:47 ` Kevin Wolf
0 siblings, 0 replies; 4+ messages in thread
From: Kevin Wolf @ 2011-10-18 15:47 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
If during allocation of compressed clusters the cluster was already allocated
uncompressed, fail and properly release the l2_table (the latter avoids a
failed assertion).
While at it, make it return some real error numbers instead of -1.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2-cluster.c | 6 ++++--
block/qcow2.c | 11 ++++++-----
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 2f76311..f4e049f 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -568,8 +568,10 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
}
cluster_offset = be64_to_cpu(l2_table[l2_index]);
- if (cluster_offset & QCOW_OFLAG_COPIED)
- return cluster_offset & ~QCOW_OFLAG_COPIED;
+ if (cluster_offset & QCOW_OFLAG_COPIED) {
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ return 0;
+ }
if (cluster_offset)
qcow2_free_any_clusters(bs, cluster_offset, 1);
diff --git a/block/qcow2.c b/block/qcow2.c
index 4dc980c..bf399f3 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1054,7 +1054,7 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
9, Z_DEFAULT_STRATEGY);
if (ret != 0) {
g_free(out_buf);
- return -1;
+ return -EINVAL;
}
strm.avail_in = s->cluster_size;
@@ -1066,7 +1066,7 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
if (ret != Z_STREAM_END && ret != Z_OK) {
g_free(out_buf);
deflateEnd(&strm);
- return -1;
+ return -EINVAL;
}
out_len = strm.next_out - out_buf;
@@ -1079,12 +1079,13 @@ static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
cluster_offset = qcow2_alloc_compressed_cluster_offset(bs,
sector_num << 9, out_len);
if (!cluster_offset)
- return -1;
+ return -EIO;
cluster_offset &= s->cluster_offset_mask;
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED);
- if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) {
+ ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len);
+ if (ret < 0) {
g_free(out_buf);
- return -1;
+ return ret;
}
}
--
1.7.6.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-10-19 7:44 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-19 5:52 [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling Dong Xu Wang
2011-10-19 7:32 ` [Qemu-devel] [PATCH v2 " Kevin Wolf
2011-10-19 7:44 ` wdongxu
-- strict thread matches above, loose matches on Subject: below --
2011-10-18 15:47 [Qemu-devel] [PATCH 1/2] qemu-img: Don't allow preallocation and compression at the same time Kevin Wolf
2011-10-18 15:47 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix bdrv_write_compressed error handling Kevin Wolf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.