[Parted-commits] GNU Parted Official Repository: Changes to 'master'

Jim Meyering meyering at alioth.debian.org
Thu Apr 29 14:05:07 UTC 2010


 NEWS                   |    3 ++
 doc/parted.texi        |    4 ++
 include/parted/disk.h  |    5 ++-
 libparted/disk.c       |    2 +
 libparted/labels/dos.c |   67 +++++++++++++++++++++++++++++++------------------
 5 files changed, 55 insertions(+), 26 deletions(-)

New commits:
commit b299e6a85b16b4c746c9a862e8a3a5a3270943b3
Author: Jim Meyering <meyering at redhat.com>
Date:   Thu Apr 29 16:02:40 2010 +0200

    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.

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);
 

commit 131354f0a8244865d5d8c4e5c080d38101b11f45
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Apr 19 13:55:32 2010 +0200

    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.

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.
 
+ at 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:



More information about the Parted-commits mailing list