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. Stefan