summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhillip Susi <psusi@ubuntu.com>2014-04-26 21:16:15 -0400
committerPhillip Susi <psusi@ubuntu.com>2014-05-22 19:56:36 -0400
commitdfdd8b0dd99b7fa990f40a3d3a225c5b3ef13c57 (patch)
tree5f94bf048b4822b041190fc83771fa59b6c75f91
parent9e07d797b18609613c53ceb2dabbb5e69d961186 (diff)
downloadparted-dfdd8b0dd99b7fa990f40a3d3a225c5b3ef13c57.tar.gz
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.
-rw-r--r--NEWS3
-rw-r--r--libparted/arch/linux.c11
2 files changed, 12 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index bc852e2..3dc39fd 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,9 @@ GNU parted NEWS -*- outline -*-
** Bug Fixes
+ 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)