bug-parted
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH parted 1/2] dos: Add a partition flag for diagnostics / recovery


From: Hans de Goede
Subject: [PATCH parted 1/2] dos: Add a partition flag for diagnostics / recovery partitions
Date: Wed, 28 Apr 2010 19:14:35 +0200

msdos partition tables can contain diagnostics partitions (often used
now a days as system recovery partitions). For some users of libparted
(ie anaconda) it is usefull to know if a dos partition is a regular partition
or a diagnostic partition (see rh bug 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
---
 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..da496e9 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) - this flag can be enabled so that the 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..aa488ea 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;
 
@@ -835,6 +836,8 @@ raw_part_parse (const PedDisk* disk, const DosRawPartition* 
raw_part,
        dos_data->lba = raw_part_is_lba (raw_part);
        dos_data->palo = raw_part->type == PARTITION_PALO;
        dos_data->prep = raw_part->type == PARTITION_PREP;
+       dos_data->diag = raw_part->type == PARTITION_COMPAQ_DIAG ||
+                        raw_part->type == PARTITION_DELL_DIAG;
        dos_data->orig = ped_malloc (sizeof (OrigState));
        if (!dos_data->orig) {
                ped_partition_destroy (part);
@@ -1236,6 +1239,7 @@ msdos_partition_new (const PedDisk* disk, 
PedPartitionType part_type,
                dos_data->lba = 0;
                dos_data->palo = 0;
                dos_data->prep = 0;
+               dos_data->diag = 0;
        } else {
                part->disk_specific = NULL;
        }
@@ -1270,6 +1274,7 @@ msdos_partition_duplicate (const PedPartition* part)
        new_dos_data->lba = old_dos_data->lba;
        new_dos_data->palo = old_dos_data->palo;
        new_dos_data->prep = old_dos_data->prep;
+       new_dos_data->diag = old_dos_data->diag;
 
        if (old_dos_data->orig) {
                new_dos_data->orig = ped_malloc (sizeof (OrigState));
@@ -1317,6 +1322,7 @@ msdos_partition_set_system (PedPartition* part,
                dos_data->lvm = 0;
                dos_data->palo = 0;
                dos_data->prep = 0;
+               dos_data->diag = 0;
                if (dos_data->lba)
                        dos_data->system = PARTITION_EXT_LBA;
                else
@@ -1340,6 +1346,14 @@ msdos_partition_set_system (PedPartition* part,
                dos_data->system = PARTITION_PREP;
                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 (!fs_type)
                dos_data->system = PARTITION_LINUX;
@@ -1415,6 +1429,7 @@ msdos_partition_set_flag (PedPartition* part,
                        dos_data->lvm = 0;
                        dos_data->palo = 0;
                        dos_data->prep = 0;
+                       dos_data->diag = 0;
                }
                dos_data->raid = state;
                return ped_partition_set_system (part, part->fs_type);
@@ -1425,6 +1440,7 @@ msdos_partition_set_flag (PedPartition* part,
                        dos_data->raid = 0;
                        dos_data->palo = 0;
                        dos_data->prep = 0;
+                       dos_data->diag = 0;
                }
                dos_data->lvm = state;
                return ped_partition_set_system (part, part->fs_type);
@@ -1439,6 +1455,7 @@ msdos_partition_set_flag (PedPartition* part,
                        dos_data->raid = 0;
                        dos_data->lvm = 0;
                        dos_data->prep = 0;
+                       dos_data->diag = 0;
                }
                dos_data->palo = state;
                return ped_partition_set_system (part, part->fs_type);
@@ -1449,10 +1466,22 @@ msdos_partition_set_flag (PedPartition* part,
                        dos_data->raid = 0;
                        dos_data->lvm = 0;
                        dos_data->palo = 0;
+                       dos_data->diag = 0;
                }
                dos_data->prep = state;
                return ped_partition_set_system (part, part->fs_type);
 
+       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);
+
        default:
                return 0;
        }
@@ -1492,6 +1521,9 @@ msdos_partition_get_flag (const PedPartition* part, 
PedPartitionFlag flag)
        case PED_PARTITION_PREP:
                return dos_data->prep;
 
+       case PED_PARTITION_DIAG:
+               return dos_data->diag;
+
        default:
                return 0;
        }
@@ -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.0.1





reply via email to

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