From: Kevin Wolf Date: Tue, 29 Jan 2019 12:47:24 +0000 (+0100) Subject: qcow2: Prepare qcow2_get_cluster_type() for external data file X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=a4ea184d8af936cdc4bea4afdb5c30ffaed0c4f7;p=qemu.git qcow2: Prepare qcow2_get_cluster_type() for external data file Signed-off-by: Kevin Wolf --- diff --git a/block/qcow2.h b/block/qcow2.h index 7a34bd0c53..8fe2d55005 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -521,7 +521,15 @@ static inline QCow2ClusterType qcow2_get_cluster_type(BlockDriverState *bs, } return QCOW2_CLUSTER_ZERO_PLAIN; } else if (!(l2_entry & L2E_OFFSET_MASK)) { - return QCOW2_CLUSTER_UNALLOCATED; + /* Offset 0 generally means unallocated, but it is ambiguous with + * external data files because 0 is a valid offset there. However, all + * clusters in external data files always have refcount 1, so we can + * rely on QCOW_OFLAG_COPIED to disambiguate. */ + if (has_data_file(bs) && (l2_entry & QCOW_OFLAG_COPIED)) { + return QCOW2_CLUSTER_NORMAL; + } else { + return QCOW2_CLUSTER_UNALLOCATED; + } } else { return QCOW2_CLUSTER_NORMAL; }