You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
6.0 KiB
228 lines
6.0 KiB
From 29ffc6a1f285f48ac0b9efa7299373e486c486e8 Mon Sep 17 00:00:00 2001 |
|
From: Arvin Schnell <aschnell@suse.com> |
|
Date: Fri, 8 Oct 2021 10:06:24 +0000 |
|
Subject: [PATCH 3/5] libparted: add swap flag for DASD label |
|
|
|
Support the swap flag and fix reading flags from disk. Also |
|
cleanup code by dropping the 2 flags "raid" and "lvm" from |
|
DasdPartitionData and instead use "system" directly. |
|
|
|
Signed-off-by: Brian C. Lane <bcl@redhat.com> |
|
--- |
|
include/parted/fdasd.in.h | 2 - |
|
libparted/labels/dasd.c | 118 ++++++++++++++++---------------------- |
|
2 files changed, 50 insertions(+), 70 deletions(-) |
|
|
|
diff --git a/include/parted/fdasd.in.h b/include/parted/fdasd.in.h |
|
index 9e5d7d1..e3ba183 100644 |
|
--- a/include/parted/fdasd.in.h |
|
+++ b/include/parted/fdasd.in.h |
|
@@ -28,10 +28,8 @@ |
|
|
|
#define PARTITION_LINUX_SWAP 0x82 |
|
#define PARTITION_LINUX 0x83 |
|
-#define PARTITION_LINUX_EXT 0x85 |
|
#define PARTITION_LINUX_LVM 0x8e |
|
#define PARTITION_LINUX_RAID 0xfd |
|
-#define PARTITION_LINUX_LVM_OLD 0xfe |
|
|
|
#define PART_TYPE_NATIVE "NATIVE" |
|
#define PART_TYPE_SWAP "SWAP " |
|
diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c |
|
index 0c00c4f..27baad0 100644 |
|
--- a/libparted/labels/dasd.c |
|
+++ b/libparted/labels/dasd.c |
|
@@ -53,10 +53,8 @@ |
|
|
|
#define PARTITION_LINUX_SWAP 0x82 |
|
#define PARTITION_LINUX 0x83 |
|
-#define PARTITION_LINUX_EXT 0x85 |
|
#define PARTITION_LINUX_LVM 0x8e |
|
#define PARTITION_LINUX_RAID 0xfd |
|
-#define PARTITION_LINUX_LVM_OLD 0xfe |
|
|
|
extern void ped_disk_dasd_init (); |
|
extern void ped_disk_dasd_done (); |
|
@@ -66,8 +64,6 @@ extern void ped_disk_dasd_done (); |
|
typedef struct { |
|
int type; |
|
int system; |
|
- int raid; |
|
- int lvm; |
|
} DasdPartitionData; |
|
|
|
typedef struct { |
|
@@ -134,6 +130,31 @@ static PedDiskType dasd_disk_type = { |
|
features: 0 |
|
}; |
|
|
|
+struct flag_id_mapping_t |
|
+{ |
|
+ enum _PedPartitionFlag flag; |
|
+ int type_id; |
|
+}; |
|
+ |
|
+static const struct flag_id_mapping_t flag_id_mapping[] = |
|
+{ |
|
+ { PED_PARTITION_LVM, PARTITION_LINUX_LVM }, |
|
+ { PED_PARTITION_RAID, PARTITION_LINUX_RAID }, |
|
+ { PED_PARTITION_SWAP, PARTITION_LINUX_SWAP }, |
|
+}; |
|
+ |
|
+static const struct flag_id_mapping_t* _GL_ATTRIBUTE_CONST |
|
+dasd_find_flag_id_mapping (PedPartitionFlag flag) |
|
+{ |
|
+ int n = sizeof(flag_id_mapping) / sizeof(flag_id_mapping[0]); |
|
+ |
|
+ for (int i = 0; i < n; ++i) |
|
+ if (flag_id_mapping[i].flag == flag) |
|
+ return &flag_id_mapping[i]; |
|
+ |
|
+ return NULL; |
|
+} |
|
+ |
|
static PedDisk* |
|
dasd_alloc (const PedDevice* dev) |
|
{ |
|
@@ -310,8 +331,6 @@ dasd_read (PedDisk* disk) |
|
part->num = 1; |
|
part->fs_type = ped_file_system_probe (&part->geom); |
|
dasd_data = part->disk_specific; |
|
- dasd_data->raid = 0; |
|
- dasd_data->lvm = 0; |
|
dasd_data->type = 0; |
|
|
|
if (!ped_disk_add_partition (disk, part, NULL)) |
|
@@ -394,8 +413,6 @@ dasd_read (PedDisk* disk) |
|
part->num = 1; |
|
part->fs_type = ped_file_system_probe (&part->geom); |
|
dasd_data = part->disk_specific; |
|
- dasd_data->raid = 0; |
|
- dasd_data->lvm = 0; |
|
dasd_data->type = 0; |
|
|
|
if (!ped_disk_add_partition (disk, part, NULL)) |
|
@@ -452,25 +469,12 @@ dasd_read (PedDisk* disk) |
|
|
|
dasd_data = part->disk_specific; |
|
|
|
- if ((strncmp(PART_TYPE_RAID, str, 6) == 0) && |
|
- (ped_file_system_probe(&part->geom) == NULL)) |
|
- ped_partition_set_flag(part, PED_PARTITION_RAID, 1); |
|
- else |
|
- ped_partition_set_flag(part, PED_PARTITION_RAID, 0); |
|
- |
|
- if ((strncmp(PART_TYPE_LVM, str, 6) == 0) && |
|
- (ped_file_system_probe(&part->geom) == NULL)) |
|
- ped_partition_set_flag(part, PED_PARTITION_LVM, 1); |
|
- else |
|
- ped_partition_set_flag(part, PED_PARTITION_LVM, 0); |
|
- |
|
- if (strncmp(PART_TYPE_SWAP, str, 6) == 0) { |
|
- fs = ped_file_system_probe(&part->geom); |
|
- if (fs && is_linux_swap(fs->name)) { |
|
- dasd_data->system = PARTITION_LINUX_SWAP; |
|
- PDEBUG; |
|
- } |
|
- } |
|
+ if (strncmp(PART_TYPE_RAID, str, 6) == 0) |
|
+ dasd_data->system = PARTITION_LINUX_RAID; |
|
+ else if (strncmp(PART_TYPE_LVM, str, 6) == 0) |
|
+ dasd_data->system = PARTITION_LINUX_LVM; |
|
+ else if (strncmp(PART_TYPE_SWAP, str, 6) == 0) |
|
+ dasd_data->system = PARTITION_LINUX_SWAP; |
|
|
|
vtoc_ebcdic_enc(p->f1->DS1DSNAM, p->f1->DS1DSNAM, 44); |
|
|
|
@@ -747,20 +751,17 @@ dasd_partition_set_flag (PedPartition* part, PedPartitionFlag flag, int state) |
|
PED_ASSERT(part->disk_specific != NULL); |
|
dasd_data = part->disk_specific; |
|
|
|
- switch (flag) { |
|
- case PED_PARTITION_RAID: |
|
- if (state) |
|
- dasd_data->lvm = 0; |
|
- dasd_data->raid = state; |
|
- return ped_partition_set_system(part, part->fs_type); |
|
- case PED_PARTITION_LVM: |
|
- if (state) |
|
- dasd_data->raid = 0; |
|
- dasd_data->lvm = state; |
|
- return ped_partition_set_system(part, part->fs_type); |
|
- default: |
|
- return 0; |
|
+ const struct flag_id_mapping_t* p = dasd_find_flag_id_mapping (flag); |
|
+ if (p) |
|
+ { |
|
+ if (state) |
|
+ dasd_data->system = p->type_id; |
|
+ else if (dasd_data->system == p->type_id) |
|
+ return dasd_partition_set_system (part, part->fs_type); |
|
+ return 1; |
|
} |
|
+ |
|
+ return 0; |
|
} |
|
|
|
static int |
|
@@ -772,14 +773,11 @@ dasd_partition_get_flag (const PedPartition* part, PedPartitionFlag flag) |
|
PED_ASSERT (part->disk_specific != NULL); |
|
dasd_data = part->disk_specific; |
|
|
|
- switch (flag) { |
|
- case PED_PARTITION_RAID: |
|
- return dasd_data->raid; |
|
- case PED_PARTITION_LVM: |
|
- return dasd_data->lvm; |
|
- default: |
|
- return 0; |
|
- } |
|
+ const struct flag_id_mapping_t* p = dasd_find_flag_id_mapping (flag); |
|
+ if (p) |
|
+ return dasd_data->system == p->type_id; |
|
+ |
|
+ return 0; |
|
} |
|
|
|
/* |
|
@@ -800,14 +798,10 @@ dasd_partition_is_flag_available (const PedPartition* part, |
|
if (disk_specific->format_type == 1) |
|
return 0; |
|
|
|
- switch (flag) { |
|
- case PED_PARTITION_RAID: |
|
- return 1; |
|
- case PED_PARTITION_LVM: |
|
- return 1; |
|
- default: |
|
- return 0; |
|
- } |
|
+ if (dasd_find_flag_id_mapping (flag)) |
|
+ return 1; |
|
+ |
|
+ return 0; |
|
} |
|
|
|
|
|
@@ -938,18 +932,6 @@ dasd_partition_set_system (PedPartition* part, |
|
|
|
part->fs_type = fs_type; |
|
|
|
- if (dasd_data->lvm) { |
|
- dasd_data->system = PARTITION_LINUX_LVM; |
|
- PDEBUG; |
|
- return 1; |
|
- } |
|
- |
|
- if (dasd_data->raid) { |
|
- dasd_data->system = PARTITION_LINUX_RAID; |
|
- PDEBUG; |
|
- return 1; |
|
- } |
|
- |
|
if (!fs_type) { |
|
dasd_data->system = PARTITION_LINUX; |
|
PDEBUG; |
|
-- |
|
2.35.3 |
|
|
|
|