From 55e4775c989af42d629401b9aa22c60ba2993e7d Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Tue, 13 Dec 2022 12:53:07 +0000 Subject: [PATCH] gpt: Add no_automount partition flag Add user requested support for GPT partition type attribute bit 63 [1] so the no-auto flag in the systemd originated Discoverable Partitions Specification [2] can be manipulated. The UEFI specification [3] says partition attribute bits 48 to 63 are partition type specific, however the DPS [2] and Microsoft [4] use the bit 63 to mean no automounting / assign no drive letter and apply it to multiple partition types so don't restrict its application. [1] Request for GPT partition attribute bit 63 "no automount" editing support https://gitlab.gnome.org/GNOME/gparted/-/issues/214 [2] The Discoverable Partitions Specification (DPS), Partition Attribute Flags https://uapi-group.org/specifications/specs/discoverable_partitions_specification/ [3] UEFI Specification, version 2.8, Table 24. Defined GPT Partition Entry - Attributes https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf [4] CREATE_PARTITION_PARAMETERS structure (vds.h) https://learn.microsoft.com/en-gb/windows/win32/api/vds/ns-vds-create_partition_parameters Signed-off-by: Mike Fleetwood Signed-off-by: Brian C. Lane --- NEWS | 2 ++ doc/C/parted.8 | 2 +- include/parted/disk.in.h | 3 ++- libparted/disk.c | 2 ++ libparted/labels/gpt.c | 12 ++++++++++-- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 099f8bd..ac759fe 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ GNU parted NEWS -*- outline -*- ** New Features + Support GPT partition attribute bit 63 as no_automount flag. + Add type commands to set type-id on MS-DOS and type-uuid on GPT. * Noteworthy changes in release 3.5 (2022-04-18) [stable] diff --git a/doc/C/parted.8 b/doc/C/parted.8 index ab34be7..3069c33 100644 --- a/doc/C/parted.8 +++ b/doc/C/parted.8 @@ -120,7 +120,7 @@ or an LVM logical volume if necessary. Change the state of the \fIflag\fP on \fIpartition\fP to \fIstate\fP. Supported flags are: "boot", "root", "swap", "hidden", "raid", "lvm", "lba", "legacy_boot", "irst", "msftres", "esp", "chromeos_kernel", "bls_boot", "linux-home", -"bios_grub", and "palo". +"no_automount", "bios_grub", and "palo". \fIstate\fP should be either "on" or "off". .TP .B unit \fIunit\fP diff --git a/include/parted/disk.in.h b/include/parted/disk.in.h index f649bcc..402d78a 100644 --- a/include/parted/disk.in.h +++ b/include/parted/disk.in.h @@ -88,10 +88,11 @@ enum _PedPartitionFlag { PED_PARTITION_CHROMEOS_KERNEL=19, PED_PARTITION_BLS_BOOT=20, PED_PARTITION_LINUX_HOME=21, + PED_PARTITION_NO_AUTOMOUNT=22, }; // NOTE: DO NOT define using enums #define PED_PARTITION_FIRST_FLAG 1 // PED_PARTITION_BOOT -#define PED_PARTITION_LAST_FLAG 21 // PED_PARTITION_LINUX_HOME +#define PED_PARTITION_LAST_FLAG 22 // PED_PARTITION_NO_AUTOMOUNT enum _PedDiskTypeFeature { PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ diff --git a/libparted/disk.c b/libparted/disk.c index 0ed3d91..45f35fd 100644 --- a/libparted/disk.c +++ b/libparted/disk.c @@ -2579,6 +2579,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag) return N_("bls_boot"); case PED_PARTITION_LINUX_HOME: return N_("linux-home"); + case PED_PARTITION_NO_AUTOMOUNT: + return N_("no_automount"); default: ped_exception_throw ( diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c index 1993863..780fb70 100644 --- a/libparted/labels/gpt.c +++ b/libparted/labels/gpt.c @@ -252,7 +252,8 @@ struct __attribute__ ((packed)) _GuidPartitionEntryAttributes_t uint64_t NoBlockIOProtocol:1; uint64_t LegacyBIOSBootable:1; uint64_t Reserved:45; - uint64_t GuidSpecific:16; + uint64_t GuidSpecific:15; + uint64_t NoAutomount:1; #else # warning "Using crippled partition entry type" uint32_t RequiredToFunction:1; @@ -260,7 +261,8 @@ struct __attribute__ ((packed)) _GuidPartitionEntryAttributes_t uint32_t LegacyBIOSBootable:1; uint32_t Reserved:30; uint32_t LOST:5; - uint32_t GuidSpecific:16; + uint32_t GuidSpecific:15; + uint32_t NoAutomount:1; #endif }; @@ -1637,6 +1639,9 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) case PED_PARTITION_LEGACY_BOOT: gpt_part_data->attributes.LegacyBIOSBootable = state; return 1; + case PED_PARTITION_NO_AUTOMOUNT: + gpt_part_data->attributes.NoAutomount = state; + return 1; case PED_PARTITION_ROOT: case PED_PARTITION_LBA: default: @@ -1662,6 +1667,8 @@ gpt_partition_get_flag (const PedPartition *part, PedPartitionFlag flag) return gpt_part_data->attributes.RequiredToFunction; case PED_PARTITION_LEGACY_BOOT: return gpt_part_data->attributes.LegacyBIOSBootable; + case PED_PARTITION_NO_AUTOMOUNT: + return gpt_part_data->attributes.NoAutomount; case PED_PARTITION_LBA: case PED_PARTITION_ROOT: default: @@ -1681,6 +1688,7 @@ gpt_partition_is_flag_available (const PedPartition *part, { case PED_PARTITION_HIDDEN: case PED_PARTITION_LEGACY_BOOT: + case PED_PARTITION_NO_AUTOMOUNT: return 1; case PED_PARTITION_ROOT: case PED_PARTITION_LBA: -- 2.38.1