Signed-off-by: Devin Nakamura <devin...@gmail.com> --- block/qcow2-refcount.c | 39 +++++++++++++++++++++++++++++---------- 1 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 14b2f67..75f1f88 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -1075,17 +1075,10 @@ fail: return -EIO; } -/* - * Checks an image for refcount consistency. - * - * Returns 0 if no errors are found, the number of errors in case the image is - * detected as corrupted, and -errno when an internal error occurred. - */ -int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) -{ +static int inc_refcount_table(BlockDriverState *bs, BdrvCheckResult *res, uint16_t **table) { BDRVQcowState *s = bs->opaque; int64_t size; - int nb_clusters, refcount1, refcount2, i; + int nb_clusters, i; QCowSnapshot *sn; uint16_t *refcount_table; int ret; @@ -1151,6 +1144,33 @@ int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) } } } + *table = refcount_table; + ret = 0; + +fail: + return ret; +} + +/* + * Checks an image for refcount consistency. + * + * Returns 0 if no errors are found, the number of errors in case the image is + * detected as corrupted, and -errno when an internal error occurred. + */ +int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res) +{ + BDRVQcowState *s = bs->opaque; + int64_t size; + int nb_clusters, refcount1, refcount2, i; + uint16_t *refcount_table; + int ret; + + size = bdrv_getlength(bs->file); + nb_clusters = size_to_clusters(s, size); + ret = inc_refcount_table(bs, res, &refcount_table); + if (ret) { + goto fail; + } /* compare ref counts */ for(i = 0; i < nb_clusters; i++) { @@ -1182,4 +1202,3 @@ fail: return ret; } - -- 1.7.6.rc1