qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] qcow2: count_contiguous_clusters and compression
@ 2013-09-25 15:47 Max Reitz
  2013-09-27  9:31 ` Kevin Wolf
  0 siblings, 1 reply; 2+ messages in thread
From: Max Reitz @ 2013-09-25 15:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Stefan Hajnoczi, Max Reitz

The function is not intended to be used on compressed clusters and will
not work correctly, if used anyway, since L2E_OFFSET_MASK is not the
right mask for determining the offset of compressed clusters. Therefore,
assert that the first cluster is not compressed and always include the
compression flag in the mask of significant flags, i.e., stop the search
as soon as a compressed cluster occurs.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block/qcow2-cluster.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 738ff73..d695a2b 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -281,12 +281,15 @@ static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,
         uint64_t *l2_table, uint64_t start, uint64_t stop_flags)
 {
     int i;
-    uint64_t mask = stop_flags | L2E_OFFSET_MASK;
-    uint64_t offset = be64_to_cpu(l2_table[0]) & mask;
+    uint64_t mask = stop_flags | L2E_OFFSET_MASK | QCOW2_CLUSTER_COMPRESSED;
+    uint64_t first_entry = be64_to_cpu(l2_table[0]);
+    uint64_t offset = first_entry & mask;
 
     if (!offset)
         return 0;
 
+    assert(qcow2_get_cluster_type(first_entry) != QCOW2_CLUSTER_COMPRESSED);
+
     for (i = start; i < start + nb_clusters; i++) {
         uint64_t l2_entry = be64_to_cpu(l2_table[i]) & mask;
         if (offset + (uint64_t) i * cluster_size != l2_entry) {
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH] qcow2: count_contiguous_clusters and compression
  2013-09-25 15:47 [Qemu-devel] [PATCH] qcow2: count_contiguous_clusters and compression Max Reitz
@ 2013-09-27  9:31 ` Kevin Wolf
  0 siblings, 0 replies; 2+ messages in thread
From: Kevin Wolf @ 2013-09-27  9:31 UTC (permalink / raw)
  To: Max Reitz; +Cc: qemu-devel, Stefan Hajnoczi

Am 25.09.2013 um 17:47 hat Max Reitz geschrieben:
> The function is not intended to be used on compressed clusters and will
> not work correctly, if used anyway, since L2E_OFFSET_MASK is not the
> right mask for determining the offset of compressed clusters. Therefore,
> assert that the first cluster is not compressed and always include the
> compression flag in the mask of significant flags, i.e., stop the search
> as soon as a compressed cluster occurs.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>

This is supposed to be a cleanup patch with no functional change, right?
How about removing explicit QCOW_OFLAG_COMPRESSED arguments from
callers?

Kevin

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-09-27  9:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-25 15:47 [Qemu-devel] [PATCH] qcow2: count_contiguous_clusters and compression Max Reitz
2013-09-27  9:31 ` Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).