[parted] Add upstream patched for legacy_boot and PED_ASSERT

Brian C. Lane bcl at fedoraproject.org
Sat Mar 12 01:28:21 UTC 2011


commit 51e87b09ccac9830737454fd8b4ef1a655451454
Author: Brian C. Lane <bcl at redhat.com>
Date:   Fri Mar 11 17:25:06 2011 -0800

    Add upstream patched for legacy_boot and PED_ASSERT
    
    - Add support for legacy_boot flag for GPT partitions (680562)
    - Remove PED_ASSERT for dos geometry calculations (585468)

 parted-2.3-Add-GPT-partition-attribute-bits.patch  |   37 +++++
 ...3-Add-legacy_boot-flag-for-GPT-parititons.patch |  159 ++++++++++++++++++++
 ...ove-PED_ASSERT-from-dos-geometry-checking.patch |   82 ++++++++++
 parted.spec                                        |    9 +-
 4 files changed, 286 insertions(+), 1 deletions(-)
---
diff --git a/parted-2.3-Add-GPT-partition-attribute-bits.patch b/parted-2.3-Add-GPT-partition-attribute-bits.patch
new file mode 100644
index 0000000..07f8d0c
--- /dev/null
+++ b/parted-2.3-Add-GPT-partition-attribute-bits.patch
@@ -0,0 +1,37 @@
+From e60879e2b781980842f940c39993cccc30cfc67b Mon Sep 17 00:00:00 2001
+From: Brian C. Lane <bcl at redhat.com>
+Date: Thu, 24 Feb 2011 17:02:45 -0800
+Subject: [PATCH 1/2] Add GPT partition attribute bits
+
+Add NoBlockIOProtocol and LegacyBIOSBootable flags to the GPT partition
+Attributes entry.
+---
+ libparted/labels/gpt.c |    8 ++++++--
+ 1 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
+index b9ed5c3..0396ad7 100644
+--- a/libparted/labels/gpt.c
++++ b/libparted/labels/gpt.c
+@@ -163,12 +163,16 @@ struct __attribute__ ((packed)) _GuidPartitionEntryAttributes_t
+ {
+ #ifdef __GNUC__			/* XXX narrow this down to !TinyCC */
+   uint64_t RequiredToFunction:1;
+-  uint64_t Reserved:47;
++  uint64_t NoBlockIOProtocol:1;
++  uint64_t LegacyBIOSBootable:1;
++  uint64_t Reserved:45;
+   uint64_t GuidSpecific:16;
+ #else
+ #       warning "Using crippled partition entry type"
+   uint32_t RequiredToFunction:1;
+-  uint32_t Reserved:32;
++  uint32_t NoBlockIOProtocol:1;
++  uint32_t LegacyBIOSBootable:1;
++  uint32_t Reserved:30;
+   uint32_t LOST:5;
+   uint32_t GuidSpecific:16;
+ #endif
+-- 
+1.7.4
+
diff --git a/parted-2.3-Add-legacy_boot-flag-for-GPT-parititons.patch b/parted-2.3-Add-legacy_boot-flag-for-GPT-parititons.patch
new file mode 100644
index 0000000..490e5b8
--- /dev/null
+++ b/parted-2.3-Add-legacy_boot-flag-for-GPT-parititons.patch
@@ -0,0 +1,159 @@
+From df743ae96161bcd260937424c61e24b36ef18fe1 Mon Sep 17 00:00:00 2001
+From: Brian C. Lane <bcl at redhat.com>
+Date: Fri, 25 Feb 2011 10:56:32 -0800
+Subject: [PATCH 2/2] Add legacy_boot flag for GPT parititons
+
+Add support for the Legacy BIOS Bootable flag in the GPT
+Attribute field. This is used by software like syslinux to
+determine which partition to boot when in BIOS mode.
+
+See Page 105, Table 19 Bit 2 of the UEFI Spec 2.3 book.
+
+* doc/C/parted.8: document legacy_boot
+* doc/parted.texi: document legacy_boot
+* include/parted/disk.h: Add PED_PARTITION_LEGACY_BOOT flag
+* libparted/disk.c (ped_partition_flag_get_name): Add legacy_boot flag
+* libparted/labels/gpt.c (_parse_part_entry,
+  _partition_generate_part_entry, gpt_partition_new,
+  gpt_partition_set_flag, gpt_partition_get_flag,
+  gpt_partition_is_flag_available): Add legacy_boot flag support
+---
+ doc/C/parted.8         |    2 +-
+ doc/parted.texi        |    4 ++++
+ include/parted/disk.h  |    5 +++--
+ libparted/disk.c       |    2 ++
+ libparted/labels/gpt.c |   13 +++++++++++++
+ 5 files changed, 23 insertions(+), 3 deletions(-)
+
+diff --git a/doc/C/parted.8 b/doc/C/parted.8
+index 2a8992e..f4b940c 100644
+--- a/doc/C/parted.8
++++ b/doc/C/parted.8
+@@ -132,7 +132,7 @@ or an LVM logical volume if necessary.
+ .B set \fIpartition\fP \fIflag\fP \fIstate\fP
+ Change the state of the \fIflag\fP on \fIpartition\fP to \fIstate\fP.
+ Supported flags are: "boot", "root", "swap", "hidden", "raid", "lvm", "lba",
+-and "palo".
++"legacy_boot" and "palo".
+ \fIstate\fP should be either "on" or "off".
+ .TP
+ .B unit \fIunit\fP
+diff --git a/doc/parted.texi b/doc/parted.texi
+index 1111efd..1a57c07 100644
+--- a/doc/parted.texi
++++ b/doc/parted.texi
+@@ -1049,6 +1049,10 @@ depending on what disk label you are using:
+ (GPT) - Enable this to record that the selected partition is a
+ GRUB BIOS partition.
+ 
++ at item legacy_boot
++(GPT) - this flag is used to tell special purpose software that the GPT
++partition may be bootable.
++
+ @item boot
+ (Mac, MS-DOS, PC98) - should be enabled if you want to boot off the
+ partition.  The semantics vary between disk labels.  For MS-DOS disk
+diff --git a/include/parted/disk.h b/include/parted/disk.h
+index 3a1450c..dd461fb 100644
+--- a/include/parted/disk.h
++++ b/include/parted/disk.h
+@@ -69,10 +69,11 @@ enum _PedPartitionFlag {
+         PED_PARTITION_MSFT_RESERVED=11,
+         PED_PARTITION_BIOS_GRUB=12,
+         PED_PARTITION_APPLE_TV_RECOVERY=13,
+-        PED_PARTITION_DIAG=14
++        PED_PARTITION_DIAG=14,
++        PED_PARTITION_LEGACY_BOOT=15
+ };
+ #define PED_PARTITION_FIRST_FLAG        PED_PARTITION_BOOT
+-#define PED_PARTITION_LAST_FLAG         PED_PARTITION_DIAG
++#define PED_PARTITION_LAST_FLAG         PED_PARTITION_LEGACY_BOOT
+ 
+ enum _PedDiskTypeFeature {
+         PED_DISK_TYPE_EXTENDED=1,       /**< supports extended partitions */
+diff --git a/libparted/disk.c b/libparted/disk.c
+index 376571e..f6f795f 100644
+--- a/libparted/disk.c
++++ b/libparted/disk.c
+@@ -2442,6 +2442,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag)
+                 return N_("atvrecv");
+         case PED_PARTITION_DIAG:
+                 return N_("diag");
++        case PED_PARTITION_LEGACY_BOOT:
++                return N_("legacy_boot");
+ 
+ 	default:
+ 		ped_exception_throw (
+diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
+index 0396ad7..31d41bb 100644
+--- a/libparted/labels/gpt.c
++++ b/libparted/labels/gpt.c
+@@ -278,6 +278,7 @@ typedef struct _GPTPartitionData
+   int msftres;
+   int atvrecv;
+   int msftrecv;
++  int legacy_boot;
+ } GPTPartitionData;
+ 
+ static PedDiskType gpt_disk_type;
+@@ -783,10 +784,13 @@ _parse_part_entry (PedDisk *disk, GuidPartitionEntry_t *pte)
+     = gpt_part_data->boot = gpt_part_data->hp_service
+     = gpt_part_data->hidden = gpt_part_data->msftres
+     = gpt_part_data->msftrecv
++    = gpt_part_data->legacy_boot
+     = gpt_part_data->bios_grub = gpt_part_data->atvrecv = 0;
+ 
+   if (pte->Attributes.RequiredToFunction & 0x1)
+     gpt_part_data->hidden = 1;
++  if (pte->Attributes.LegacyBIOSBootable & 0x1)
++    gpt_part_data->legacy_boot = 1;
+ 
+   if (!guid_cmp (gpt_part_data->type, PARTITION_SYSTEM_GUID))
+     gpt_part_data->boot = 1;
+@@ -1163,6 +1167,8 @@ _partition_generate_part_entry (PedPartition *part, GuidPartitionEntry_t *pte)
+ 
+   if (gpt_part_data->hidden)
+     pte->Attributes.RequiredToFunction = 1;
++  if (gpt_part_data->legacy_boot)
++    pte->Attributes.LegacyBIOSBootable= 1;
+ 
+   for (i = 0; i < 72 / sizeof (efi_char16_t); i++)
+     pte->PartitionName[i]
+@@ -1305,6 +1311,7 @@ gpt_partition_new (const PedDisk *disk,
+   gpt_part_data->msftres = 0;
+   gpt_part_data->msftrecv = 0;
+   gpt_part_data->atvrecv = 0;
++  gpt_part_data->legacy_boot = 0;
+   uuid_generate ((unsigned char *) &gpt_part_data->uuid);
+   swap_uuid_and_efi_guid ((unsigned char *) (&gpt_part_data->uuid));
+   memset (gpt_part_data->name, 0, sizeof gpt_part_data->name);
+@@ -1592,6 +1599,9 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state)
+     case PED_PARTITION_HIDDEN:
+       gpt_part_data->hidden = state;
+       return 1;
++    case PED_PARTITION_LEGACY_BOOT:
++      gpt_part_data->legacy_boot = state;
++      return 1;
+     case PED_PARTITION_SWAP:
+     case PED_PARTITION_ROOT:
+     case PED_PARTITION_LBA:
+@@ -1628,6 +1638,8 @@ gpt_partition_get_flag (const PedPartition *part, PedPartitionFlag flag)
+       return gpt_part_data->atvrecv;
+     case PED_PARTITION_HIDDEN:
+       return gpt_part_data->hidden;
++    case PED_PARTITION_LEGACY_BOOT:
++      return gpt_part_data->legacy_boot;
+     case PED_PARTITION_SWAP:
+     case PED_PARTITION_LBA:
+     case PED_PARTITION_ROOT:
+@@ -1652,6 +1664,7 @@ gpt_partition_is_flag_available (const PedPartition *part,
+     case PED_PARTITION_DIAG:
+     case PED_PARTITION_APPLE_TV_RECOVERY:
+     case PED_PARTITION_HIDDEN:
++    case PED_PARTITION_LEGACY_BOOT:
+       return 1;
+     case PED_PARTITION_SWAP:
+     case PED_PARTITION_ROOT:
+-- 
+1.7.4
+
diff --git a/parted-2.3-Remove-PED_ASSERT-from-dos-geometry-checking.patch b/parted-2.3-Remove-PED_ASSERT-from-dos-geometry-checking.patch
new file mode 100644
index 0000000..125a275
--- /dev/null
+++ b/parted-2.3-Remove-PED_ASSERT-from-dos-geometry-checking.patch
@@ -0,0 +1,82 @@
+From 244b1b25a12198efb076e8c65be77b5750776583 Mon Sep 17 00:00:00 2001
+From: Brian C. Lane <bcl at redhat.com>
+Date: Wed, 2 Mar 2011 14:36:32 -0800
+Subject: [PATCH 1/2] Remove PED_ASSERT from dos geometry checking
+
+The CHS geometry values are calculated based on the existing partition
+information. The values can't always be calculated, and the partition
+may be corrupt so instead of throwing an assertion just return 0 and
+carry on.
+
+I left the logic for the PED_ASSERT checks the same so that it is clear
+that the logic has not changed, it just returns 0 now.
+
+* libparted/labels/dos.c (probe_partition_for_geom): remove PED_ASSERT
+---
+ libparted/labels/dos.c |   30 ++++++++++++++++++++----------
+ 1 files changed, 20 insertions(+), 10 deletions(-)
+
+diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c
+index b657c34..ba80896 100644
+--- a/libparted/labels/dos.c
++++ b/libparted/labels/dos.c
+@@ -720,8 +720,10 @@ probe_partition_for_geom (const PedPartition* part, PedCHSGeometry* bios_geom)
+ 	if (cyl_size * denum != a_*H - A_*h)
+ 		return 0;
+ 
+-	PED_ASSERT (cyl_size > 0, return 0);
+- 	PED_ASSERT (cyl_size <= 255 * 63, return 0);
++	if (!(cyl_size > 0))
++		return 0;
++	if (!(cyl_size <= 255 * 63))
++		return 0;
+ 
+ 	if (h > 0)
+ 		head_size = ( a_ - c * cyl_size ) / h;
+@@ -732,18 +734,24 @@ probe_partition_for_geom (const PedPartition* part, PedCHSGeometry* bios_geom)
+ 		PED_ASSERT (0, return 0);
+ 	}
+ 
+-	PED_ASSERT (head_size > 0, return 0);
+-	PED_ASSERT (head_size <= 63, return 0);
++	if (!(head_size > 0))
++		return 0;
++	if (!(head_size <= 63))
++		return 0;
+ 
+ 	cylinders = part->disk->dev->length / cyl_size;
+ 	heads = cyl_size / head_size;
+ 	sectors = head_size;
+ 
+-	PED_ASSERT (heads > 0, return 0);
+-	PED_ASSERT (heads < 256, return 0);
++	if (!(heads > 0))
++		return 0;
++	if (!(heads < 256))
++		return 0;
+ 
+-	PED_ASSERT (sectors > 0, return 0);
+-	PED_ASSERT (sectors <= 63, return 0);
++	if (!(sectors > 0))
++		return 0;
++	if (!(sectors <= 63))
++		return 0;
+ 
+ 	/* Some broken OEM partitioning program(s) seem to have an out-by-one
+ 	 * error on the end of partitions.  We should offer to fix the
+@@ -752,8 +760,10 @@ probe_partition_for_geom (const PedPartition* part, PedCHSGeometry* bios_geom)
+ 	if (((C + 1) * heads + H) * sectors + S == A)
+ 		C++;
+ 
+-	PED_ASSERT ((c * heads + h) * sectors + s == a, return 0);
+-	PED_ASSERT ((C * heads + H) * sectors + S == A, return 0);
++	if (!((c * heads + h) * sectors + s == a))
++		return 0;
++	if (!((C * heads + H) * sectors + S == A))
++		return 0;
+ 
+ 	bios_geom->cylinders = cylinders;
+ 	bios_geom->heads = heads;
+-- 
+1.7.4
+
diff --git a/parted.spec b/parted.spec
index 342d653..13ef727 100644
--- a/parted.spec
+++ b/parted.spec
@@ -4,7 +4,7 @@
 Summary: The GNU disk partition manipulation program
 Name:    parted
 Version: 2.3
-Release: 7%{?dist}
+Release: 8%{?dist}
 License: GPLv3+
 Group:   Applications/System
 URL:     http://www.gnu.org/software/parted
@@ -24,6 +24,9 @@ Patch2: parted-2.3-mac-logical-sector-size.patch
 Patch3: parted-2.3-Document-align-check-642476.patch
 # Default to 1MiB partition alignment
 Patch4: parted-2.3-default-to-1MiB-alignment-when-possible.patch
+Patch5: parted-2.3-Add-GPT-partition-attribute-bits.patch
+Patch6: parted-2.3-Add-legacy_boot-flag-for-GPT-parititons.patch
+Patch7: parted-2.3-Remove-PED_ASSERT-from-dos-geometry-checking.patch
 
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: e2fsprogs-devel
@@ -149,6 +152,10 @@ fi
 
 
 %changelog
+* Fri Mar 11 2011 Brian C. Lane <bcl at redhat.com> - 2.3-8
+- Add support for legacy_boot flag for GPT partitions (680562)
+- Remove PED_ASSERT for dos geometry calculations (585468)
+
 * Wed Feb 09 2011 Brian C. Lane <bcl at redhat.com> - 2.3-7
 - Tell GCC to stop treating unused variable warnings as errors
 


More information about the scm-commits mailing list