Patchwork qcow2: Fix image creation regression

login
register
mail settings
Submitter Kevin Wolf
Date Feb. 23, 2010, 3:06 p.m.
Message ID <1266937580-25915-1-git-send-email-kwolf@redhat.com>
Download mbox | patch
Permalink /patch/46065/
State New
Headers show

Comments

Kevin Wolf - Feb. 23, 2010, 3:06 p.m.
When checking for errors, commit db89119d compares with the wrong values,
failing image creation even when there was no error. Additionally, if an
error has occured, we can't preallocate the image (it's likely broken).

This unbreaks test 023 of qemu-iotests.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qcow2.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Juan Quintela - Feb. 23, 2010, 6:34 p.m.
Kevin Wolf <kwolf@redhat.com> wrote:
> When checking for errors, commit db89119d compares with the wrong values,
> failing image creation even when there was no error. Additionally, if an
> error has occured, we can't preallocate the image (it's likely broken).
>
> This unbreaks test 023 of qemu-iotests.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>

Acked-by: Juan Quintela <quintela@redhat.com>

in the 1st part, I didnt' noticed the difference last time :(

> ---
>  block/qcow2.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 6632e6d..0e4cd98 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -986,7 +986,7 @@ static int qcow_create2(const char *filename, int64_t total_size,
>      lseek(fd, s->refcount_block_offset, SEEK_SET);
>      ret = qemu_write_full(fd, s->refcount_block,
>  		    ref_clusters * s->cluster_size);
> -    if (ret != s->cluster_size) {
> +    if (ret != ref_clusters * s->cluster_size) {
>          ret = -1;
>          goto exit;
>      }
> @@ -998,7 +998,7 @@ exit:
>      close(fd);
>  
>      /* Preallocate metadata */
> -    if (prealloc) {
> +    if (ret == 0 && prealloc) {
>          BlockDriverState *bs;
>          bs = bdrv_new("");
>          bdrv_open(bs, filename, BDRV_O_CACHE_WB | BDRV_O_RDWR);

Patch

diff --git a/block/qcow2.c b/block/qcow2.c
index 6632e6d..0e4cd98 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -986,7 +986,7 @@  static int qcow_create2(const char *filename, int64_t total_size,
     lseek(fd, s->refcount_block_offset, SEEK_SET);
     ret = qemu_write_full(fd, s->refcount_block,
 		    ref_clusters * s->cluster_size);
-    if (ret != s->cluster_size) {
+    if (ret != ref_clusters * s->cluster_size) {
         ret = -1;
         goto exit;
     }
@@ -998,7 +998,7 @@  exit:
     close(fd);
 
     /* Preallocate metadata */
-    if (prealloc) {
+    if (ret == 0 && prealloc) {
         BlockDriverState *bs;
         bs = bdrv_new("");
         bdrv_open(bs, filename, BDRV_O_CACHE_WB | BDRV_O_RDWR);