@@ -1013,7 +1013,9 @@ again:
.nb_sectors = avail_sectors - nb_sectors,
},
- .l2_entry_flags = QCOW_OFLAG_COPIED,
+ .l2_entry_flags = QCOW_OFLAG_COPIED |
+ qcow2_must_deduplicate(bs) ?
+ QCOW_OFLAG_PENDING_DEDUP : 0,
.overwrite = false,
};
qemu_co_queue_init(&(*m)->dependent_requests);
@@ -39,6 +39,12 @@ static int qcow2_dedup_read_write_hash(BlockDriverState *bs,
uint64_t physical_sect,
bool write);
+bool qcow2_must_deduplicate(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ return s->has_dedup && s->dedup_status != DEDUP_STATUS_STARTED;
+}
+
/*
* Grow the deduplication table
*
@@ -314,6 +314,8 @@ typedef struct QCowL2Meta
/* set to true if we are overwriting an L2 table entry */
bool overwrite;
+ /* set to true if the cluster must be tagged with QCOW_OFLAG_PENDING_DEDUP */
+ bool to_deduplicate;
/**
* The COW Region between the start of the first allocated cluster and the
@@ -464,6 +466,7 @@ int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table);
/* qcow2-dedup.c functions */
+bool qcow2_must_deduplicate(BlockDriverState *bs);
int qcow2_dedup_read_missing_and_concatenate(BlockDriverState *bs,
QEMUIOVector *qiov,
uint64_t sector,