[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH] Fix: ArithmeticError: Could not align to closest sector (#561278)



Given a partition layout like this:

partition startsector endsector
/boot     2048        1026047
PV        1026048     xxxxxxxxxx

Then when we call getFreeRegions() parted gives us a free region with a
geometry starting at sector 63 and ending at sector 2047, which we then try to
align to our 2048 grain, which fails for the starting sector. When we fail to
align, this means that the free region is too small to create an aligned
partition in there, and we should just skip it.
---
 storage/partitioning.py |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/storage/partitioning.py b/storage/partitioning.py
index d548cdb..b9a5592 100644
--- a/storage/partitioning.py
+++ b/storage/partitioning.py
@@ -725,10 +725,22 @@ def getFreeRegions(disks):
         for f in disk.format.partedDisk.getFreeSpaceRegions():
             # device alignment fixups
             if not disk.format.alignment.isAligned(f, f.start):
-                f.start = disk.format.alignment.alignNearest(f, f.start)
+                try:
+                    f.start = disk.format.alignment.alignNearest(f, f.start)
+                except ArithmeticError, e:
+                    # This happens when the free region is too small to create
+                    # an aligned partition in it, ie the freespace between the
+                    # mbr and the first aligned partition
+                    continue
 
             if not disk.format.endAlignment.isAligned(f, f.end):
-                f.end = disk.format.endAlignment.alignNearest(f, f.end)
+                try:
+                    f.end = disk.format.endAlignment.alignNearest(f, f.end)
+                except ArithmeticError, e:
+                    # This happens when the free region is too small to create
+                    # an aligned partition in it, ie the freespace after the
+                    # last aligned partition
+                    continue
 
             if f.length > 0:
                 free.append(f)
-- 
1.6.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]