Add support for GRUB / BIOS partition in GPT.
Robert Millan
rmh at aybabtu.com
Mon Feb 25 20:51:13 UTC 2008
---
include/parted/disk.h | 7 ++--
libparted/disk.c | 2 +
libparted/labels/gpt.c | 34 +++++++++++++++++++-
tests/Makefile.am | 3 +-
tests/t5000-tags.sh | 81 ++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 121 insertions(+), 6 deletions(-)
diff --git a/include/parted/disk.h b/include/parted/disk.h
index b82ea0f..1b0133d 100644
--- a/include/parted/disk.h
+++ b/include/parted/disk.h
@@ -1,6 +1,6 @@
/*
libparted - a library for manipulating disk partitions
- Copyright (C) 1999, 2000, 2001, 2002, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -52,10 +52,11 @@ enum _PedPartitionFlag {
PED_PARTITION_HPSERVICE=8,
PED_PARTITION_PALO=9,
PED_PARTITION_PREP=10,
- PED_PARTITION_MSFT_RESERVED=11
+ PED_PARTITION_MSFT_RESERVED=11,
+ PED_PARTITION_BIOS_GRUB=12
};
#define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT
-#define PED_PARTITION_LAST_FLAG PED_PARTITION_MSFT_RESERVED
+#define PED_PARTITION_LAST_FLAG PED_PARTITION_BIOS_GRUB
enum _PedDiskTypeFeature {
PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */
diff --git a/libparted/disk.c b/libparted/disk.c
index ec09996..159d5ba 100644
--- a/libparted/disk.c
+++ b/libparted/disk.c
@@ -2227,6 +2227,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag)
switch (flag) {
case PED_PARTITION_BOOT:
return N_("boot");
+ case PED_PARTITION_BIOS_GRUB:
+ return N_("bios_grub");
case PED_PARTITION_ROOT:
return N_("root");
case PED_PARTITION_SWAP:
diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
index 4dc4f10..cb90d11 100644
--- a/libparted/labels/gpt.c
+++ b/libparted/labels/gpt.c
@@ -4,7 +4,7 @@
original version by Matt Domsch <Matt_Domsch at dell.com>
Disclaimed into the Public Domain
- Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007
+ Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
EFI GUID Partition Table handling
@@ -86,6 +86,10 @@ typedef struct {
((efi_guid_t) { PED_CPU_TO_LE32 (0xC12A7328), PED_CPU_TO_LE16 (0xF81F), \
PED_CPU_TO_LE16 (0x11d2), 0xBA, 0x4B, \
{ 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }})
+#define PARTITION_BIOS_GRUB_GUID \
+ ((efi_guid_t) { PED_CPU_TO_LE32 (0x21686148), PED_CPU_TO_LE16 (0x6449), \
+ PED_CPU_TO_LE16 (0x6E6f), 0x74, 0x4E, \
+ { 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 }})
#define LEGACY_MBR_PARTITION_GUID \
((efi_guid_t) { PED_CPU_TO_LE32 (0x024DEE41), PED_CPU_TO_LE16 (0x33E7), \
PED_CPU_TO_LE16 (0x11d3, 0x9D, 0x69, \
@@ -245,6 +249,7 @@ typedef struct _GPTPartitionData {
int lvm;
int raid;
int boot;
+ int bios_grub;
int hp_service;
int hidden;
int msftres;
@@ -753,13 +758,16 @@ _parse_part_entry (PedDisk* disk, GuidPartitionEntry_t* pte)
gpt_part_data->lvm = gpt_part_data->raid
= gpt_part_data->boot = gpt_part_data->hp_service
- = gpt_part_data->hidden = gpt_part_data->msftres = 0;
+ = gpt_part_data->hidden = gpt_part_data->msftres
+ = gpt_part_data->bios_grub = 0;
if (pte->Attributes.RequiredToFunction & 0x1)
gpt_part_data->hidden = 1;
if (!guid_cmp (gpt_part_data->type, PARTITION_SYSTEM_GUID))
gpt_part_data->boot = 1;
+ else if (!guid_cmp (gpt_part_data->type, PARTITION_BIOS_GRUB_GUID))
+ gpt_part_data->bios_grub = 1;
else if (!guid_cmp (gpt_part_data->type, PARTITION_RAID_GUID))
gpt_part_data->raid = 1;
else if (!guid_cmp (gpt_part_data->type, PARTITION_LVM_GUID))
@@ -1130,6 +1138,7 @@ gpt_partition_new (const PedDisk* disk,
gpt_part_data->lvm = 0;
gpt_part_data->raid = 0;
gpt_part_data->boot = 0;
+ gpt_part_data->bios_grub = 0;
gpt_part_data->hp_service = 0;
gpt_part_data->hidden = 0;
gpt_part_data->msftres = 0;
@@ -1208,6 +1217,10 @@ gpt_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type)
gpt_part_data->type = PARTITION_SYSTEM_GUID;
return 1;
}
+ if (gpt_part_data->bios_grub) {
+ gpt_part_data->type = PARTITION_BIOS_GRUB_GUID;
+ return 1;
+ }
if (gpt_part_data->hp_service) {
gpt_part_data->type = PARTITION_HPSERVICE_GUID;
return 1;
@@ -1306,6 +1319,16 @@ gpt_partition_set_flag(PedPartition *part,
if (state)
gpt_part_data->raid
= gpt_part_data->lvm
+ = gpt_part_data->bios_grub
+ = gpt_part_data->hp_service
+ = gpt_part_data->msftres = 0;
+ return gpt_partition_set_system (part, part->fs_type);
+ case PED_PARTITION_BIOS_GRUB:
+ gpt_part_data->bios_grub = state;
+ if (state)
+ gpt_part_data->raid
+ = gpt_part_data->lvm
+ = gpt_part_data->boot
= gpt_part_data->hp_service
= gpt_part_data->msftres = 0;
return gpt_partition_set_system (part, part->fs_type);
@@ -1314,6 +1337,7 @@ gpt_partition_set_flag(PedPartition *part,
if (state)
gpt_part_data->boot
= gpt_part_data->lvm
+ = gpt_part_data->bios_grub
= gpt_part_data->hp_service
= gpt_part_data->msftres = 0;
return gpt_partition_set_system (part, part->fs_type);
@@ -1322,6 +1346,7 @@ gpt_partition_set_flag(PedPartition *part,
if (state)
gpt_part_data->boot
= gpt_part_data->raid
+ = gpt_part_data->bios_grub
= gpt_part_data->hp_service
= gpt_part_data->msftres = 0;
return gpt_partition_set_system (part, part->fs_type);
@@ -1331,6 +1356,7 @@ gpt_partition_set_flag(PedPartition *part,
gpt_part_data->boot
= gpt_part_data->raid
= gpt_part_data->lvm
+ = gpt_part_data->bios_grub
= gpt_part_data->msftres = 0;
return gpt_partition_set_system (part, part->fs_type);
case PED_PARTITION_MSFT_RESERVED:
@@ -1339,6 +1365,7 @@ gpt_partition_set_flag(PedPartition *part,
gpt_part_data->boot
= gpt_part_data->raid
= gpt_part_data->lvm
+ = gpt_part_data->bios_grub
= gpt_part_data->hp_service = 0;
return gpt_partition_set_system (part, part->fs_type);
case PED_PARTITION_HIDDEN:
@@ -1367,6 +1394,8 @@ gpt_partition_get_flag(const PedPartition *part, PedPartitionFlag flag)
return gpt_part_data->lvm;
case PED_PARTITION_BOOT:
return gpt_part_data->boot;
+ case PED_PARTITION_BIOS_GRUB:
+ return gpt_part_data->bios_grub;
case PED_PARTITION_HPSERVICE:
return gpt_part_data->hp_service;
case PED_PARTITION_MSFT_RESERVED:
@@ -1390,6 +1419,7 @@ gpt_partition_is_flag_available(const PedPartition * part,
case PED_PARTITION_RAID:
case PED_PARTITION_LVM:
case PED_PARTITION_BOOT:
+ case PED_PARTITION_BIOS_GRUB:
case PED_PARTITION_HPSERVICE:
case PED_PARTITION_MSFT_RESERVED:
case PED_PARTITION_HIDDEN:
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e493e46..d9b0878 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -9,7 +9,8 @@ TESTS = \
t3000-constraints.sh \
t3100-resize-ext2-partion.sh \
t4100-msdos-partition-limits.sh \
- t4100-dvh-partition-limits.sh
+ t4100-dvh-partition-limits.sh \
+ t5000-tags.sh
EXTRA_DIST = \
$(TESTS) test-lib.sh mkdtemp
diff --git a/tests/t5000-tags.sh b/tests/t5000-tags.sh
new file mode 100755
index 0000000..dab48ae
--- /dev/null
+++ b/tests/t5000-tags.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# Copyright (C) 2007,2008 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+test_description="test bios_grub flag in gpt labels"
+
+. ./init.sh
+
+dev=loop-file
+
+test_expect_success \
+ "setup: create zeroed device" \
+ '{ dd if=/dev/zero bs=1024 count=64; } > $dev'
+
+test_expect_success \
+ 'create gpt label' \
+ 'parted -s $dev mklabel gpt >out 2>&1'
+
+test_expect_success \
+ 'add a partition' \
+ 'parted -s $dev mkpart primary 0 1 >>out 2>&1'
+
+test_expect_success \
+ 'print the table (before manual modification)' \
+ 'parted -s $dev print >>out 2>&1'
+
+# Using bios_boot_magic='\x48\x61' looks nicer, but isn't portable.
+# dash's builtin printf doesn't recognize such \xHH hexadecimal escapes.
+bios_boot_magic='\110\141\150\41\111\144\157\156\164\116\145\145\144\105\106\111'
+
+printf "$bios_boot_magic" | dd of=$dev bs=1024 seek=1 conv=notrunc
+
+test_expect_success \
+ 'print the table (after manual modification)' \
+ 'parted -s $dev print >>out 2>&1'
+
+pwd=`pwd`
+
+fail=0
+{
+ cat <<EOF
+Model: (file)
+Disk .../$dev: 65.5kB
+Sector size (logical/physical): 512B/512B
+Partition Table: gpt
+
+Number Start End Size File system Name Flags
+ 1 17.4kB 48.6kB 31.2kB primary
+
+Model: (file)
+Disk .../$dev: 65.5kB
+Sector size (logical/physical): 512B/512B
+Partition Table: gpt
+
+Number Start End Size File system Name Flags
+ 1 17.4kB 48.6kB 31.2kB primary bios_grub
+
+EOF
+} > exp || fail=1
+
+test_expect_success \
+ 'prepare actual and expected output' \
+ 'test $fail = 0 &&
+ mv out o2 && sed "s,^Disk .*/$dev:,Disk .../$dev:," o2 > out'
+
+test_expect_success 'check for expected output' '$compare out exp'
+
+test_done
--
1.4.4.4
--X1bOJ3K7DJ5YkBrT--
More information about the parted-devel
mailing list