On Wed, Feb 06, 2013 at 01:31:54PM +0100, Benoît Canet wrote: > diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c > index a932ff6..fa2559f 100644 > --- a/block/qcow2-refcount.c > +++ b/block/qcow2-refcount.c > @@ -489,6 +489,9 @@ int QEMU_WARN_UNUSED_RESULT > update_refcount(BlockDriverState *bs, > ret = -EINVAL; > goto fail; > } > + if (s->has_dedup && deduplication && refcount >= 0xFFFF/2) { > + qcow2_dedup_refcount_half_max_reached(bs, cluster_index); > + }
update_cluster_refcount() calls update_refcount() followed by get_refcount(). It is not necessary to add the deduplication argument to update_refcount and perform this check inside update_refcount(). Please either use update_cluster_refcount() or write a similar function, then you'll get back the actual refcount value and can test it in dedup code. > if (refcount == 0 && cluster_index < s->free_cluster_index) { > s->free_cluster_index = cluster_index; > } > diff --git a/block/qcow2.h b/block/qcow2.h > index dc378a7..f281832 100644 > --- a/block/qcow2.h > +++ b/block/qcow2.h > @@ -65,6 +65,8 @@ > #define DEFAULT_DEDUP_CLUSTER_SIZE 4096 > > #define HASH_LENGTH 32 > +/* indicate that this cluster refcount has reached its maximum value */ > +#define QCOW_FLAG_HALF_MAX_REFCOUNT (1LL << 61) Missing from the spec.