diff --git a/subiquity/common/filesystem/tests/test_gaps.py b/subiquity/common/filesystem/tests/test_gaps.py index 4d8e2749..18908627 100644 --- a/subiquity/common/filesystem/tests/test_gaps.py +++ b/subiquity/common/filesystem/tests/test_gaps.py @@ -270,7 +270,7 @@ class TestDiskGaps(unittest.TestCase): info = PartitionAlignmentData( part_align=5, min_gap_size=1, min_start_offset=0, min_end_offset=0, ebr_space=2, primary_part_limit=10) - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') p1 = make_partition(m, d, offset=0, size=50, flag='extended') p2 = make_partition(m, d, offset=5, size=45, flag='logical') self.assertEqual( @@ -364,7 +364,7 @@ class TestMovableTrailingPartitionsAndGapSize(unittest.TestCase): # 0----10---20---30---40---50---60---70---80---90---100 # #####[ p1 (extended) ] ##### # ######[ p5 (logical) ] ##### - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') make_partition(m, d, offset=10, size=40, flag='extended') p5 = make_partition(m, d, offset=12, size=38, flag='logical') self.assertEqual( @@ -378,7 +378,7 @@ class TestMovableTrailingPartitionsAndGapSize(unittest.TestCase): # 0----10---20---30---40---50---60---70---80---90---100 # #####[ p1 (extended) ][ p2 ]##### # ######[ p5 (logical) ] ##### - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') make_partition(m, d, offset=10, size=40, flag='extended') make_partition(m, d, offset=50, size=40) p5 = make_partition(m, d, offset=12, size=38, flag='logical') @@ -393,7 +393,7 @@ class TestMovableTrailingPartitionsAndGapSize(unittest.TestCase): # 0----10---20---30---40---50---60---70---80---90---100 # #####[ p1 (extended) ] ##### # ######[ p5 (logical)] ##### - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') make_partition(m, d, offset=10, size=40, flag='extended') p5 = make_partition(m, d, offset=12, size=30, flag='logical') self.assertEqual( @@ -407,7 +407,7 @@ class TestMovableTrailingPartitionsAndGapSize(unittest.TestCase): # 0----10---20---30---40---50---60---70---80---90---100 # #####[ p1 (extended) ]##### # ######[ p5 (logical)] [ p6 (logical)] ##### - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') make_partition(m, d, offset=10, size=80, flag='extended') p5 = make_partition(m, d, offset=12, size=30, flag='logical') p6 = make_partition(m, d, offset=44, size=30, flag='logical') @@ -422,7 +422,7 @@ class TestMovableTrailingPartitionsAndGapSize(unittest.TestCase): # 0----10---20---30---40---50---60---70---80---90---100 # #####[ p1 (extended) ]##### # ######[ p5 (logical)] [ p6 (logical) ] ##### - m, d = make_model_and_disk(size=100) + m, d = make_model_and_disk(size=100, ptable='dos') make_partition(m, d, offset=10, size=80, flag='extended') p5 = make_partition(m, d, offset=12, size=30, flag='logical') p6 = make_partition(m, d, offset=44, size=44, flag='logical') diff --git a/subiquity/models/filesystem.py b/subiquity/models/filesystem.py index f949d08a..1a159e28 100644 --- a/subiquity/models/filesystem.py +++ b/subiquity/models/filesystem.py @@ -688,11 +688,24 @@ class Partition(_Formattable): def __post_init__(self): if self.number is not None: return - used_nums = {part.number for part in self.device._partitions - if part.number is not None} - possible_nums = {i for i in range(1, len(self.device._partitions) + 1)} - unused_nums = sorted(list(possible_nums - used_nums)) - self.number = unused_nums.pop(0) + + def is_logical(part): + return part.flag == 'logical' + + primary_limit = self.device.alignment_data().primary_part_limit + used_nums = {p.number for p in self.device._partitions + if p.number is not None + if is_logical(p) == is_logical(self)} + if is_logical(self): + possibles = range(primary_limit + 1, 129) + else: + possibles = range(1, primary_limit + 1) + + for num in possibles: + if num not in used_nums: + self.number = num + return + raise Exception('Failed to allocate partition number') def available(self): if self.flag in ['bios_grub', 'prep'] or self.grub_device: