diff options
author | Martin Whitaker <mageia@martin-whitaker.me.uk> | 2015-04-19 21:35:31 +0100 |
---|---|---|
committer | Pascal Terjan <pterjan@gmail.com> | 2015-04-19 21:15:19 +0000 |
commit | 1daabebda57976579465e5c281eaa14088e0e37f (patch) | |
tree | e5715742b7154312205add46747b2bcec8c04738 /perl-install/c | |
parent | 94e8350da5fe301f40ea929c12f1ed000d87a285 (diff) | |
download | drakx-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-x | perl-install/c/stuff.xs.pl | 46 |
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 '; - |