summaryrefslogtreecommitdiff
path: root/libparted/labels/dos.c
diff options
context:
space:
mode:
Diffstat (limited to 'libparted/labels/dos.c')
-rw-r--r--libparted/labels/dos.c54
1 files changed, 46 insertions, 8 deletions
diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c
index bd7465d..4359276 100644
--- a/libparted/labels/dos.c
+++ b/libparted/labels/dos.c
@@ -121,6 +121,22 @@ static const struct flag_id_mapping_t flag_id_mapping[] =
{ PED_PARTITION_SWAP, PARTITION_LINUX_SWAP },
};
+static const unsigned char skip_set_system_types[] =
+{
+ PARTITION_EXT_LBA,
+ PARTITION_DOS_EXT,
+ PARTITION_COMPAQ_DIAG,
+ PARTITION_MSFT_RECOVERY,
+ PARTITION_LINUX_LVM,
+ PARTITION_LINUX_SWAP,
+ PARTITION_LINUX_RAID,
+ PARTITION_PALO,
+ PARTITION_PREP,
+ PARTITION_IRST,
+ PARTITION_ESP,
+ PARTITION_BLS_BOOT
+};
+
static const struct flag_id_mapping_t* _GL_ATTRIBUTE_CONST
dos_find_flag_id_mapping (PedPartitionFlag flag)
{
@@ -1540,6 +1556,21 @@ msdos_partition_destroy (PedPartition* part)
free (part);
}
+/* is_skip_type checks the type against the list of types that should not be
+ * overridden by set_system. It returns a 1 if it is in the list.
+*/
+static bool
+is_skip_type(unsigned char type_id) {
+ int n = sizeof(skip_set_system_types) / sizeof(skip_set_system_types[0]);
+ for (int i = 0; i < n; ++i) {
+ if (type_id == skip_set_system_types[i]) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
static int
msdos_partition_set_system (PedPartition* part,
const PedFileSystemType* fs_type)
@@ -1548,6 +1579,11 @@ msdos_partition_set_system (PedPartition* part,
part->fs_type = fs_type;
+ // Is this a type that should skip fs_type checking?
+ if (is_skip_type(dos_data->system)) {
+ return 1;
+ }
+
if (part->type & PED_PARTITION_EXTENDED) {
dos_data->system = PARTITION_EXT_LBA;
return 1;
@@ -1590,15 +1626,17 @@ msdos_partition_set_flag (PedPartition* part,
const struct flag_id_mapping_t* p = dos_find_flag_id_mapping (flag);
if (p)
{
- if (part->type & PED_PARTITION_EXTENDED)
- return 0;
-
- if (state)
- dos_data->system = p->type_id;
- else if (dos_data->system == p->type_id || dos_data->system == p->alt_type_id)
- return ped_partition_set_system (part, part->fs_type);
+ if (part->type & PED_PARTITION_EXTENDED)
+ return 0;
- return 1;
+ if (state) {
+ dos_data->system = p->type_id;
+ } else if (dos_data->system == p->type_id || dos_data->system == p->alt_type_id) {
+ // Clear the type so that fs_type will be used to return it to the default
+ dos_data->system = PARTITION_LINUX;
+ return ped_partition_set_system (part, part->fs_type);
+ }
+ return 1;
}
switch (flag) {