diff --git a/parted-gpt-mbr-sync.patch b/parted-gpt-mbr-sync.patch index 31c3366..2d5308e 100644 --- a/parted-gpt-mbr-sync.patch +++ b/parted-gpt-mbr-sync.patch @@ -2,48 +2,19 @@ Index: libparted/labels/gpt.c =================================================================== --- libparted/labels/gpt.c.orig +++ libparted/labels/gpt.c -@@ -46,6 +46,8 @@ +@@ -46,6 +46,11 @@ # define _(String) (String) #endif /* ENABLE_NLS */ ++/* IA64 always has a properly working EFI implementation */ ++#ifndef __ia64__ +#define GPT_SYNC_MBR ++#endif + #define EFI_PMBR_OSTYPE_EFI 0xEE #define MSDOS_MBR_SIGNATURE 0xaa55 -@@ -402,6 +404,7 @@ guid_cmp (efi_guid_t left, efi_guid_t ri - return memcmp(&left, &right, sizeof(efi_guid_t)); - } - -+#ifndef GPT_SYNC_MBR - /* checks if 'mbr' is a protective MBR partition table */ - static inline int - _pmbr_is_valid (const LegacyMBR_t* mbr) -@@ -418,6 +421,7 @@ _pmbr_is_valid (const LegacyMBR_t* mbr) - } - return 0; - } -+#endif - - static int - gpt_probe (const PedDevice * dev) -@@ -445,6 +449,7 @@ gpt_probe (const PedDevice * dev) - if (!gpt_sig_found) - return 0; - -+#ifndef GPT_SYNC_MBR - if (ped_device_read(dev, &legacy_mbr, 0, GPT_HEADER_SECTORS)) { - if (!_pmbr_is_valid (&legacy_mbr)) { - int ex_status = ped_exception_throw ( -@@ -463,6 +468,7 @@ gpt_probe (const PedDevice * dev) - return 0; - } - } -+#endif - - return 1; - } -@@ -928,15 +934,51 @@ error: +@@ -928,15 +933,66 @@ error: return 0; } @@ -61,6 +32,21 @@ Index: libparted/labels/gpt.c + return 0x83; // Everything else is Linux +} + ++static inline PedPartition* ++_find_first_part (PedDisk* disk) ++{ ++ PedPartition *retval = NULL, *part; ++ uint64_t lowest_end = 0xffffffffffffffff; ++ while (part = ped_disk_next_partition (disk, part)) { ++ if (part->geom.start == 0 || part->type == PED_PARTITION_METADATA ++ || part->type == PED_PARTITION_FREESPACE) ++ continue; ++ if (part->geom.end < lowest_end) ++ retval = part; ++ } ++ return retval; ++} ++ +static inline uint32_t +_part_32bitmax (uint64_t in) +{ @@ -80,8 +66,8 @@ Index: libparted/labels/gpt.c + PedDevice * dev = disk->dev; LegacyMBR_t pmbr; +#ifdef GPT_SYNC_MBR -+ int i; -+ PedPartition* part = NULL; ++ int i,pmbr_id; ++ PedPartition *part = NULL, *esp; +#endif +#ifdef GPT_SYNC_MBR @@ -96,18 +82,38 @@ Index: libparted/labels/gpt.c pmbr.PartitionRecord[0].OSType = EFI_PMBR_OSTYPE_EFI; pmbr.PartitionRecord[0].StartSector = 1; pmbr.PartitionRecord[0].EndHead = 0xFE; -@@ -947,6 +989,31 @@ _write_pmbr (PedDevice * dev) +@@ -947,6 +1003,51 @@ _write_pmbr (PedDevice * dev) pmbr.PartitionRecord[0].SizeInLBA = PED_CPU_TO_LE32(0xFFFFFFFF); else pmbr.PartitionRecord[0].SizeInLBA = PED_CPU_TO_LE32(dev->length - 1UL); +#else -+ /* sync the first 4 GPT entries to MBR primary partitions */ -+ for (i=0; i < 4; i++) { ++ /* Search for an EFI System Partition */ ++ esp = _find_first_part(disk); ++ if (esp && strncmp (esp->fs_type->name, "fat", 3) != 0) ++ esp = NULL; ++ ++ pmbr_id = 3; ++ if (esp) ++ pmbr_id = 0; ++ ++ /* Write a pseudo-PMBR so Linux is happy */ ++ pmbr.PartitionRecord[pmbr_id].OSType = EFI_PMBR_OSTYPE_EFI; ++ pmbr.PartitionRecord[pmbr_id].StartSector = 1; ++ pmbr.PartitionRecord[pmbr_id].EndHead = 0xFE; ++ pmbr.PartitionRecord[pmbr_id].EndSector = 0xFF; ++ pmbr.PartitionRecord[pmbr_id].EndTrack = 0xFF; ++ pmbr.PartitionRecord[pmbr_id].StartingLBA = PED_CPU_TO_LE32(1); ++ pmbr.PartitionRecord[pmbr_id].SizeInLBA = 1; ++ if (esp) ++ pmbr.PartitionRecord[pmbr_id].SizeInLBA = esp->geom.end - 1; ++ ++ /* sync the first 3 GPT entries to MBR primary partitions */ ++ for (i=0; i < 3; i++) { + part = ped_disk_next_partition (disk, part); + if (part == NULL) + break; + /* we might get a starting garbage partition */ -+ if (part->geom.start == 0 || part->type == PED_PARTITION_METADATA || part->type == PED_PARTITION_FREESPACE) { ++ if (part->geom.start == 0 || part->type == PED_PARTITION_METADATA || part->type == PED_PARTITION_FREESPACE || part == esp) { + i--; + continue; + } @@ -128,7 +134,7 @@ Index: libparted/labels/gpt.c return ped_device_write (dev, &pmbr, GPT_PMBR_LBA, GPT_PMBR_SECTORS); } -@@ -1050,7 +1117,7 @@ gpt_write(const PedDisk * disk) +@@ -1050,7 +1151,7 @@ gpt_write(const PedDisk * disk) ptes_crc = efi_crc32 (ptes, ptes_size); /* Write protective MBR */ diff --git a/parted.changes b/parted.changes index dd1e279..221fd60 100644 --- a/parted.changes +++ b/parted.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Mon Aug 11 16:27:24 CEST 2008 - agraf@suse.de + +- make GPT sync more compatible: + - don't sync on IA64 + - always add a partition with partition type 0xee, so Linux is happy + - protect the EFI System Partition if available + ------------------------------------------------------------------- Tue Jul 22 13:27:27 CEST 2008 - hare@suse.de diff --git a/parted.spec b/parted.spec index 70e716c..fa5b4ea 100644 --- a/parted.spec +++ b/parted.spec @@ -2,9 +2,16 @@ # spec file for package parted (Version 1.8.8) # # Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. -# This file and all modifications and additions to the pristine -# package are under the same license as the package itself. # +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + # Please submit bugfixes or comments via http://bugs.opensuse.org/ # @@ -18,7 +25,7 @@ License: GPL v2 or later Group: System/Filesystems Summary: GNU partitioner Version: 1.8.8 -Release: 56 +Release: 65 Source0: %{name}-%{version}.tar.bz2 Patch: always-resize-part.dif Patch1: parted-type.patch @@ -136,6 +143,11 @@ rm -rf "$RPM_BUILD_ROOT" %{_libdir}/*.so %changelog +* Mon Aug 11 2008 agraf@suse.de +- make GPT sync more compatible: + - don't sync on IA64 + - always add a partition with partition type 0xee, so Linux is happy + - protect the EFI System Partition if available * Tue Jul 22 2008 hare@suse.de - Fix fdasd.c compilation - Don't include broken inttypes.h