From 83fe59dd092c5ee7b4f07f23ca4898aa1ac95e0e Mon Sep 17 00:00:00 2001
From: Nikos Skalkotos <skalkoto@grnet.gr>
Date: Sat, 29 Dec 2012 18:30:02 +0200
Subject: [PATCH] In bundle_volume truncate img file after shrinking

---
 image_creator/bundle_volume.py | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/image_creator/bundle_volume.py b/image_creator/bundle_volume.py
index afcc6b8..9f08276 100644
--- a/image_creator/bundle_volume.py
+++ b/image_creator/bundle_volume.py
@@ -219,7 +219,7 @@ class BundleVolume():
             image_disk.setPartitionGeometry(
                 image_disk.getPartitionBySector(last.start),
                 parted.Constraint(device=image_disk.device),
-                start=last.start, end=last.end)
+                start=last.start, end=part_end)
             image_disk.commit()
 
             # Parted may have changed this for better alignment
@@ -228,7 +228,7 @@ class BundleVolume():
             partitions[-1] = last
 
             # Leave 2048 blocks at the end.
-            new_end = new_size + 2048
+            new_end = part_end + 2048
 
             if last.type == parted.PARTITION_LOGICAL:
                 # Fix the extended partition
@@ -239,6 +239,7 @@ class BundleVolume():
                     ext.geometry.start, end=last.end)
                 image_disk.commit()
 
+        image_dev.destroy()
         return new_end
 
     def _map_partition(self, dev, num, start, end):
@@ -417,6 +418,15 @@ class BundleVolume():
 
         self._create_filesystems(image)
 
+        # Truncate image to the new size. I counldn't find a better way to do
+        # this. It seems that python's high level functions work in a different
+        # way.
+        fd = os.open(image, os.O_RDWR)
+        try:
+            os.ftruncate(fd, size)
+        finally:
+            os.close(fd)
+
         return image
 
 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :
-- 
GitLab