diff mbox

qcow2: Free preallocated zero clusters

Message ID 1381308268-23235-1-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz Oct. 9, 2013, 8:44 a.m. UTC
In qcow2_free_any_clusters, preallocated zero clusters should be freed
just as normal clusters are.

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

Comments

Kevin Wolf Oct. 9, 2013, 9:44 a.m. UTC | #1
Am 09.10.2013 um 10:44 hat Max Reitz geschrieben:
> In qcow2_free_any_clusters, preallocated zero clusters should be freed
> just as normal clusters are.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>

Thanks, applied to the block branch.

Do you have a test case that would cause a leak previously?

Kevin
Max Reitz Oct. 9, 2013, 9:50 a.m. UTC | #2
On 2013-10-09 11:44, Kevin Wolf wrote:
> Am 09.10.2013 um 10:44 hat Max Reitz geschrieben:
>> In qcow2_free_any_clusters, preallocated zero clusters should be freed
>> just as normal clusters are.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
> Thanks, applied to the block branch.
>
> Do you have a test case that would cause a leak previously?
>
> Kevin

Oh, right.

qemu-img create -f qcow2 f.qcow2 64M
qemu-io -c 'write 0 64M' -c 'write -z 0 64M' -c 'discard 0 64M' f.qcow2
qemu-img check f.qcow2

seems enough, I'll send that test case as a follow-up.

Max
diff mbox

Patch

diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 2d67885..9dd5e44 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -796,11 +796,13 @@  void qcow2_free_any_clusters(BlockDriverState *bs, uint64_t l2_entry,
         }
         break;
     case QCOW2_CLUSTER_NORMAL:
-        qcow2_free_clusters(bs, l2_entry & L2E_OFFSET_MASK,
-                            nb_clusters << s->cluster_bits, type);
+    case QCOW2_CLUSTER_ZERO:
+        if (l2_entry & L2E_OFFSET_MASK) {
+            qcow2_free_clusters(bs, l2_entry & L2E_OFFSET_MASK,
+                                nb_clusters << s->cluster_bits, type);
+        }
         break;
     case QCOW2_CLUSTER_UNALLOCATED:
-    case QCOW2_CLUSTER_ZERO:
         break;
     default:
         abort();