summaryrefslogtreecommitdiffstats
path: root/perl-install/partition_table_raw.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/partition_table_raw.pm')
-rw-r--r--perl-install/partition_table_raw.pm44
1 files changed, 20 insertions, 24 deletions
diff --git a/perl-install/partition_table_raw.pm b/perl-install/partition_table_raw.pm
index a08cffecd..d64223990 100644
--- a/perl-install/partition_table_raw.pm
+++ b/perl-install/partition_table_raw.pm
@@ -36,18 +36,8 @@ sub cylinder_size($) {
$hd->{geom}{sectors} * $hd->{geom}{heads};
}
-#- defaults methods for adjusting start and end for partitions, these
-#- methods will shrink the partition inside current limits, but think
-#- of this: hidden extended partitions that contains logical ones are
-#- not specified, so end is always almost above a cylinders boundaries
-#- by the start of a logical partitions (sectors, ie 63 generally) inside
-#- its hidden extended containers. so for adjustEnd, it is very important
-#- to round_down to cylinder boundarie else partitions will overlap.
-#- furthermore on the interface, choosing 1Mb more is possible that
-#- will go again beyond the normal cylinders boundaries, which may
-#- cause overlaping partitions again :-(
-#- until all the code in diskdrake is not cleaned up perfectly, rounding
-#- down for the end is necessary.
+#- default method for starting a partition, only head size or twice it
+#- is allowed for starting a partition after a cylinder boundarie.
sub adjustStart($$) {
my ($hd, $part) = @_;
my $end = $part->{start} + $part->{size};
@@ -57,23 +47,29 @@ sub adjustStart($$) {
$hd->{geom}{sectors} : cylinder_size($hd));
$part->{size} = $end - $part->{start};
}
+#- this method could be used for when partitions informations will be accurate.
+#- $end2 is updated to take into account logical partitions where two heads of
+#- sectors (typically 63 each) exists before the real start of the partition (used
+#- by hidden magic extended partition.
+#- if size go above the first two heads of a cylinder, the whole cylinder is eaten
+#- by the partition, so overlapping can occur in such case (but it is not allowed).
sub adjustEnd($$) {
my ($hd, $part) = @_;
my $end = $part->{start} + $part->{size};
- my $end2 = round_down($end, cylinder_size($hd));
- unless ($part->{start} < $end2) {
- $end2 = round_up($end, cylinder_size($hd));
- }
+ my $end2 = round_up($end - 2 * $hd->{geom}{sectors}, cylinder_size($hd));
+ $end2 = $hd->{geom}{cylinders} * cylinder_size($hd) if $end2 > $hd->{geom}{cylinders} * cylinder_size($hd);
$part->{size} = $end2 - $part->{start};
}
-#- this method could be used for when partitions informations will be accurate.
-#- sub adjustEnd($$) {
-#- my ($hd, $part) = @_;
-#- my $end = $part->{start} + $part->{size} - $hd->{geom}{sectors} - 1; #- magically reduces the end, will be rounded up.
-#- my $end2 = round_up($end, cylinder_size($hd));
-#- $end2 = $hd->{geom}{cylinders} * cylinder_size($hd) if $end2 > $hd->{geom}{cylinders} * cylinder_size($hd);
-#- $part->{size} = $end2 - $part->{start};
-#-}
+#- original method for adjustEnd, keep it while the above has not been tested completely.
+#sub adjustEnd($$) {
+# my ($hd, $part) = @_;
+# my $end = $part->{start} + $part->{size};
+# my $end2 = round_down($end, cylinder_size($hd));
+# unless ($part->{start} < $end2) {
+# $end2 = round_up($end, cylinder_size($hd));
+# }
+# $part->{size} = $end2 - $part->{start};
+#}
sub get_geometry($) {
my ($dev) = @_;