diff options
Diffstat (limited to 'perl-install/partition_table_sun.pm')
-rw-r--r-- | perl-install/partition_table_sun.pm | 41 |
1 files changed, 14 insertions, 27 deletions
diff --git a/perl-install/partition_table_sun.pm b/perl-install/partition_table_sun.pm index 808944b8c..9ffa008a8 100644 --- a/perl-install/partition_table_sun.pm +++ b/perl-install/partition_table_sun.pm @@ -52,12 +52,9 @@ sub adjustStart($$) { #- since partition must always start on cylinders boundaries on sparc, #- note that if start sector is on the first cylinder, it is adjusted #- to 0 and it is valid. - $part->{start} = $part->{start} >= partition_table::cylinder_size() ? round_up($part->{start}, partition_table::cylinder_size($hd)) : 0; + $part->{start} = $part->{start} >= $hd->cylinder_size() ? round_up($part->{start}, $hd->cylinder_size()) : 0; $part->{size} = $end - $part->{start}; } -sub adjustEnd($$) { - &partition_table::adjustEnd; -} #- compute crc checksum used for Sun Label partition, expect #- $tmp to be the 512 bytes buffer to be read/written to MBR. @@ -93,7 +90,7 @@ sub read($$) { my %h; @h{@$fields1} = unpack $format1, $_[0]; @h{@$fields2} = unpack $format2, $_[1]; - $h{start} = $sector + $h{start_cylinder} * partition_table::cylinder_size($hd); + $h{start} = $sector + $h{start_cylinder} * $hd->cylinder_size(); # $h{type} = $typeToDos{$h{type}} || $h{type}; #- for rewrite it ? $h{size} or $h{$_} = 0 foreach keys %h; \%h; @@ -118,9 +115,9 @@ sub write($$$;$) { } ($info->{infos}, $info->{partitions}) = map { join '', @$_ } list2kv map { - $_->{start} % partition_table::cylinder_size($hd) == 0 or die "partition not at beginning of cylinder"; + $_->{start} % $hd->cylinder_size() == 0 or die "partition not at beginning of cylinder"; # local $_->{type} = $typeFromDos{$_->{type}} || $_->{type}; - local $_->{start_cylinder} = $_->{start} / partition_table::cylinder_size($hd) - $sector; + local $_->{start_cylinder} = $_->{start} / $hd->cylinder_size() - $sector; pack($format1, @$_{@$fields1}), pack($format2, @$_{@$fields2}); } @$pt; @@ -137,6 +134,15 @@ sub write($$$;$) { sub info { my ($hd) = @_; + #- take care of reduction of the number of cylinders, avoid loop of reduction! + unless ($hd->{geom}{total_cylinders} > $hd->{geom}{cylinders}) { + $hd->{geom}{total_cylinders} = $hd->{geom}{cylinders}; + $hd->{geom}{cylinders} -= 2; + + #- rebuild some constants according to number of cylinders. + $hd->{totalsectors} = $hd->{geom}{heads} * $hd->{geom}{sectors} * $hd->{geom}{cylinders}; + } + #- build a default suitable partition table, #- checksum will be built when writing on disk. #- note third partition is ALWAYS of type Whole disk. @@ -154,25 +160,6 @@ sub info { }; $info; -# my $dtype_scsi = 4; #- taken from fdisk, removed unused one, -# my $dtype_ST506 = 6; #- see fdisk for more -# { -# magic => $magic, -# magic2 => $magic, -# dtype => $hd->{device} =~ /^sd/ ? $dtype_scsi : $dtype_ST506, -# secsize => $common::SECTORSIZE, -# ncylinders => $hd->{geom}{cylinders}, -# secpercyl => partition_table::cylinder_size($hd), -# secprtunit => $hd->{geom}{totalsectors}, -# rpm => 3600, -# interleave => 1, -# trackskew => 0, -# cylskew => 0, -# headswitch => 0, -# trkseek => 0, -# bbsize => 8192, #- size of boot area, with label -# sbsize => 8192, #- max size of fs superblock -# }; } sub clear_raw { @@ -184,7 +171,7 @@ sub clear_raw { type => 5, #- the whole disk type. flags => 0, start_cylinder => 0, - size => $hd->{geom}{cylinders} * partition_table::cylinder_size($hd), + size => $hd->{geom}{cylinders} * $hd->cylinder_size(), }; $pt; |