summaryrefslogtreecommitdiffstats
path: root/perl-install/c
diff options
context:
space:
mode:
authorMartin Whitaker <mageia@martin-whitaker.me.uk>2015-04-19 21:35:31 +0100
committerPascal Terjan <pterjan@gmail.com>2015-04-19 21:15:19 +0000
commit1daabebda57976579465e5c281eaa14088e0e37f (patch)
treee5715742b7154312205add46747b2bcec8c04738 /perl-install/c
parent94e8350da5fe301f40ea929c12f1ed000d87a285 (diff)
downloaddrakx-1daabebda57976579465e5c281eaa14088e0e37f.tar
drakx-1daabebda57976579465e5c281eaa14088e0e37f.tar.gz
drakx-1daabebda57976579465e5c281eaa14088e0e37f.tar.bz2
drakx-1daabebda57976579465e5c281eaa14088e0e37f.tar.xz
drakx-1daabebda57976579465e5c281eaa14088e0e37f.zip
Speed up reading of flags from GPT partition table.
On some machines, calls to ped_disk_new() in libparted take of the order of seconds, so doing this for each flag and partition in turn makes partition_table::gpt::read_one take an inordinate amount of time (mga#15621). Instead, collect the flags during the call to c::get_disk_partitions.
Diffstat (limited to 'perl-install/c')
-rwxr-xr-xperl-install/c/stuff.xs.pl46
1 files changed, 20 insertions, 26 deletions
diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl
index 9d8c11375..229e3b8ab 100755
--- a/perl-install/c/stuff.xs.pl
+++ b/perl-install/c/stuff.xs.pl
@@ -132,6 +132,15 @@ PedPartitionFlag string_to_pedpartflag(char*type) {
return flag;
}
+int is_recovery_partition(PedPartition*part) {
+ /* FIXME: not sure everything is covered ... */
+ return ped_partition_get_flag(part, PED_PARTITION_HPSERVICE) // HP-UX service partition
+ || ped_partition_get_flag(part, PED_PARTITION_MSFT_RESERVED) // Microsoft Reserved Partition -> LDM metadata, ...
+ || ped_partition_get_flag(part, PED_PARTITION_DIAG) // ==> PARTITION_MSFT_RECOVERY (Windows Recovery Environment)
+ || ped_partition_get_flag(part, PED_PARTITION_APPLE_TV_RECOVERY)
+ || ped_partition_get_flag(part, PED_PARTITION_HIDDEN);
+}
+
MODULE = c::stuff PACKAGE = c::stuff
';
@@ -591,31 +600,6 @@ get_iso_volume_ids(int fd)
print '
int
-is_recovery_partition(char * device_path, int part_number)
- CODE:
- PedDevice *dev = ped_device_get(device_path);
- RETVAL = 0;
- if(dev) {
- PedDisk* disk = ped_disk_new(dev);
- if(disk) {
- PedPartition* part = ped_disk_get_partition(disk, part_number);
- if (!part) {
- printf("is_recovery_partition: failed to find partition\n");
- } else {
- /* FIXME: not sure everything is covered ... */
- RETVAL=ped_partition_get_flag(part, PED_PARTITION_HPSERVICE) // HP-UX service partition
- || ped_partition_get_flag(part, PED_PARTITION_MSFT_RESERVED) // Microsoft Reserved Partition -> LDM metadata, ...
- || ped_partition_get_flag(part, PED_PARTITION_DIAG) // ==> PARTITION_MSFT_RECOVERY (Windows Recovery Environment)
- || ped_partition_get_flag(part, PED_PARTITION_APPLE_TV_RECOVERY)
- || ped_partition_get_flag(part, PED_PARTITION_HIDDEN);
- }
- ped_disk_destroy(disk);
- }
- }
- OUTPUT:
- RETVAL
-
-int
get_partition_flag(char * device_path, int part_number, char *type)
CODE:
PedDevice *dev = ped_device_get(device_path);
@@ -700,12 +684,23 @@ get_disk_partitions(char * device_path)
continue;
}
char *path = ped_partition_get_path(part);
+ char *flag = "";
+ if (ped_partition_get_flag(part, PED_PARTITION_ESP)) {
+ flag = "ESP";
+ } else if (ped_partition_get_flag(part, PED_PARTITION_LVM)) {
+ flag = "LVM";
+ } else if (ped_partition_get_flag(part, PED_PARTITION_RAID)) {
+ flag = "RAID";
+ } else if (is_recovery_partition(part)) {
+ flag = "RECOVERY";
+ }
HV * rh = (HV *)sv_2mortal((SV *)newHV());
hv_store(rh, "part_number", 11, newSViv(part->num), 0);
hv_store(rh, "real_device", 11, newSVpv(path, 0), 0);
hv_store(rh, "start", 5, newSViv(part->geom.start), 0);
hv_store(rh, "size", 4, newSViv(part->geom.length), 0);
hv_store(rh, "pt_type", 7, newSViv(0xba), 0);
+ hv_store(rh, "flag", 4, newSVpv(flag, 0), 0);
free(path);
if(part->fs_type)
hv_store(rh, "fs_type", 7, newSVpv(part->fs_type->name, 0), 0);
@@ -882,4 +877,3 @@ print '
PROTOTYPES: DISABLE
';
-