bug-parted
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]