All of lore.kernel.org
 help / color / mirror / Atom feed
* 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 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

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.