This patch adds the support for reporting the highest offset in use by an image. This is particularly useful after a conversion (or a rebase) where the destination is a block device in order to find the actual amount of space in use.
Signed-off-by: Federico Simoncelli <fsimo...@redhat.com> --- block.h | 1 + block/qcow2-refcount.c | 10 ++++++++-- qemu-img.c | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/block.h b/block.h index 722c620..de42e8c 100644 --- a/block.h +++ b/block.h @@ -213,6 +213,7 @@ typedef struct BdrvCheckResult { int check_errors; int corruptions_fixed; int leaks_fixed; + int64_t highest_offset; BlockFragInfo bfi; } BdrvCheckResult; diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 96224d1..017439d 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -1116,7 +1116,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; @@ -1154,7 +1154,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res, s->refcount_table_offset, s->refcount_table_size * sizeof(uint64_t)); - for(i = 0; i < s->refcount_table_size; i++) { + for(i = 0, highest_cluster = 0; i < s->refcount_table_size; i++) { uint64_t offset, cluster; offset = s->refcount_table[i]; cluster = offset >> s->cluster_bits; @@ -1197,6 +1197,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 */ @@ -1231,6 +1236,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res, } } + res->highest_offset = (highest_cluster + 1) * s->cluster_size; ret = 0; fail: diff --git a/qemu-img.c b/qemu-img.c index e29e01b..3a8090b 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -470,6 +470,10 @@ static int img_check(int argc, char **argv) result.bfi.fragmented_clusters * 100.0 / result.bfi.allocated_clusters); } + if (result.highest_offset > 0) { + printf("Highest offset in use: %lu\n", result.highest_offset); + } + bdrv_delete(bs); if (ret < 0 || result.check_errors) { -- 1.7.1