From e6536360bd4496cee1f1bf2dfb0b11f6bdbbfd4b Mon Sep 17 00:00:00 2001 From: "Roderick W. Smith" Date: Sun, 23 Sep 2012 21:29:10 +0200 Subject: [PATCH 29/89] add support for a new Linux-specific GPT partition type code * NEWS: Describe the new Linux-specific partition type code and the new msftres flag that can be used to override this type code, should it be necessary. * doc/parted.texi: Describe of the new msftres flag. * include/parted/disk.in.h [_PedPartitionFlag]: Add PED_PARTITION_MSFT_DATA. * libparted/disk.c: Add check for PED_PARTITION_MSFT_DATA, with return of "msftdata", to ped_partition_flag_get_name() * libparted/labels/gpt.c (PARTITION_LINUX_DATA_GUID): Define. [_GPTPartitionData]: New member, "int msftdata". (_parse_part_entry): Set the msftdata flag if and only if the PARTITION_BASIC_DATA_GUID type code is in use; (gpt_partition_new): Use the PARTITION_LINUX_DATA_GUID type as the default type code (gpt_partition_set_system): Set the PARTITION_BASIC_DATA_GUID type code on partitions on which the msftdata flag is set and set PARTITION_LINUX_DATA_GUID as the type by default. Clear the msftdata flag in most tests in gpt_partition_set_flag() (gpt_partition_set_flag): Add test for PED_PARTITION_MSFT_DATA, which sets msftdata and other flags appropriately (gpt_partition_get_flag): Add test for the PED_PARTITION_MSFT_DATA item that returns the status of the msftdata flag (gpt_partition_is_flag_available): Add test for PED_PARTITION_MSFT_DATA item to * tests/t0220-gpt-msftres.sh: Accommodate the fact that now, partition table listings include "msftdata" for file systems of type NTFS and FAT*. For more discussion and justification, see http://thread.gmane.org/gmane.comp.gnu.parted.bugs/10456 --- NEWS | 19 +++++++++++++++++++ doc/parted.texi | 16 +++++++++++++++- include/parted/disk.in.h | 5 +++-- libparted/disk.c | 2 ++ libparted/labels/gpt.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- tests/t0220-gpt-msftres.sh | 3 ++- 6 files changed, 84 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index bab3afb..4c4716d 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,25 @@ GNU parted NEWS -*- outline -*- libparted: treat a disk with no pMBR as an msdos-labeled disk even when it has valid GPT headers. +** Changes in behavior + + Added new Linux-specific partition GUID type code + (0FC63DAF-8483-4772-8E79-3D69D8477DE4) for Linux filesystem data on GPT + disks. This type code is now assigned as the default partition type code + for new partitions holding Linux filesystems. + + Added new "msftdata" flag to identify partitions holding NTFS or FAT + filesystems on GPT disks. This flag corresponds to a GPT type code of + EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ("Microsoft Basic Data"). Since + Linux filesystem partitions formerly used this type code, this flag may + optionally be set on Linux partitions to make the partition table type + codes match former configurations in case the new Linux filesystem type + code causes problems with some utility. Note that this flag cannot be + removed from NTFS or FAT partitions within parted except by setting a + competing flag, such as "boot" (which sets the type code used by EFI + System partitions) or "msftres" (which sets the "Microsoft Reserved" type + code). + * Noteworthy changes in release 3.1 (2012-03-02) [stable] diff --git a/doc/parted.texi b/doc/parted.texi index 1601151..b8db19d 100644 --- a/doc/parted.texi +++ b/doc/parted.texi @@ -793,6 +793,20 @@ on a partition that partition must be bootable. For PC98 disk labels, all ext2 partitions must be bootable (this is enforced by Parted). +@item msftdata +(GPT) - This flag identifies partitions that contain Microsoft filesystems +(NTFS or FAT). It may optionally be set on Linux filesystems to mimic the +type of configuration created by parted 3.0 and earlier, in which a +separate Linux filesystem type code was not available on GPT disks. This +flag can only be removed within parted by replacing it with a competing +flag, such as boot or msftres. + +@item msftres +(GPT) - This flag identifies a "Microsoft Reserved" partition, which is +used by Windows on GPT disks. Note that this flag should not normally be +set on Windows filesystem partitions (those that contain NTFS or FAT +filesystems). + @item lba (MS-DOS) - this flag can be enabled to tell MS DOS, MS Windows 9x and MS Windows ME based operating systems to use Linear (LBA) mode. @@ -907,7 +921,7 @@ which case this unit apply instead of the default unit for this particular number, but CHS and cylinder units are not supported as a suffix. If no suffix is given, then the default unit is assumed. Parted will compute sensible ranges for the locations you specify -(e.g. a range of +/- 500 MB when you specify the location in ``G'', +(e.g., a range of +/- 500 MB when you specify the location in ``G'', and a range of +/- 500 KB when you specify the location in ``M'') and will select the nearest location in this range from the one you wrote that satisfies constraints from both the operation, the diff --git a/include/parted/disk.in.h b/include/parted/disk.in.h index 9734edd..a34e11e 100644 --- a/include/parted/disk.in.h +++ b/include/parted/disk.in.h @@ -72,10 +72,11 @@ enum _PedPartitionFlag { PED_PARTITION_BIOS_GRUB=12, PED_PARTITION_APPLE_TV_RECOVERY=13, PED_PARTITION_DIAG=14, - PED_PARTITION_LEGACY_BOOT=15 + PED_PARTITION_LEGACY_BOOT=15, + PED_PARTITION_MSFT_DATA=16 }; #define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT -#define PED_PARTITION_LAST_FLAG PED_PARTITION_LEGACY_BOOT +#define PED_PARTITION_LAST_FLAG PED_PARTITION_MSFT_DATA enum _PedDiskTypeFeature { PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ diff --git a/libparted/disk.c b/libparted/disk.c index f9b5fd2..c4b1a01 100644 --- a/libparted/disk.c +++ b/libparted/disk.c @@ -2433,6 +2433,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag) return N_("prep"); case PED_PARTITION_MSFT_RESERVED: return N_("msftres"); + case PED_PARTITION_MSFT_DATA: + return N_("msftdata"); case PED_PARTITION_APPLE_TV_RECOVERY: return N_("atvrecv"); case PED_PARTITION_DIAG: diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c index 63b30b9..490de70 100644 --- a/libparted/labels/gpt.c +++ b/libparted/labels/gpt.c @@ -122,6 +122,10 @@ typedef struct ((efi_guid_t) { PED_CPU_TO_LE32 (0x0657fd6d), PED_CPU_TO_LE16 (0xa4ab), \ PED_CPU_TO_LE16 (0x43c4), 0x84, 0xe5, \ { 0x09, 0x33, 0xc8, 0x4b, 0x4f, 0x4f }}) +#define PARTITION_LINUX_DATA_GUID \ + ((efi_guid_t) { PED_CPU_TO_LE32 (0x0FC63DAF), PED_CPU_TO_LE16 (0x8483), \ + PED_CPU_TO_LE16 (0x4772), 0x8E, 0x79, \ + { 0x3D, 0x69, 0xD8, 0x47, 0x7D, 0xE4 }}) #define PARTITION_LVM_GUID \ ((efi_guid_t) { PED_CPU_TO_LE32 (0xe6d6d379), PED_CPU_TO_LE16 (0xf507), \ PED_CPU_TO_LE16 (0x44c2), 0xa2, 0x3c, \ @@ -280,6 +284,7 @@ typedef struct _GPTPartitionData int hp_service; int hidden; int msftres; + int msftdata; int atvrecv; int msftrecv; int legacy_boot; @@ -788,6 +793,7 @@ _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 + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->legacy_boot = gpt_part_data->bios_grub = gpt_part_data->atvrecv = 0; @@ -809,6 +815,8 @@ _parse_part_entry (PedDisk *disk, GuidPartitionEntry_t *pte) gpt_part_data->hp_service = 1; else if (!guid_cmp (gpt_part_data->type, PARTITION_MSFT_RESERVED_GUID)) gpt_part_data->msftres = 1; + else if (!guid_cmp (gpt_part_data->type, PARTITION_BASIC_DATA_GUID)) + gpt_part_data->msftdata = 1; else if (!guid_cmp (gpt_part_data->type, PARTITION_MSFT_RECOVERY)) gpt_part_data->msftrecv = 1; else if (!guid_cmp (gpt_part_data->type, PARTITION_APPLE_TV_RECOVERY_GUID)) @@ -1318,7 +1326,7 @@ gpt_partition_new (const PedDisk *disk, if (!gpt_part_data) goto error_free_part; - gpt_part_data->type = PARTITION_BASIC_DATA_GUID; + gpt_part_data->type = PARTITION_LINUX_DATA_GUID; gpt_part_data->lvm = 0; gpt_part_data->raid = 0; gpt_part_data->boot = 0; @@ -1326,6 +1334,7 @@ gpt_partition_new (const PedDisk *disk, gpt_part_data->hp_service = 0; gpt_part_data->hidden = 0; gpt_part_data->msftres = 0; + gpt_part_data->msftdata = 0; gpt_part_data->msftrecv = 0; gpt_part_data->atvrecv = 0; gpt_part_data->legacy_boot = 0; @@ -1422,6 +1431,11 @@ gpt_partition_set_system (PedPartition *part, gpt_part_data->type = PARTITION_MSFT_RESERVED_GUID; return 1; } + if (gpt_part_data->msftdata) + { + gpt_part_data->type = PARTITION_BASIC_DATA_GUID; + return 1; + } if (gpt_part_data->msftrecv) { gpt_part_data->type = PARTITION_MSFT_RECOVERY; @@ -1453,7 +1467,7 @@ gpt_partition_set_system (PedPartition *part, } } - gpt_part_data->type = PARTITION_BASIC_DATA_GUID; + gpt_part_data->type = PARTITION_LINUX_DATA_GUID; return 1; } @@ -1571,6 +1585,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->bios_grub = gpt_part_data->hp_service = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1582,6 +1597,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->boot = gpt_part_data->hp_service = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1593,6 +1609,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->bios_grub = gpt_part_data->hp_service = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1604,6 +1621,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->bios_grub = gpt_part_data->hp_service = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1615,6 +1633,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->lvm = gpt_part_data->bios_grub = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1626,8 +1645,25 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->lvm = gpt_part_data->bios_grub = gpt_part_data->hp_service + = gpt_part_data->msftdata + = gpt_part_data->msftrecv + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_MSFT_DATA: + gpt_part_data->msftres = state; + if (state) { + gpt_part_data->boot + = gpt_part_data->raid + = gpt_part_data->lvm + = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftres = gpt_part_data->msftrecv = gpt_part_data->atvrecv = 0; + gpt_part_data->msftdata = 1; + } else { + gpt_part_data->msftdata = 0; + } return gpt_partition_set_system (part, part->fs_type); case PED_PARTITION_DIAG: gpt_part_data->msftrecv = state; @@ -1637,6 +1673,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->lvm = gpt_part_data->bios_grub = gpt_part_data->hp_service + = gpt_part_data->msftdata = gpt_part_data->msftres = gpt_part_data->atvrecv = 0; return gpt_partition_set_system (part, part->fs_type); @@ -1649,6 +1686,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) = gpt_part_data->bios_grub = gpt_part_data->hp_service = gpt_part_data->msftres + = gpt_part_data->msftdata = gpt_part_data->msftrecv = 0; return gpt_partition_set_system (part, part->fs_type); case PED_PARTITION_HIDDEN: @@ -1687,6 +1725,8 @@ gpt_partition_get_flag (const PedPartition *part, PedPartitionFlag flag) return gpt_part_data->hp_service; case PED_PARTITION_MSFT_RESERVED: return gpt_part_data->msftres; + case PED_PARTITION_MSFT_DATA: + return gpt_part_data->msftdata; case PED_PARTITION_DIAG: return gpt_part_data->msftrecv; case PED_PARTITION_APPLE_TV_RECOVERY: @@ -1716,6 +1756,7 @@ gpt_partition_is_flag_available (const PedPartition *part, case PED_PARTITION_BIOS_GRUB: case PED_PARTITION_HPSERVICE: case PED_PARTITION_MSFT_RESERVED: + case PED_PARTITION_MSFT_DATA: case PED_PARTITION_DIAG: case PED_PARTITION_APPLE_TV_RECOVERY: case PED_PARTITION_HIDDEN: diff --git a/tests/t0220-gpt-msftres.sh b/tests/t0220-gpt-msftres.sh index d522aec..bd14c84 100755 --- a/tests/t0220-gpt-msftres.sh +++ b/tests/t0220-gpt-msftres.sh @@ -56,7 +56,8 @@ printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:gpt::;\n" > exp i=1 for type in $fs_types; do end=$(expr $start + $part_size - 1) - echo "$i:${start}s:${end}s:${part_size}s::$type:;" >> exp || fail=1 + case $type in fat*|NTFS) flag=msftdata;; *) flag=;; esac + echo "$i:${start}s:${end}s:${part_size}s::$type:$flag;" >> exp || fail=1 parted -s $dev mkpart p-name $type ${start}s ${end}s > err 2>&1 || fail=1 compare /dev/null err || fail=1 parted -s $dev name $i $type > err 2>&1 || fail=1 -- 1.8.5.3