[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 16/24] qcow2: add qcow2_drop_leaked_clusters()
From: |
Devin Nakamura |
Subject: |
[Qemu-devel] [RFC 16/24] qcow2: add qcow2_drop_leaked_clusters() |
Date: |
Fri, 29 Jul 2011 00:49:46 -0400 |
Signed-off-by: Devin Nakamura <address@hidden>
---
block/qcow2-refcount.c | 34 ++++++++++++++++++++++++++++++++++
block/qcow2.h | 2 ++
2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 75f1f88..2f78a71 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1202,3 +1202,37 @@ fail:
return ret;
}
+
+int qcow2_drop_leaked_clusters(BlockDriverState *bs) {
+ BDRVQcowState *s = bs->opaque;
+ int64_t size;
+ int nb_clusters, refcount, i;
+ uint16_t *refcount_table;
+ BdrvCheckResult res;
+ int ret;
+
+ ret = inc_refcount_table(bs, &res, &refcount_table);
+ if (ret) {
+ goto fail;
+ }
+ size = bdrv_getlength(bs->file);
+ nb_clusters = size_to_clusters(s, size);
+
+ for(i = 0; i < nb_clusters; i++) {
+ refcount = get_refcount(bs, i);
+ refcount = refcount_table[i] - refcount;
+ if (refcount < 0) { //we only want to change leaked clusters
+ ret = update_cluster_refcount(bs, i , refcount);
+ if (ret) {
+ goto fail;
+ }
+ }
+ }
+
+ ret = 0;
+
+fail:
+ qemu_free(refcount_table);
+
+ return ret;
+}
diff --git a/block/qcow2.h b/block/qcow2.h
index 6a0a21b..e9efb74 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -193,6 +193,8 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res);
+int qcow2_drop_leaked_clusters(BlockDriverState *bs) ;
+
/* qcow2-cluster.c functions */
int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size);
void qcow2_l2_cache_reset(BlockDriverState *bs);
--
1.7.6.rc1
- [Qemu-devel] [RFC 06/24] block: add bdrv_copy_header(), (continued)
- [Qemu-devel] [RFC 06/24] block: add bdrv_copy_header(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 07/24] qed: make qed_alloc_clusters round up offset to nearest cluster, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 08/24] qed: add qed_find_cluster_sync(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 10/24] qed: add qed_bdrv_map(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 11/24] qed: add open_conversion_target(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 09/24] qed: add qed_bdrv_get_mapping(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 13/24] qed: add bdrv_qed_get_conversion_options(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 12/24] qed: add bdrv_qed_copy_header(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 15/24] qcow2: split up the creation of new refcount table from the act of checking it, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 14/24] qcow2: fix typo in documentation for qcow2_get_cluster_offset(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 16/24] qcow2: add qcow2_drop_leaked_clusters(),
Devin Nakamura <=
- [Qemu-devel] [RFC 17/24] qcow2: add qcow2_get_mapping, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 18/24] qcow2: add qcow2_map, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 19/24] qcow2: add qcow2_copy_header(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 21/24] qcow2: add qcow2_open_conversion_target(), Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 23/24] qemu-io: add setmap command, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 24/24] qemu-img: add inplace conversion to qemu-img, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 22/24] qemu-io: make map command use new block mapping function, Devin Nakamura, 2011/07/29
- [Qemu-devel] [RFC 20/24] qcow2: add get_conversion_options(), Devin Nakamura, 2011/07/29