All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>, qemu-devel@nongnu.org
Cc: mrezanin@redhat.com, akong@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3] qemu-img: Fix overwriting 'ret' before using
Date: Thu, 14 Nov 2013 09:32:23 +0800	[thread overview]
Message-ID: <52842827.6030909@redhat.com> (raw)
In-Reply-To: <1384346626-27479-1-git-send-email-kwolf@redhat.com>

On 2013年11月13日 20:43, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This patch moves ret assignment after reporting original error.
>
> We were lucky to pass qemu-iotests 048 (qemu-img compare case) but when
> I tried to run with TEST_DIR=/tmp (tmpfs), it fails with a "wrong"
> mismatch offset. This fixes two bugs.
>
> In the first if branch, setting ret to 1 before using it makes dead code
> in the next line: pnum is never added to mismatch offset even if ret was
> 0.
>
> In the other if branch, currently the output error is always -4:
>    strerror(-4) -> Unknown error -4
>
> Added regression test in case 048.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Amos Kong <akong@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>
> There was another case of overwritten ret that I added in v3.
>
>   qemu-img.c                 |  6 +++---
>   tests/qemu-iotests/048     | 34 ++++++++++++++++++++++++++++++++++
>   tests/qemu-iotests/048.out | 27 ++++++++++++++++++++++++++-
>   3 files changed, 63 insertions(+), 4 deletions(-)
>
> diff --git a/qemu-img.c b/qemu-img.c
> index bf3fb4f..b6b5644 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -1020,10 +1020,10 @@ static int img_compare(int argc, char **argv)
>                   }
>                   ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
>                   if (ret || pnum != nb_sectors) {
> -                    ret = 1;
>                       qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
>                               sectors_to_bytes(
>                                   ret ? sector_num : sector_num + pnum));
> +                    ret = 1;
>                       goto out;
>                   }
>               }
> @@ -1045,9 +1045,9 @@ static int img_compare(int argc, char **argv)
>               }
>               if (ret) {
>                   if (ret < 0) {
> -                    ret = 4;
>                       error_report("Error while reading offset %" PRId64 ": %s",
>                                    sectors_to_bytes(sector_num), strerror(-ret));
> +                    ret = 4;
>                   }
>                   goto out;
>               }
> @@ -1092,10 +1092,10 @@ static int img_compare(int argc, char **argv)
>                                             filename_over, buf1, quiet);
>                   if (ret) {
>                       if (ret < 0) {
> -                        ret = 4;
>                           error_report("Error while reading offset %" PRId64
>                                        " of %s: %s", sectors_to_bytes(sector_num),
>                                        filename_over, strerror(-ret));
> +                        ret = 4;
>                       }
>                       goto out;
>                   }
> diff --git a/tests/qemu-iotests/048 b/tests/qemu-iotests/048
> index 9b9d118..9def7fc 100755
> --- a/tests/qemu-iotests/048
> +++ b/tests/qemu-iotests/048
> @@ -74,5 +74,39 @@ _compare
>   io_pattern write 0 $CLUSTER_SIZE 0 1 123
>   _compare
>
> +# Test unaligned case of mismatch offsets in allocated clusters
> +_make_test_img $size
> +io_pattern write 0 512 0 1 100
> +cp "$TEST_IMG" "$TEST_IMG2"
> +io_pattern write 512 512 0 1 101
> +_compare
> +
> +# Test cluster allocated in one, with IO error
> +cat > "$TEST_DIR/blkdebug.conf"<<EOF
> +[inject-error]
> +event = "read_aio"
> +errno = "5"
> +once ="off"
> +EOF
> +_make_test_img $size
> +cp "$TEST_IMG" "$TEST_IMG2"
> +io_pattern write 512 512 0 1 102
> +TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG" _compare 2>&1 |\
> +    _filter_testdir | _filter_imgfmt
> +
> +# Test cluster allocated in one, with different sizes and IO error in the part
> +# that exists only in one image
> +cat > "$TEST_DIR/blkdebug.conf"<<EOF
> +[inject-error]
> +event = "read_aio"
> +errno = "5"
> +once ="off"
> +EOF
> +_make_test_img $size
> +TEST_IMG="$TEST_IMG2" _make_test_img 0
> +io_pattern write 512 512 0 1 102

I think the patterns are incremented for each step, so there's some clue 
of the culprit, if this test fails. But it's up to you. Thanks for 
adding this.

Reviewed-by: Fam Zheng <famz@redhat.com>

> +TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG" _compare 2>&1 |\
> +    _filter_testdir | _filter_imgfmt
> +
>   # Cleanup
>   status=0
> diff --git a/tests/qemu-iotests/048.out b/tests/qemu-iotests/048.out
> index 68f65d5..d141e05 100644
> --- a/tests/qemu-iotests/048.out
> +++ b/tests/qemu-iotests/048.out
> @@ -1,5 +1,5 @@
>   QA output created by 048
> -Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
>   === IO: pattern 45
>   qemu-io> wrote 4096/4096 bytes at offset 524288
>   4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> @@ -28,4 +28,29 @@ qemu-io> wrote 4096/4096 bytes at offset 0
>   4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>   qemu-io> Content mismatch at offset 0!
>   1
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
> +=== IO: pattern 100
> +qemu-io> wrote 512/512 bytes at offset 0
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +qemu-io> === IO: pattern 101
> +qemu-io> wrote 512/512 bytes at offset 512
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +qemu-io> Content mismatch at offset 512!
> +1
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
> +=== IO: pattern 102
> +qemu-io> wrote 512/512 bytes at offset 512
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +qemu-io> qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
> +qemu-img: Error while reading offset 0: Input/output error
> +4
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
> +Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=0
> +=== IO: pattern 102
> +qemu-io> wrote 512/512 bytes at offset 512
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +qemu-io> qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
> +qemu-img: Error while reading offset 0 of blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT: Input/output error
> +Warning: Image size mismatch!
> +4
>   Cleanup
>

      parent reply	other threads:[~2013-11-14  1:32 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-13 12:43 [Qemu-devel] [PATCH v3] qemu-img: Fix overwriting 'ret' before using Kevin Wolf
2013-11-13 14:44 ` Eric Blake
2013-11-14  1:32 ` Fam Zheng [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52842827.6030909@redhat.com \
    --to=famz@redhat.com \
    --cc=akong@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mrezanin@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.