diff options
Diffstat (limited to 'perl-install/fs/proc_partitions.pm')
| -rw-r--r-- | perl-install/fs/proc_partitions.pm | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/perl-install/fs/proc_partitions.pm b/perl-install/fs/proc_partitions.pm index 1cb3acfd1..ea714ca5b 100644 --- a/perl-install/fs/proc_partitions.pm +++ b/perl-install/fs/proc_partitions.pm @@ -1,4 +1,4 @@ -package fs::proc_partitions; # $Id$ +package fs::proc_partitions; use common; @@ -6,8 +6,12 @@ use common; sub read_raw() { my (undef, undef, @all) = cat_("/proc/partitions"); grep { - $_->{size} != 1 && # skip main extended partition - $_->{size} != 0x3fffffff; # skip cdroms (otherwise stops cd-audios) + $_->{size} != 1 && # skip main extended partition + $_->{size} != 0x3fffffff && # skip cdroms (otherwise stops cd-audios) + $_->{dev} !~ /mmcblk\d+[^p]/; # only keep partitions like mmcblk0p0 + # not mmcblk0rpmb or mmcblk0boot0 as they + # are not in the partition table and + # things will break (mga#15759) } map { my %l; @l{qw(major minor size dev)} = split; @@ -16,40 +20,27 @@ sub read_raw() { } sub read { - my ($hds) = @_; + my ($hds, $o_ignore_fstype) = @_; my @all = read_raw(); - my ($parts, $disks) = partition { $_->{dev} =~ /\d$/ && $_->{dev} !~ /^(sr|scd)/ } @all; - - my $devfs_like = any { $_->{dev} =~ m|/disc$| } @$disks; + my ($parts, $_disks) = partition { $_->{dev} =~ /\d$/ && $_->{dev} !~ /^(sr|scd)/ } @all; fs::get_major_minor($hds); - my %devfs2normal = map { - my $hd = $_; - my $disk = find { $_->{major} == $hd->{major} && $_->{minor} == $hd->{minor} } @$disks; - $disk->{dev} => $_->{device}; - } @$hds; - my $prev_part; foreach my $part (@$parts) { - my $dev; - if ($devfs_like) { - $dev = -e "/dev/$part->{dev}" ? $part->{dev} : sprintf("0x%x%02x", $part->{major}, $part->{minor}); - $part->{rootDevice} = $devfs2normal{dirname($part->{dev}) . '/disc'}; - } else { - $dev = $part->{dev}; - if (my $hd = find { $part->{dev} =~ /^\Q$_->{device}\E./ } @$hds) { - put_in_hash($part, partition_table::hd2minimal_part($hd)); - } + my $dev = $part->{dev}; + if (my $hd = find { $part->{dev} =~ /^\Q$_->{device}\E./ } @$hds) { + put_in_hash($part, partition_table::hd2minimal_part($hd)); } + undef $prev_part if $prev_part && ($prev_part->{rootDevice} || '') ne ($part->{rootDevice} || ''); $part->{device} = $dev; $part->{size} *= 2; # from KB to sectors $part->{start} = $prev_part ? $prev_part->{start} + $prev_part->{size} : 0; require fs::type; - put_in_hash($part, fs::type::type_subpart_from_magic($part)); + put_in_hash($part, fs::type::type_subpart_from_magic($part)) if !$o_ignore_fstype; $prev_part = $part; delete $part->{dev}; # cleanup } @@ -59,28 +50,33 @@ sub read { sub compare { my ($hd) = @_; + eval { $hd->isa('partition_table::lvm') } and return; + + my @l1 = partition_table::get_normal_parts($hd); - my @l2 = grep { $_->{rootDevice} eq $hd->{device} } &read([$hd]); + my @l2 = grep { $_->{rootDevice} eq $hd->{device} } &read([$hd], 1); #- /proc/partitions includes partition with type "empty" and a non-null size #- so add them for comparison my ($len1, $len2) = (int(@l1) + $hd->{primary}{nb_special_empty}, int(@l2)); - if ($len1 != $len2 && arch() ne 'ppc') { - die sprintf( - "/proc/partitions does not agree with drakx %d != %d:\n%s\n", $len1, $len2, + if ($len1 != $len2) { + if (find { $_->{pt_type} == 0xbf } @l1) { + log::l("not using /proc/partitions because of the presence of solaris extended partition"); #- cf #33866 + } else { + die sprintf( + "/proc/partitions does not agree with drakx %d != %d for %s:\n%s\n", $len1, $len2, $hd->{device}, "/proc/partitions: " . join(", ", map { "$_->{device} ($_->{rootDevice})" } @l2)); + } } $len2; } sub use_ { my ($hd) = @_; - - partition_table::raw::zero_MBR($hd); - $hd->{readonly} = 1; - $hd->{getting_rid_of_readonly_allowed} = 1; - $hd->{primary} = { normal => [ grep { $_->{rootDevice} eq $hd->{device} } &read([$hd]) ] }; + + require partition_table::readonly; + partition_table::readonly->initialize($hd, [ grep { $_->{rootDevice} eq $hd->{device} } &read([$hd]) ]); } 1; |
