@@ -1029,7 +1029,19 @@ static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
PRIx64 ": %s\n", l2_entry, strerror(-refcount));
goto fail;
}
- if ((refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
+ /* QCOW_OFLAG_COPIED is not garanteed to be here when
+ * refcount == 1 when dedup is enabled since it would be
+ * too expensive to set it back everytime refcount is
+ * decremented to 1.
+ */
+ if (!s->has_dedup &&
+ (refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
+ fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
+ PRIx64 " refcount=%d\n", l2_entry, refcount);
+ res->corruptions++;
+ }
+ if (s->has_dedup && refcount > 1 &&
+ ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
PRIx64 " refcount=%d\n", l2_entry, refcount);
res->corruptions++;
Signed-off-by: Benoit Canet <benoit@irqsave.net> --- block/qcow2-refcount.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)