On Thu, Nov 20, 2014 at 06:06:23PM +0100, Max Reitz wrote: > @@ -1711,7 +1746,7 @@ static int calculate_refcounts(BlockDriverState *bs, > BdrvCheckResult *res, > static void compare_refcounts(BlockDriverState *bs, BdrvCheckResult *res, > BdrvCheckMode fix, bool *rebuild, > int64_t *highest_cluster, > - uint16_t *refcount_table, int64_t nb_clusters) > + void *refcount_table, int64_t nb_clusters) > { > BDRVQcowState *s = bs->opaque; > int64_t i, refcount1, refcount2;
An -ERANGE qcow2_get_refcount() return value is treated as a check error here and we won't be able to rebuild the refcount blocks: refcount1 = qcow2_get_refcount(bs, i); if (refcount1 < 0) { fprintf(stderr, "Can't get refcount for cluster %" PRId64 ": %s\n", i, strerror(-refcount1)); res->check_errors++; continue; } We should allow rebuilding refcount blocks, -ERANGE is just another corrupted refcount.
pgpyEY7bWMHBB.pgp
Description: PGP signature