0b7af917e2
- Drop patches incorporated into upstream - Still adds the various DASD patches
334 lines
14 KiB
Diff
334 lines
14 KiB
Diff
From e6536360bd4496cee1f1bf2dfb0b11f6bdbbfd4b Mon Sep 17 00:00:00 2001
|
|
From: "Roderick W. Smith" <rodsmith@rodsbooks.com>
|
|
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
|
|
|