On Wed, Feb 06, 2013 at 01:31:45PM +0100, Benoît Canet wrote:
> ---
> block/qcow2-cluster.c | 8 ++++++--
> block/qcow2-dedup.c | 7 +++++++
> block/qcow2.h | 3 +++
> 3 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
> index dbcb6d2..ef91216 100644
> --- a/block/qcow2-cluster.c
> +++ b/block/qcow2-cluster.c
> @@ -709,6 +709,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs,
> QCowL2Meta *m)
> qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
>
> for (i = 0; i < m->nb_clusters; i++) {
> + uint64_t flags = 0;
> /* if two concurrent writes happen to the same unallocated cluster
> * each write allocates separate cluster and writes data concurrently.
> * The first one to complete updates l2 table with pointer to its
> @@ -718,9 +719,11 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs,
> QCowL2Meta *m)
> if(l2_table[l2_index + i] != 0)
> old_cluster[j++] = l2_table[l2_index + i];
>
> + flags = m->oflag_copied ? QCOW_OFLAG_COPIED : 0;
> + flags |= m->to_deduplicate ? QCOW_OFLAG_TO_DEDUP : 0;
It would be easier to have a m->l2_entry_flags field that is ORed in.
Then we don't need separate fields for QCOW_OFLAG_COPIED and
QCOW_OFLAG_TO_DEDUP, or code to check them and build flags.