Skip to content

Commit

Permalink
qemu-img: find the image end offset during check
Browse files Browse the repository at this point in the history
This patch adds the support for reporting the image end offset (in
bytes). This is particularly useful after a conversion (or a rebase)
where the destination is a block device in order to find the first
unused byte at the end of the image.

Signed-off-by: Federico Simoncelli <fsimonce@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
simon3z authored and kevmw committed Feb 22, 2013
1 parent 5cbb082 commit c6bb9ad
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 10 deletions.
10 changes: 8 additions & 2 deletions block/qcow2-refcount.c
Expand Up @@ -1112,7 +1112,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix)
{
BDRVQcowState *s = bs->opaque;
int64_t size, i;
int64_t size, i, highest_cluster;
int nb_clusters, refcount1, refcount2;
QCowSnapshot *sn;
uint16_t *refcount_table;
Expand Down Expand Up @@ -1183,7 +1183,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
}

/* compare ref counts */
for(i = 0; i < nb_clusters; i++) {
for (i = 0, highest_cluster = 0; i < nb_clusters; i++) {
refcount1 = get_refcount(bs, i);
if (refcount1 < 0) {
fprintf(stderr, "Can't get refcount for cluster %" PRId64 ": %s\n",
Expand All @@ -1193,6 +1193,11 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
}

refcount2 = refcount_table[i];

if (refcount1 > 0 || refcount2 > 0) {
highest_cluster = i;
}

if (refcount1 != refcount2) {

/* Check if we're allowed to fix the mismatch */
Expand Down Expand Up @@ -1227,6 +1232,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
}
}

res->image_end_offset = (highest_cluster + 1) * s->cluster_size;
ret = 0;

fail:
Expand Down
1 change: 1 addition & 0 deletions include/block/block.h
Expand Up @@ -213,6 +213,7 @@ typedef struct BdrvCheckResult {
int check_errors;
int corruptions_fixed;
int leaks_fixed;
int64_t image_end_offset;
BlockFragInfo bfi;
} BdrvCheckResult;

Expand Down
4 changes: 4 additions & 0 deletions qemu-img.c
Expand Up @@ -475,6 +475,10 @@ static int img_check(int argc, char **argv)
result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters);
}

if (result.image_end_offset > 0) {
printf("Image end offset: %" PRId64 "\n", result.image_end_offset);
}

bdrv_delete(bs);

if (ret < 0 || result.check_errors) {
Expand Down
6 changes: 3 additions & 3 deletions tests/qemu-iotests/026
Expand Up @@ -102,7 +102,7 @@ if [ "$event" == "l2_load" ]; then
$QEMU_IO -c "read $vmstate 0 128k " $BLKDBG_TEST_IMG | _filter_qemu_io
fi

$QEMU_IMG check $TEST_IMG 2>&1 | grep -v "refcount=1 reference=0"
_check_test_img 2>&1 | grep -v "refcount=1 reference=0"

done
done
Expand Down Expand Up @@ -147,7 +147,7 @@ echo
echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate"
$QEMU_IO -c "write $vmstate 0 64M" $BLKDBG_TEST_IMG | _filter_qemu_io

$QEMU_IMG check $TEST_IMG 2>&1 | grep -v "refcount=1 reference=0"
_check_test_img 2>&1 | grep -v "refcount=1 reference=0"

done
done
Expand Down Expand Up @@ -186,7 +186,7 @@ echo
echo "Event: $event; errno: $errno; imm: $imm; once: $once"
$QEMU_IO -c "write -b 0 64k" $BLKDBG_TEST_IMG | _filter_qemu_io

$QEMU_IMG check $TEST_IMG 2>&1 | grep -v "refcount=1 reference=0"
_check_test_img 2>&1 | grep -v "refcount=1 reference=0"

done
done
Expand Down
3 changes: 2 additions & 1 deletion tests/qemu-iotests/036
Expand Up @@ -59,7 +59,8 @@ _make_test_img 64M
echo
echo === Repair image ===
echo
$QEMU_IMG check -r all $TEST_IMG
_check_test_img -r all

./qcow2.py $TEST_IMG dump-header

# success, all done
Expand Down
2 changes: 1 addition & 1 deletion tests/qemu-iotests/039
Expand Up @@ -86,7 +86,7 @@ $QEMU_IO -r -c "read -P 0x5a 0 512" $TEST_IMG | _filter_qemu_io
echo
echo "== Repairing the image file must succeed =="

$QEMU_IMG check -r all $TEST_IMG
_check_test_img -r all

# The dirty bit must not be set
./qcow2.py $TEST_IMG dump-header | grep incompatible_features
Expand Down
1 change: 1 addition & 0 deletions tests/qemu-iotests/044.out
@@ -1,4 +1,5 @@
No errors were found on the image.
Image end offset: 4296447488
.
----------------------------------------------------------------------
Ran 1 tests
Expand Down
7 changes: 4 additions & 3 deletions tests/qemu-iotests/common.rc
Expand Up @@ -161,9 +161,10 @@ _cleanup_test_img()

_check_test_img()
{
$QEMU_IMG check -f $IMGFMT $TEST_IMG 2>&1 | \
grep -v "fragmented$" | \
sed -e 's/qemu-img\: This image format does not support checks/No errors were found on the image./'
$QEMU_IMG check "$@" -f $IMGFMT $TEST_IMG 2>&1 | \
sed -e "/fragmented$/d" \
-e 's/qemu-img: This image format does not support checks/No errors were found on the image./' \
-e '/Image end offset: [0-9]\+/d'
}

_img_info()
Expand Down

0 comments on commit c6bb9ad

Please sign in to comment.