Toshaan Bharvani
11 months ago
25 changed files with 2445 additions and 23 deletions
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
From cec533a00a2cd0b64a7a0f5debc26554f6025831 Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Mon, 18 Apr 2022 15:10:06 -0400 |
||||
Subject: [PATCH 1/5] maint: post-release administrivia |
||||
|
||||
* NEWS: Add header line for next release. |
||||
* .prev-version: Record previous version. |
||||
* cfg.mk (old_NEWS_hash): Auto-update. |
||||
--- |
||||
.prev-version | 2 +- |
||||
NEWS | 3 +++ |
||||
cfg.mk | 2 +- |
||||
3 files changed, 5 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/.prev-version b/.prev-version |
||||
index e917998..5a95802 100644 |
||||
--- a/.prev-version |
||||
+++ b/.prev-version |
||||
@@ -1 +1 @@ |
||||
-3.4.64.2 |
||||
+3.5 |
||||
diff --git a/NEWS b/NEWS |
||||
index 68a164a..2bd161f 100644 |
||||
--- a/NEWS |
||||
+++ b/NEWS |
||||
@@ -1,5 +1,8 @@ |
||||
GNU parted NEWS -*- outline -*- |
||||
|
||||
+* Noteworthy changes in release ?.? (????-??-??) [?] |
||||
+ |
||||
+ |
||||
* Noteworthy changes in release 3.5 (2022-04-18) [stable] |
||||
|
||||
** New Features |
||||
diff --git a/cfg.mk b/cfg.mk |
||||
index d5fdd80..11fa51b 100644 |
||||
--- a/cfg.mk |
||||
+++ b/cfg.mk |
||||
@@ -45,7 +45,7 @@ local-checks-to-skip = \ |
||||
export VERBOSE = yes |
||||
|
||||
# Hash of lines 42-208 for release 3.2 |
||||
-old_NEWS_hash = 64a8f4d9ec1a5c256f3cc792450dc257 |
||||
+old_NEWS_hash = 81f624d1d62a34f24e1286bd3cf5c736 |
||||
|
||||
include $(srcdir)/dist-check.mk |
||||
|
||||
-- |
||||
2.35.3 |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,228 @@
@@ -0,0 +1,228 @@
|
||||
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 |
||||
|
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
From 9b0a83a747b28bd1b778bdd32616e6f7ea88c84d Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Fri, 13 May 2022 10:02:06 -0700 |
||||
Subject: [PATCH 4/5] parted: Reset the filesystem type when changing the |
||||
id/uuid |
||||
|
||||
Without this the print command keeps showing the type selected with |
||||
mkpart, which doesn't match the id/uuid set by the user. So rescan the |
||||
partition for a filesystem. |
||||
--- |
||||
parted/parted.c | 3 +++ |
||||
1 file changed, 3 insertions(+) |
||||
|
||||
diff --git a/parted/parted.c b/parted/parted.c |
||||
index b8a4acf..96da30d 100644 |
||||
--- a/parted/parted.c |
||||
+++ b/parted/parted.c |
||||
@@ -991,6 +991,9 @@ do_type (PedDevice** dev, PedDisk** diskp) |
||||
|
||||
free (input); |
||||
|
||||
+ // Reset the fs_type based on the filesystem, if it exists |
||||
+ part->fs_type = ped_file_system_probe (&part->geom); |
||||
+ |
||||
if (!ped_disk_commit (*diskp)) |
||||
goto error; |
||||
return 1; |
||||
-- |
||||
2.35.3 |
||||
|
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
From ac2a35c2214ef42352d0ddb4f7f4cb77d116e92e Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Fri, 13 May 2022 10:15:41 -0700 |
||||
Subject: [PATCH 5/5] tests: t3200-type-change now passes |
||||
|
||||
--- |
||||
tests/Makefile.am | 3 --- |
||||
1 file changed, 3 deletions(-) |
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am |
||||
index 2da653b..1d109d7 100644 |
||||
--- a/tests/Makefile.am |
||||
+++ b/tests/Makefile.am |
||||
@@ -1,6 +1,3 @@ |
||||
-XFAIL_TESTS = \ |
||||
- t3200-type-change.sh |
||||
- |
||||
TEST_EXTENSIONS = .sh |
||||
SH_LOG_COMPILER = $(SHELL) |
||||
|
||||
-- |
||||
2.35.3 |
||||
|
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
From 22ec6553b00b8cc21bf8e78529e1cd0f775ff36f Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Mon, 8 Aug 2022 12:04:32 -0700 |
||||
Subject: [PATCH 6/9] libparted: Fix handling of gpt partition types |
||||
|
||||
This restores the previous behavior by testing the GUID against the list |
||||
of known types and skipping the filesystem GUID reset. Now the sequence |
||||
of: |
||||
|
||||
ped_partition_new(...) |
||||
ped_partition_set_flag(part, PED_PARTITION_BIOS_GRUB, 1); |
||||
ped_partition_set_system(part, ped_file_system_type_get("ext4")); |
||||
|
||||
Will keep the GUID set to PED_PARTITION_BIOS_GRUB, which is how it used |
||||
to behave. |
||||
--- |
||||
libparted/labels/gpt.c | 45 ++++++++++++++++++++++++++++++++++++++++-- |
||||
1 file changed, 43 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c |
||||
index 0e9e060..8e6a37d 100644 |
||||
--- a/libparted/labels/gpt.c |
||||
+++ b/libparted/labels/gpt.c |
||||
@@ -196,6 +196,24 @@ static const struct flag_uuid_mapping_t flag_uuid_mapping[] = |
||||
{ PED_PARTITION_SWAP, PARTITION_SWAP_GUID }, |
||||
}; |
||||
|
||||
+static const efi_guid_t skip_set_system_guids[] = |
||||
+{ |
||||
+ PARTITION_LVM_GUID, |
||||
+ PARTITION_SWAP_GUID, |
||||
+ PARTITION_RAID_GUID, |
||||
+ PARTITION_PREP_GUID, |
||||
+ PARTITION_SYSTEM_GUID, |
||||
+ PARTITION_BIOS_GRUB_GUID, |
||||
+ PARTITION_HPSERVICE_GUID, |
||||
+ PARTITION_MSFT_RESERVED_GUID, |
||||
+ PARTITION_BASIC_DATA_GUID, |
||||
+ PARTITION_MSFT_RECOVERY, |
||||
+ PARTITION_APPLE_TV_RECOVERY_GUID, |
||||
+ PARTITION_IRST_GUID, |
||||
+ PARTITION_CHROMEOS_KERNEL_GUID, |
||||
+ PARTITION_BLS_BOOT_GUID, |
||||
+}; |
||||
+ |
||||
static const struct flag_uuid_mapping_t* _GL_ATTRIBUTE_CONST |
||||
gpt_find_flag_uuid_mapping (PedPartitionFlag flag) |
||||
{ |
||||
@@ -1421,6 +1439,21 @@ gpt_partition_destroy (PedPartition *part) |
||||
_ped_partition_free (part); |
||||
} |
||||
|
||||
+/* is_skip_guid checks the guid against the list of guids that should not be |
||||
+ * overridden by set_system. It returns a 1 if it is in the list. |
||||
+*/ |
||||
+static bool |
||||
+is_skip_guid(efi_guid_t guid) { |
||||
+ int n = sizeof(skip_set_system_guids) / sizeof(skip_set_system_guids[0]); |
||||
+ for (int i = 0; i < n; ++i) { |
||||
+ if (guid_cmp(guid, skip_set_system_guids[i]) == 0) { |
||||
+ return true; |
||||
+ } |
||||
+ } |
||||
+ |
||||
+ return false; |
||||
+} |
||||
+ |
||||
static int |
||||
gpt_partition_set_system (PedPartition *part, |
||||
const PedFileSystemType *fs_type) |
||||
@@ -1431,6 +1464,11 @@ gpt_partition_set_system (PedPartition *part, |
||||
|
||||
part->fs_type = fs_type; |
||||
|
||||
+ // Is this a GUID that should skip fs_type checking? |
||||
+ if (is_skip_guid(gpt_part_data->type)) { |
||||
+ return 1; |
||||
+ } |
||||
+ |
||||
if (fs_type) |
||||
{ |
||||
if (strncmp (fs_type->name, "fat", 3) == 0 |
||||
@@ -1563,10 +1601,13 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) |
||||
const struct flag_uuid_mapping_t* p = gpt_find_flag_uuid_mapping (flag); |
||||
if (p) |
||||
{ |
||||
- if (state) |
||||
+ if (state) { |
||||
gpt_part_data->type = p->type_uuid; |
||||
- else if (guid_cmp (gpt_part_data->type, p->type_uuid) == 0) |
||||
+ } else if (guid_cmp (gpt_part_data->type, p->type_uuid) == 0) { |
||||
+ // Clear the GUID so that fs_type will be used to return it to the default |
||||
+ gpt_part_data->type = PARTITION_LINUX_DATA_GUID; |
||||
return gpt_partition_set_system (part, part->fs_type); |
||||
+ } |
||||
return 1; |
||||
} |
||||
|
||||
-- |
||||
2.37.1 |
||||
|
@ -0,0 +1,160 @@
@@ -0,0 +1,160 @@
|
||||
From 8b4a30cc60ecbe9b7bc966e70560e5ce0fc0c1ad Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Mon, 8 Aug 2022 13:49:09 -0700 |
||||
Subject: [PATCH 7/9] tests: Add a libparted test for ped_partition_set_system |
||||
on gpt |
||||
|
||||
Test the libparted API to make sure the flag is not cleared by calling |
||||
ped_partition_set_system. |
||||
--- |
||||
libparted/tests/Makefile.am | 6 ++- |
||||
libparted/tests/flags.c | 81 ++++++++++++++++++++++++++++++++++ |
||||
libparted/tests/t1001-flags.sh | 23 ++++++++++ |
||||
3 files changed, 108 insertions(+), 2 deletions(-) |
||||
create mode 100644 libparted/tests/flags.c |
||||
create mode 100755 libparted/tests/t1001-flags.sh |
||||
|
||||
diff --git a/libparted/tests/Makefile.am b/libparted/tests/Makefile.am |
||||
index fd5cba5..260b692 100644 |
||||
--- a/libparted/tests/Makefile.am |
||||
+++ b/libparted/tests/Makefile.am |
||||
@@ -3,9 +3,10 @@ |
||||
# |
||||
# This file may be modified and/or distributed without restriction. |
||||
|
||||
-TESTS = t1000-label.sh t2000-disk.sh t2100-zerolen.sh t3000-symlink.sh t4000-volser.sh |
||||
+TESTS = t1000-label.sh t1001-flags.sh t2000-disk.sh t2100-zerolen.sh \ |
||||
+ t3000-symlink.sh t4000-volser.sh |
||||
EXTRA_DIST = $(TESTS) |
||||
-check_PROGRAMS = label disk zerolen symlink volser |
||||
+check_PROGRAMS = label disk zerolen symlink volser flags |
||||
AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) |
||||
|
||||
LDADD = \ |
||||
@@ -24,6 +25,7 @@ disk_SOURCES = common.h common.c disk.c |
||||
zerolen_SOURCES = common.h common.c zerolen.c |
||||
symlink_SOURCES = common.h common.c symlink.c |
||||
volser_SOURCES = common.h common.c volser.c |
||||
+flags_SOURCES = common.h common.c flags.c |
||||
|
||||
# Arrange to symlink to tests/init.sh. |
||||
CLEANFILES = init.sh |
||||
diff --git a/libparted/tests/flags.c b/libparted/tests/flags.c |
||||
new file mode 100644 |
||||
index 0000000..c83a361 |
||||
--- /dev/null |
||||
+++ b/libparted/tests/flags.c |
||||
@@ -0,0 +1,81 @@ |
||||
+#include <config.h> |
||||
+#include <unistd.h> |
||||
+ |
||||
+#include <check.h> |
||||
+ |
||||
+#include <parted/parted.h> |
||||
+ |
||||
+#include "common.h" |
||||
+#include "progname.h" |
||||
+ |
||||
+#define STREQ(a, b) (strcmp (a, b) == 0) |
||||
+ |
||||
+static char* temporary_disk; |
||||
+ |
||||
+static void |
||||
+create_disk (void) |
||||
+{ |
||||
+ temporary_disk = _create_disk (80 * 1024 * 1024); |
||||
+ fail_if (temporary_disk == NULL, "Failed to create temporary disk"); |
||||
+} |
||||
+ |
||||
+static void |
||||
+destroy_disk (void) |
||||
+{ |
||||
+ unlink (temporary_disk); |
||||
+ free (temporary_disk); |
||||
+} |
||||
+ |
||||
+/* TEST: Test partition type flag on gpt disklabel */ |
||||
+START_TEST (test_gpt_flag) |
||||
+{ |
||||
+ PedDevice* dev = ped_device_get (temporary_disk); |
||||
+ if (dev == NULL) |
||||
+ return; |
||||
+ |
||||
+ PedDisk* disk = ped_disk_new_fresh (dev, ped_disk_type_get ("gpt")); |
||||
+ PedConstraint *constraint = ped_constraint_any (dev); |
||||
+ PedPartition *part = ped_partition_new (disk, PED_PARTITION_NORMAL, |
||||
+ ped_file_system_type_get("ext4"), 2048, 4096); |
||||
+ ped_partition_set_flag(part, PED_PARTITION_BIOS_GRUB, 1); |
||||
+ // Type should remain set to BIOS_GRUB |
||||
+ ped_partition_set_system(part, ped_file_system_type_get("ext4")); |
||||
+ |
||||
+ ped_disk_add_partition (disk, part, constraint); |
||||
+ ped_disk_commit (disk); |
||||
+ ped_constraint_destroy (constraint); |
||||
+ |
||||
+ // Check flag to confirm it is still set |
||||
+ part = ped_disk_get_partition (disk, 1); |
||||
+ fail_if (ped_partition_get_flag(part, PED_PARTITION_BIOS_GRUB) != 1, "BIOS_GRUB flag not set"); |
||||
+ |
||||
+ ped_disk_destroy (disk); |
||||
+ ped_device_destroy (dev); |
||||
+} |
||||
+END_TEST |
||||
+ |
||||
+int |
||||
+main (int argc, char **argv) |
||||
+{ |
||||
+ set_program_name (argv[0]); |
||||
+ int number_failed; |
||||
+ Suite* suite = suite_create ("Partition Flags"); |
||||
+ TCase* tcase_gpt = tcase_create ("GPT"); |
||||
+ |
||||
+ /* Fail when an exception is raised */ |
||||
+ ped_exception_set_handler (_test_exception_handler); |
||||
+ |
||||
+ tcase_add_checked_fixture (tcase_gpt, create_disk, destroy_disk); |
||||
+ tcase_add_test (tcase_gpt, test_gpt_flag); |
||||
+ /* Disable timeout for this test */ |
||||
+ tcase_set_timeout (tcase_gpt, 0); |
||||
+ suite_add_tcase (suite, tcase_gpt); |
||||
+ |
||||
+ SRunner* srunner = srunner_create (suite); |
||||
+ srunner_run_all (srunner, CK_VERBOSE); |
||||
+ |
||||
+ number_failed = srunner_ntests_failed (srunner); |
||||
+ srunner_free (srunner); |
||||
+ |
||||
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; |
||||
+} |
||||
diff --git a/libparted/tests/t1001-flags.sh b/libparted/tests/t1001-flags.sh |
||||
new file mode 100755 |
||||
index 0000000..60a6248 |
||||
--- /dev/null |
||||
+++ b/libparted/tests/t1001-flags.sh |
||||
@@ -0,0 +1,23 @@ |
||||
+#!/bin/sh |
||||
+# run the flags unittest |
||||
+ |
||||
+# Copyright (C) 2007-2014, 2019-2022 Free Software Foundation, Inc. |
||||
+ |
||||
+# This program is free software; you can redistribute it and/or modify |
||||
+# it under the terms of the GNU General Public License as published by |
||||
+# the Free Software Foundation; either version 3 of the License, or |
||||
+# (at your option) any later version. |
||||
+ |
||||
+# This program is distributed in the hope that it will be useful, |
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
+# GNU General Public License for more details. |
||||
+ |
||||
+# You should have received a copy of the GNU General Public License |
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
+ |
||||
+. "${top_srcdir=../..}/tests/init.sh"; path_prepend_ . |
||||
+ |
||||
+flags || fail=1 |
||||
+ |
||||
+Exit $fail |
||||
-- |
||||
2.37.1 |
||||
|
@ -0,0 +1,109 @@
@@ -0,0 +1,109 @@
|
||||
From d37d5e7a9470bb5bf8446f79f8e9c508366e06b6 Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Mon, 8 Aug 2022 15:02:30 -0700 |
||||
Subject: [PATCH 8/9] libparted: Fix handling of msdos partition types |
||||
|
||||
This restores the previous behavior by testing the partition type |
||||
against the list of known types and skipping the filesystem type reset. |
||||
Now the sequence of: |
||||
|
||||
ped_partition_new(...) |
||||
ped_partition_set_flag(part, PED_PARTITION_BLS_BOOT, 1); |
||||
ped_partition_set_system(part, ped_file_system_type_get("ext4")); |
||||
|
||||
Will keep the type set to PED_PARTITION_BLS_BOOT, which is how it used |
||||
to behave. |
||||
--- |
||||
libparted/labels/dos.c | 54 +++++++++++++++++++++++++++++++++++------- |
||||
1 file 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) { |
||||
-- |
||||
2.37.1 |
||||
|
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
From 3deaae7a19ebfbc2dad6ad67ba65409e7238efc8 Mon Sep 17 00:00:00 2001 |
||||
From: "Brian C. Lane" <bcl@redhat.com> |
||||
Date: Mon, 8 Aug 2022 15:06:03 -0700 |
||||
Subject: [PATCH 9/9] tests: Add a libparted test for ped_partition_set_system |
||||
on msdos |
||||
|
||||
Test the libparted API to make sure the flag is not cleared by calling |
||||
ped_partition_set_system. |
||||
--- |
||||
libparted/tests/flags.c | 35 +++++++++++++++++++++++++++++++++++ |
||||
1 file changed, 35 insertions(+) |
||||
|
||||
diff --git a/libparted/tests/flags.c b/libparted/tests/flags.c |
||||
index c83a361..c4b290b 100644 |
||||
--- a/libparted/tests/flags.c |
||||
+++ b/libparted/tests/flags.c |
||||
@@ -54,6 +54,34 @@ START_TEST (test_gpt_flag) |
||||
} |
||||
END_TEST |
||||
|
||||
+/* TEST: Test partition type flag on msdos disklabel */ |
||||
+START_TEST (test_msdos_flag) |
||||
+{ |
||||
+ PedDevice* dev = ped_device_get (temporary_disk); |
||||
+ if (dev == NULL) |
||||
+ return; |
||||
+ |
||||
+ PedDisk* disk = ped_disk_new_fresh (dev, ped_disk_type_get ("msdos")); |
||||
+ PedConstraint *constraint = ped_constraint_any (dev); |
||||
+ PedPartition *part = ped_partition_new (disk, PED_PARTITION_NORMAL, |
||||
+ ped_file_system_type_get("ext4"), 2048, 4096); |
||||
+ ped_partition_set_flag(part, PED_PARTITION_BLS_BOOT, 1); |
||||
+ // Type should remain set to BIOS_GRUB |
||||
+ ped_partition_set_system(part, ped_file_system_type_get("ext4")); |
||||
+ |
||||
+ ped_disk_add_partition (disk, part, constraint); |
||||
+ ped_disk_commit (disk); |
||||
+ ped_constraint_destroy (constraint); |
||||
+ |
||||
+ // Check flag to confirm it is still set |
||||
+ part = ped_disk_get_partition (disk, 1); |
||||
+ fail_if (ped_partition_get_flag(part, PED_PARTITION_BLS_BOOT) != 1, "BLS_BOOT flag not set"); |
||||
+ |
||||
+ ped_disk_destroy (disk); |
||||
+ ped_device_destroy (dev); |
||||
+} |
||||
+END_TEST |
||||
+ |
||||
int |
||||
main (int argc, char **argv) |
||||
{ |
||||
@@ -61,6 +89,7 @@ main (int argc, char **argv) |
||||
int number_failed; |
||||
Suite* suite = suite_create ("Partition Flags"); |
||||
TCase* tcase_gpt = tcase_create ("GPT"); |
||||
+ TCase* tcase_msdos = tcase_create ("MSDOS"); |
||||
|
||||
/* Fail when an exception is raised */ |
||||
ped_exception_set_handler (_test_exception_handler); |
||||
@@ -71,6 +100,12 @@ main (int argc, char **argv) |
||||
tcase_set_timeout (tcase_gpt, 0); |
||||
suite_add_tcase (suite, tcase_gpt); |
||||
|
||||
+ tcase_add_checked_fixture (tcase_msdos, create_disk, destroy_disk); |
||||
+ tcase_add_test (tcase_msdos, test_msdos_flag); |
||||
+ /* Disable timeout for this test */ |
||||
+ tcase_set_timeout (tcase_msdos, 0); |
||||
+ suite_add_tcase (suite, tcase_msdos); |
||||
+ |
||||
SRunner* srunner = srunner_create (suite); |
||||
srunner_run_all (srunner, CK_VERBOSE); |
||||
|
||||
-- |
||||
2.37.1 |
||||
|
Loading…
Reference in new issue