[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] tests: test all boolean flags
From: |
Jim Meyering |
Subject: |
Re: [PATCH] tests: test all boolean flags |
Date: |
Thu, 29 Apr 2010 16:07:34 +0200 |
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 <address@hidden>
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.
address@hidden 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 <address@hidden>
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