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.