Mageia Bugzilla – Attachment 6317 Details for
Bug 15621
Installer/Live boot/drakxtools scanning hard disk partitions step very slow
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
New Account
|
Forgot Password
Patch to speed up reading of partition flags
0001-Speed-up-reading-of-flags-from-GPT-partition-table.patch (text/plain), 4.79 KB, created by
Martin Whitaker
on 2015-04-19 22:53:22 CEST
(
hide
)
Description:
Patch to speed up reading of partition flags
Filename:
MIME Type:
Creator:
Martin Whitaker
Created:
2015-04-19 22:53:22 CEST
Size:
4.79 KB
patch
obsolete
>From 5b9c1f9512a16fa62c8a9d6ca2e1d86b1ac28e7f Mon Sep 17 00:00:00 2001 >From: Martin Whitaker <mageia@martin-whitaker.me.uk> >Date: Sun, 19 Apr 2015 21:35:31 +0100 >Subject: [PATCH] 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. Instead, collect the flags during the call to >c::get_disk_partitions. > >diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl >index 9d8c113..229e3b8 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 > '; >- >diff --git a/perl-install/partition_table/gpt.pm b/perl-install/partition_table/gpt.pm >index 1a284c2..0f0f45c 100644 >--- a/perl-install/partition_table/gpt.pm >+++ b/perl-install/partition_table/gpt.pm >@@ -111,13 +111,13 @@ sub read_one { > # FIXME: just use '@pt = map { ... } c::...' if part_numbers are always linear: > foreach (c::get_disk_partitions($hd->{file})) { > # fix detecting ESP (special case are they're detected through pt_type): >- if (c::get_partition_flag($hd->{file}, $_->{part_number}, 'ESP')) { >+ if ($_->{flag} eq 'ESP') { > $_->{pt_type} = 0xef; >- } elsif (c::get_partition_flag($hd->{file}, $_->{part_number}, 'LVM')) { >+ } elsif ($_->{flag} eq 'LVM') { > $_->{pt_type} = 0x8e; >- } elsif (c::get_partition_flag($hd->{file}, $_->{part_number}, 'RAID')) { >+ } elsif ($_->{flag} eq 'RAID') { > $_->{pt_type} = 0xfd; >- } elsif (c::is_recovery_partition($hd->{file}, $_->{part_number})) { >+ } elsif ($_->{flag} eq 'RECOVERY') { > $_->{pt_type} = 0x12; > } > $_->{fs_type} = 'swap' if $_->{fs_type} eq 'linux-swap(v1)'; >-- >2.3.2
From 5b9c1f9512a16fa62c8a9d6ca2e1d86b1ac28e7f Mon Sep 17 00:00:00 2001 From: Martin Whitaker <mageia@martin-whitaker.me.uk> Date: Sun, 19 Apr 2015 21:35:31 +0100 Subject: [PATCH] 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. Instead, collect the flags during the call to c::get_disk_partitions. diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl index 9d8c113..229e3b8 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 '; - diff --git a/perl-install/partition_table/gpt.pm b/perl-install/partition_table/gpt.pm index 1a284c2..0f0f45c 100644 --- a/perl-install/partition_table/gpt.pm +++ b/perl-install/partition_table/gpt.pm @@ -111,13 +111,13 @@ sub read_one { # FIXME: just use '@pt = map { ... } c::...' if part_numbers are always linear: foreach (c::get_disk_partitions($hd->{file})) { # fix detecting ESP (special case are they're detected through pt_type): - if (c::get_partition_flag($hd->{file}, $_->{part_number}, 'ESP')) { + if ($_->{flag} eq 'ESP') { $_->{pt_type} = 0xef; - } elsif (c::get_partition_flag($hd->{file}, $_->{part_number}, 'LVM')) { + } elsif ($_->{flag} eq 'LVM') { $_->{pt_type} = 0x8e; - } elsif (c::get_partition_flag($hd->{file}, $_->{part_number}, 'RAID')) { + } elsif ($_->{flag} eq 'RAID') { $_->{pt_type} = 0xfd; - } elsif (c::is_recovery_partition($hd->{file}, $_->{part_number})) { + } elsif ($_->{flag} eq 'RECOVERY') { $_->{pt_type} = 0x12; } $_->{fs_type} = 'swap' if $_->{fs_type} eq 'linux-swap(v1)'; -- 2.3.2
View Attachment As Raw
Actions:
View
Attachments on
bug 15621
:
6178
|
6316
| 6317