[parted-devel] [PATCH 5/6] libparted: handle logical partitions starting immediately after the EBR

Phillip Susi psusi at ubuntu.com
Mon Oct 15 04:00:02 UTC 2012


_blkpg_add_partition() set the length of the extended partition
to 2 sectors to allow LILO to be installed there, beacuse the
linux kernel does this.  If a logical partition used that second
sector, adding it would fail beacuse of the overlap.  Now
_blkpg_add_partition() will limit the length to only the first
sector if the second is used by a logical partition.
---
 libparted/arch/linux.c                          |   10 +++++++++-
 tests/t2310-dos-extended-2-sector-min-offset.sh |   20 ++++----------------
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 5eb66ac..fd4ba32 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2482,8 +2482,16 @@ _blkpg_add_partition (PedDisk* disk, const PedPartition *part)
         memset (&linux_part, 0, sizeof (linux_part));
         linux_part.start = part->geom.start * disk->dev->sector_size;
         /* see fs/partitions/msdos.c:msdos_partition(): "leave room for LILO" */
-        if (part->type & PED_PARTITION_EXTENDED)
+        if (part->type & PED_PARTITION_EXTENDED) {
                 linux_part.length = part->geom.length == 1 ? 512 : 1024;
+                PedPartition *walk;
+                /* if the second sector is claimed by a logical partition,
+                   then there's just no room for lilo, so don't try to use it */
+                for (walk = part->part_list; walk; walk = walk->next) {
+                        if (walk->geom.start == part->geom.start+1)
+                                linux_part.length = 512;
+                }
+	}
         else
                 linux_part.length = part->geom.length * disk->dev->sector_size;
         linux_part.pno = part->num;
diff --git a/tests/t2310-dos-extended-2-sector-min-offset.sh b/tests/t2310-dos-extended-2-sector-min-offset.sh
index a09ef53..23548b3 100644
--- a/tests/t2310-dos-extended-2-sector-min-offset.sh
+++ b/tests/t2310-dos-extended-2-sector-min-offset.sh
@@ -1,8 +1,6 @@
 #!/bin/sh
-# Ensure that parted leaves at least 2 sectors between the beginning
+# Ensure that parted allows a single sector between the beginning
 # of an extended partition and the first logical partition.
-# Before parted-2.3, it could be made to leave just one, and that
-# would cause trouble with the Linux kernel.
 
 # Copyright (C) 2010-2012 Free Software Foundation, Inc.
 
@@ -35,11 +33,7 @@ cat <<EOF > exp || framework_failure
 BYT;
 $scsi_dev:2048s:scsi:512:512:msdos:Linux scsi_debug:;
 1:64s:128s:65s:::lba;
-5:66s:128s:63s:::;
-EOF
-
-cat <<EOF > err.exp || framework_failure
-Error: Partition(s) 5 on /dev/sde have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
+5:65s:128s:64s:::;
 EOF
 
 # Create a DOS label with an extended partition starting at sector 64.
@@ -48,15 +42,9 @@ parted --align=min -s $scsi_dev mkpart extended 64s 128s> out 2>&1 || fail=1
 parted -m -s $scsi_dev u s print
 compare /dev/null out || fail=1
 
-# Provoke a failure by trying to create a partition that starts just
+# Trying to create a partition that starts just
 # one sector after the start of the extended partition.
-parted --align=min -s $scsi_dev mkpart logical 65s 128s > err 2>&1 && fail=1
-compare err.exp err || fail=1
-
-# The above failed, but created the partition nonetheless.  Remove it.
-parted -s $scsi_dev rm 5 || fail=1
-
-parted --align=min -s $scsi_dev mkpart logical 66s 128s > out 2>&1 || fail=1
+parted --align=min -s $scsi_dev mkpart logical 65s 128s > out 2>&1 || fail=1
 compare /dev/null out || fail=1
 
 parted -m -s $scsi_dev u s print > out 2>&1
-- 
1.7.10.4




More information about the parted-devel mailing list