Am 25.05.2012 17:33, schrieb Stefan Hajnoczi: > On Fri, May 11, 2012 at 5:48 PM, Kevin Wolf <kw...@redhat.com> wrote: >> @@ -1205,9 +1206,31 @@ int qcow2_check_refcounts(BlockDriverState *bs, >> BdrvCheckResult *res) >> >> refcount2 = refcount_table[i]; >> if (refcount1 != refcount2) { >> + >> + /* Check if we're allowed to fix the mismatch */ >> + int *num_fixed = NULL; >> + if (refcount1 > refcount2 && (fix & BDRV_FIX_LEAKS)) { >> + num_fixed = &res->leaks_fixed; >> + } else if (refcount1 < refcount2 && (fix & BDRV_FIX_ERRORS)) { >> + num_fixed = &res->corruptions_fixed; >> + } >> + >> fprintf(stderr, "%s cluster %d refcount=%d reference=%d\n", >> - refcount1 < refcount2 ? "ERROR" : "Leaked", >> + num_fixed != NULL ? "Repairing" : >> + refcount1 < refcount2 ? "ERROR" : >> + "Leaked", >> i, refcount1, refcount2); >> + >> + if (num_fixed) { >> + ret = update_refcount(bs, i << s->cluster_bits, 1, >> + refcount2 - refcount1); > > It would be nicer to use int64_t for i. I haven't checked but it > makes me nervous to shift ints here.
Thanks, good catch. Fixed in block-next. Kevin