mirror of https://github.com/xqemu/xqemu.git
qemu-img: Fix overwriting 'ret' before using
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> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
a1144c0dbf
commit
36452f12f8
|
@ -1020,10 +1020,10 @@ static int img_compare(int argc, char **argv)
|
||||||
}
|
}
|
||||||
ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
|
ret = compare_sectors(buf1, buf2, nb_sectors, &pnum);
|
||||||
if (ret || pnum != nb_sectors) {
|
if (ret || pnum != nb_sectors) {
|
||||||
ret = 1;
|
|
||||||
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
qprintf(quiet, "Content mismatch at offset %" PRId64 "!\n",
|
||||||
sectors_to_bytes(
|
sectors_to_bytes(
|
||||||
ret ? sector_num : sector_num + pnum));
|
ret ? sector_num : sector_num + pnum));
|
||||||
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1045,9 +1045,9 @@ static int img_compare(int argc, char **argv)
|
||||||
}
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = 4;
|
|
||||||
error_report("Error while reading offset %" PRId64 ": %s",
|
error_report("Error while reading offset %" PRId64 ": %s",
|
||||||
sectors_to_bytes(sector_num), strerror(-ret));
|
sectors_to_bytes(sector_num), strerror(-ret));
|
||||||
|
ret = 4;
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1092,10 +1092,10 @@ static int img_compare(int argc, char **argv)
|
||||||
filename_over, buf1, quiet);
|
filename_over, buf1, quiet);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = 4;
|
|
||||||
error_report("Error while reading offset %" PRId64
|
error_report("Error while reading offset %" PRId64
|
||||||
" of %s: %s", sectors_to_bytes(sector_num),
|
" of %s: %s", sectors_to_bytes(sector_num),
|
||||||
filename_over, strerror(-ret));
|
filename_over, strerror(-ret));
|
||||||
|
ret = 4;
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,5 +74,39 @@ _compare
|
||||||
io_pattern write 0 $CLUSTER_SIZE 0 1 123
|
io_pattern write 0 $CLUSTER_SIZE 0 1 123
|
||||||
_compare
|
_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
|
||||||
|
TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG" _compare 2>&1 |\
|
||||||
|
_filter_testdir | _filter_imgfmt
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
status=0
|
status=0
|
||||||
|
|
|
@ -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)
|
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
qemu-io> Content mismatch at offset 0!
|
qemu-io> Content mismatch at offset 0!
|
||||||
1
|
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
|
Cleanup
|
||||||
|
|
Loading…
Reference in New Issue