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.

Reply via email to