Now after shrinking the image, at the end of the image file, there might be a
tail that probably will never be used. So we can find the last used cluster and
cut the tail.
Signed-off-by: Pavel Butsykin <address@hidden>
---
block/qcow2-refcount.c | 21 +++++++++++++++++++++
block/qcow2.c | 19 +++++++++++++++++++
block/qcow2.h | 1 +
3 files changed, 41 insertions(+)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 88d5a3f1ad..5e221a166c 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -3181,3 +3181,24 @@ out:
g_free(reftable_tmp);
return ret;
}
+
+int64_t qcow2_get_last_cluster(BlockDriverState *bs, int64_t size)
+{
+ BDRVQcow2State *s = bs->opaque;
+ int64_t i, last_cluster, nb_clusters = size_to_clusters(s, size);
+ uint64_t refcount;
+
+ for (i = 0, last_cluster = 0; i < nb_clusters; i++) {
+ int ret = qcow2_get_refcount(bs, i, &refcount);
+ if (ret < 0) {
+ fprintf(stderr, "Can't get refcount for cluster %" PRId64 ": %s\n",
+ i, strerror(-ret));
+ continue;
+ }
+
+ if (refcount > 0) {
+ last_cluster = i;
+ }
+ }
+ return last_cluster;
+}