64 lines
2.4 KiB
Diff
64 lines
2.4 KiB
Diff
|
From dc291e101cf20c6493c262124debab92427c83d9 Mon Sep 17 00:00:00 2001
|
||
|
From: Phillip Susi <psusi@ubuntu.com>
|
||
|
Date: Fri, 2 May 2014 21:50:45 -0400
|
||
|
Subject: [PATCH 202/208] libparted: remove all old partitions, even if new
|
||
|
label allows less
|
||
|
|
||
|
We were limiting partition sync operations to the lesser number allowed
|
||
|
by the device, or the label. This meant that when creating a new label
|
||
|
over an old label that had more partitions than the new one allows, the
|
||
|
higher partitions would not be removed. Use the greater of the two values
|
||
|
for the remove pass, and the lesser for the add.
|
||
|
---
|
||
|
NEWS | 3 +++
|
||
|
libparted/arch/linux.c | 11 +++++++++--
|
||
|
2 files changed, 12 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/NEWS b/NEWS
|
||
|
index 0c3bad5..a81c049 100644
|
||
|
--- a/NEWS
|
||
|
+++ b/NEWS
|
||
|
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||
|
|
||
|
Fix filesystem detection on non 512 byte sector sizes
|
||
|
|
||
|
+ libparted: remove all old partitions, even if new label does not allow
|
||
|
+ as many.
|
||
|
+
|
||
|
libparted: fat and ntfs boot sectors were misdetected as dos
|
||
|
partition tables instead of being treated as a loop label.
|
||
|
|
||
|
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||
|
index ced06a3..4cbe49b 100644
|
||
|
--- a/libparted/arch/linux.c
|
||
|
+++ b/libparted/arch/linux.c
|
||
|
@@ -2823,9 +2823,10 @@ _disk_sync_part_table (PedDisk* disk)
|
||
|
get_partition_start_and_length = _kernel_get_partition_start_and_length;
|
||
|
}
|
||
|
|
||
|
- /* lpn = largest partition number. */
|
||
|
+ /* lpn = largest partition number.
|
||
|
+ * for remove pass, use greater of device or label limit */
|
||
|
if (ped_disk_get_max_supported_partition_count(disk, &lpn))
|
||
|
- lpn = PED_MIN(lpn, part_range);
|
||
|
+ lpn = PED_MAX(lpn, part_range);
|
||
|
else
|
||
|
lpn = part_range;
|
||
|
|
||
|
@@ -2876,6 +2877,12 @@ _disk_sync_part_table (PedDisk* disk)
|
||
|
if (!ok[i - 1] && errnums[i - 1] == ENXIO)
|
||
|
ok[i - 1] = 1; /* it already doesn't exist */
|
||
|
}
|
||
|
+ /* lpn = largest partition number.
|
||
|
+ * for add pass, use lesser of device or label limit */
|
||
|
+ if (ped_disk_get_max_supported_partition_count(disk, &lpn))
|
||
|
+ lpn = PED_MIN(lpn, part_range);
|
||
|
+ else
|
||
|
+ lpn = part_range;
|
||
|
for (i = 1; i <= lpn; i++) {
|
||
|
PedPartition *part = ped_disk_get_partition (disk, i);
|
||
|
if (!part)
|
||
|
--
|
||
|
1.9.0
|
||
|
|