Hans de Goede wrote: > Hi, > > Great, thanks! I've resend my DIAG flag patch with a new > chunk adding a blurb about the flag to the texinfo documentation. > > On 04/28/2010 06:28 PM, Jim Meyering wrote: >> Here's a more thorough test of the MSDOS flags. >> Hans, note that currently this would not test your new DIAG flag, >> since there was no sentence for it in the texinfo documentation. >> Would you care to add one?
Thanks. I've pushed your change (slight syntactic and log changes), along with a change to factor out the ugly 5x-duplicated flag-clearing blocks. >From 131354f0a8244865d5d8c4e5c080d38101b11f45 Mon Sep 17 00:00:00 2001 From: Hans de Goede <hdego...@redhat.com> Date: Mon, 19 Apr 2010 13:55:32 +0200 Subject: [PATCH 1/2] dos: add a partition flag for diagnostics / recovery partitions msdos partition tables can contain diagnostics partitions (often used nowadays as system recovery partitions). For some users of libparted (i.e., anaconda) it is useful to know if a dos partition is a regular partition or a diagnostic partition. For example, see <http://bugzilla.redhat.com/534066>. * include/parted/disk.h(_PedPartitionFlag): Add PED_PARTITION_DIAG * libparted/disk.c(ped_partition_flag_get_name): Add PED_PARTITION_DIAG * libparted/labels/dos.c: Add support for PED_PARTITION_DIAG flag * doc/parted.texi (set): Document it. --- NEWS | 3 +++ doc/parted.texi | 4 ++++ include/parted/disk.h | 5 +++-- libparted/disk.c | 2 ++ libparted/labels/dos.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 9836738..ddbc893 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ GNU parted NEWS -*- outline -*- parted now recognizes Linux Software RAID Arrays + libparted has a new partition flag to check for msdos disklabel diagnostics + partitions: PED_PARTITION_DIAG + ** Bug fixes When libparted deferenced a /dev/mapper/foo symlink, it would keep the diff --git a/doc/parted.texi b/doc/parted.texi index 885f312..08cf2dc 100644 --- a/doc/parted.texi +++ b/doc/parted.texi @@ -1089,6 +1089,10 @@ by the Linux/PA-RISC boot loader, palo. (MS-DOS) - this flag can be enabled so that the partition can be used as a PReP boot partition on PowerPC PReP or IBM RS6K/CHRP hardware. +...@item DIAG +(MS-DOS) - Enable this to indicate that a partition can be used +as a diagnostics / recovery partition. + @end table The print command displays all enabled flags for each partition. diff --git a/include/parted/disk.h b/include/parted/disk.h index dea4d19..f11e393 100644 --- a/include/parted/disk.h +++ b/include/parted/disk.h @@ -68,10 +68,11 @@ enum _PedPartitionFlag { PED_PARTITION_PREP=10, PED_PARTITION_MSFT_RESERVED=11, PED_PARTITION_BIOS_GRUB=12, - PED_PARTITION_APPLE_TV_RECOVERY=13 + PED_PARTITION_APPLE_TV_RECOVERY=13, + PED_PARTITION_DIAG=14 }; #define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT -#define PED_PARTITION_LAST_FLAG PED_PARTITION_APPLE_TV_RECOVERY +#define PED_PARTITION_LAST_FLAG PED_PARTITION_DIAG enum _PedDiskTypeFeature { PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ diff --git a/libparted/disk.c b/libparted/disk.c index f4c0d74..7a60a09 100644 --- a/libparted/disk.c +++ b/libparted/disk.c @@ -2441,6 +2441,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag) return N_("msftres"); case PED_PARTITION_APPLE_TV_RECOVERY: return N_("atvrecv"); + case PED_PARTITION_DIAG: + return N_("diag"); default: ped_exception_throw ( diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c index 9cbfd74..c51aca9 100644 --- a/libparted/labels/dos.c +++ b/libparted/labels/dos.c @@ -157,6 +157,7 @@ typedef struct { int lba; int palo; int prep; + int diag; OrigState* orig; /* used for CHS stuff */ } DosPartitionData; @@ -828,6 +829,8 @@ raw_part_parse (const PedDisk* disk, const DosRawPartition* raw_part, dos_data = part->disk_specific; dos_data->system = raw_part->type; dos_data->boot = raw_part->boot_ind != 0; + dos_data->diag = raw_part->type == PARTITION_COMPAQ_DIAG || + raw_part->type == PARTITION_DELL_DIAG; dos_data->hidden = raw_part_is_hidden (raw_part); dos_data->raid = raw_part->type == PARTITION_LINUX_RAID; dos_data->lvm = raw_part->type == PARTITION_LINUX_LVM_OLD @@ -1231,6 +1234,7 @@ msdos_partition_new (const PedDisk* disk, PedPartitionType part_type, dos_data->system = PARTITION_LINUX; dos_data->hidden = 0; dos_data->boot = 0; + dos_data->diag = 0; dos_data->raid = 0; dos_data->lvm = 0; dos_data->lba = 0; @@ -1264,6 +1268,7 @@ msdos_partition_duplicate (const PedPartition* part) new_dos_data = (DosPartitionData*) new_part->disk_specific; new_dos_data->system = old_dos_data->system; new_dos_data->boot = old_dos_data->boot; + new_dos_data->diag = old_dos_data->diag; new_dos_data->hidden = old_dos_data->hidden; new_dos_data->raid = old_dos_data->raid; new_dos_data->lvm = old_dos_data->lvm; @@ -1313,6 +1318,7 @@ msdos_partition_set_system (PedPartition* part, dos_data->hidden = 0; if (part->type & PED_PARTITION_EXTENDED) { + dos_data->diag = 0; dos_data->raid = 0; dos_data->lvm = 0; dos_data->palo = 0; @@ -1324,6 +1330,14 @@ msdos_partition_set_system (PedPartition* part, return 1; } + if (dos_data->diag) { + /* Don't change the system if it already is a diag type, + otherwise use Compaq as almost all vendors use that. */ + if (dos_data->system != PARTITION_COMPAQ_DIAG && + dos_data->system != PARTITION_DELL_DIAG) + dos_data->system = PARTITION_COMPAQ_DIAG; + return 1; + } if (dos_data->lvm) { dos_data->system = PARTITION_LINUX_LVM; return 1; @@ -1409,8 +1423,20 @@ msdos_partition_set_flag (PedPartition* part, } return 1; + case PED_PARTITION_DIAG: + if (state) { + dos_data->hidden = 0; + dos_data->raid = 0; + dos_data->lvm = 0; + dos_data->palo = 0; + dos_data->prep = 0; + } + dos_data->diag = state; + return ped_partition_set_system (part, part->fs_type); + case PED_PARTITION_RAID: if (state) { + dos_data->diag = 0; dos_data->hidden = 0; dos_data->lvm = 0; dos_data->palo = 0; @@ -1421,6 +1447,7 @@ msdos_partition_set_flag (PedPartition* part, case PED_PARTITION_LVM: if (state) { + dos_data->diag = 0; dos_data->hidden = 0; dos_data->raid = 0; dos_data->palo = 0; @@ -1435,6 +1462,7 @@ msdos_partition_set_flag (PedPartition* part, case PED_PARTITION_PALO: if (state) { + dos_data->diag = 0; dos_data->hidden = 0; dos_data->raid = 0; dos_data->lvm = 0; @@ -1445,6 +1473,7 @@ msdos_partition_set_flag (PedPartition* part, case PED_PARTITION_PREP: if (state) { + dos_data->diag = 0; dos_data->hidden = 0; dos_data->raid = 0; dos_data->lvm = 0; @@ -1477,6 +1506,9 @@ msdos_partition_get_flag (const PedPartition* part, PedPartitionFlag flag) case PED_PARTITION_BOOT: return dos_data->boot; + case PED_PARTITION_DIAG: + return dos_data->diag; + case PED_PARTITION_RAID: return dos_data->raid; @@ -1514,6 +1546,7 @@ msdos_partition_is_flag_available (const PedPartition* part, case PED_PARTITION_LBA: case PED_PARTITION_PALO: case PED_PARTITION_PREP: + case PED_PARTITION_DIAG: return 1; default: -- 1.7.1.328.g9993c >From b299e6a85b16b4c746c9a862e8a3a5a3270943b3 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Thu, 29 Apr 2010 16:02:40 +0200 Subject: [PATCH 2/2] maint: avoid code duplication * libparted/labels/dos.c (clear_flags): New function. Factored (5 times) out of ... (msdos_partition_set_flag): ...here. Use the new function. --- libparted/labels/dos.c | 56 ++++++++++++++++++------------------------------ 1 files changed, 21 insertions(+), 35 deletions(-) diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c index c51aca9..fdc679b 100644 --- a/libparted/labels/dos.c +++ b/libparted/labels/dos.c @@ -1382,6 +1382,17 @@ msdos_partition_set_system (PedPartition* part, return 1; } +static void +clear_flags (DosPartitionData *dos_data) +{ + dos_data->diag = 0; + dos_data->hidden = 0; + dos_data->lvm = 0; + dos_data->palo = 0; + dos_data->prep = 0; + dos_data->raid = 0; +} + static int msdos_partition_set_flag (PedPartition* part, PedPartitionFlag flag, int state) @@ -1424,35 +1435,20 @@ msdos_partition_set_flag (PedPartition* part, return 1; case PED_PARTITION_DIAG: - if (state) { - dos_data->hidden = 0; - dos_data->raid = 0; - dos_data->lvm = 0; - dos_data->palo = 0; - dos_data->prep = 0; - } + if (state) + clear_flags (dos_data); dos_data->diag = state; return ped_partition_set_system (part, part->fs_type); case PED_PARTITION_RAID: - if (state) { - dos_data->diag = 0; - dos_data->hidden = 0; - dos_data->lvm = 0; - dos_data->palo = 0; - dos_data->prep = 0; - } + if (state) + clear_flags (dos_data); dos_data->raid = state; return ped_partition_set_system (part, part->fs_type); case PED_PARTITION_LVM: - if (state) { - dos_data->diag = 0; - dos_data->hidden = 0; - dos_data->raid = 0; - dos_data->palo = 0; - dos_data->prep = 0; - } + if (state) + clear_flags (dos_data); dos_data->lvm = state; return ped_partition_set_system (part, part->fs_type); @@ -1461,24 +1457,14 @@ msdos_partition_set_flag (PedPartition* part, return ped_partition_set_system (part, part->fs_type); case PED_PARTITION_PALO: - if (state) { - dos_data->diag = 0; - dos_data->hidden = 0; - dos_data->raid = 0; - dos_data->lvm = 0; - dos_data->prep = 0; - } + if (state) + clear_flags (dos_data); dos_data->palo = state; return ped_partition_set_system (part, part->fs_type); case PED_PARTITION_PREP: - if (state) { - dos_data->diag = 0; - dos_data->hidden = 0; - dos_data->raid = 0; - dos_data->lvm = 0; - dos_data->palo = 0; - } + if (state) + clear_flags (dos_data); dos_data->prep = state; return ped_partition_set_system (part, part->fs_type); -- 1.7.1.328.g9993c _______________________________________________ bug-parted mailing list bug-parted@gnu.org http://lists.gnu.org/mailman/listinfo/bug-parted