summaryrefslogtreecommitdiffstats
path: root/perl-install/raid.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/raid.pm')
-rw-r--r--perl-install/raid.pm87
1 files changed, 46 insertions, 41 deletions
diff --git a/perl-install/raid.pm b/perl-install/raid.pm
index eedd121a6..9ae8db8ce 100644
--- a/perl-install/raid.pm
+++ b/perl-install/raid.pm
@@ -14,15 +14,15 @@ use commands;
use modules;
use fs;
-sub nb($) {
+sub nb {
my ($nb) = @_;
first((ref $nb ? $nb->{device} : $nb) =~ /(\d+)/);
}
sub new {
- my ($raid, @parts) = @_;
- my $nb = @$raid;
- $raid->[$nb] = { 'chunk-size' => "64k", type => 0x83, disks => [ @parts ], device => "md$nb", notFormatted => 1 };
+ my ($raids, @parts) = @_;
+ my $nb = @$raids;
+ $raids->[$nb] = { 'chunk-size' => "64k", type => 0x83, disks => [ @parts ], device => "md$nb", notFormatted => 1 };
foreach my $part (@parts) {
$part->{raid} = $nb;
delete $part->{mntpoint};
@@ -30,42 +30,47 @@ sub new {
$nb;
}
-sub add($$$) {
- my ($raid, $part, $nb) = @_; $nb = nb($nb);
- $raid->[$nb]{isMounted} and die _("Can't add a partition to _formatted_ RAID md%d", $nb);
+sub add {
+ my ($raids, $part, $nb) = @_; $nb = nb($nb);
+ $raids->[$nb]{isMounted} and die _("Can't add a partition to _formatted_ RAID md%d", $nb);
$part->{raid} = $nb;
delete $part->{mntpoint};
- push @{$raid->[$nb]{disks}}, $part;
+ push @{$raids->[$nb]{disks}}, $part;
}
-sub delete($$) {
- my ($raid, $nb) = @_;
+sub delete {
+ my ($raids, $nb) = @_;
$nb = nb($nb);
- delete $_->{raid} foreach @{$raid->[$nb]{disks}};
- undef $raid->[$nb];
+ delete $_->{raid} foreach @{$raids->[$nb]{disks}};
+ undef $raids->[$nb];
}
-sub changeNb($$$) {
- my ($raid, $oldnb, $newnb) = @_;
+sub changeNb {
+ my ($raids, $oldnb, $newnb) = @_;
if ($oldnb != $newnb) {
- ($raid->[$newnb], $raid->[$oldnb]) = ($raid->[$oldnb], undef);
- $raid->[$newnb]{device} = "md$newnb";
- $_->{raid} = $newnb foreach @{$raid->[$newnb]{disks}};
+ ($raids->[$newnb], $raids->[$oldnb]) = ($raids->[$oldnb], undef);
+ $raids->[$newnb]{device} = "md$newnb";
+ $_->{raid} = $newnb foreach @{$raids->[$newnb]{disks}};
}
$newnb;
}
-sub removeDisk($$) {
- my ($raid, $part) = @_;
+sub removeDisk {
+ my ($raids, $part) = @_;
my $nb = nb($part->{raid});
run_program::run("raidstop", devices::make($part->{device}));
delete $part->{raid};
- @{$raid->[$nb]{disks}} = grep { $_ != $part } @{$raid->[$nb]{disks}};
- update($raid->[$nb]);
+ my $disks = $raids->[$nb]{disks};
+ @$disks = grep { $_ != $part } @$disks;
+ if (@$disks) {
+ update($raids->[$nb]);
+ } else {
+ undef $raids->[$nb];
+ }
}
-sub updateSize($) {
+sub updateSize {
my ($part) = @_;
local $_ = $part->{level};
my @l = map { $_->{size} } @{$part->{disks}};
@@ -77,7 +82,7 @@ sub updateSize($) {
};
}
-sub module($) {
+sub module {
my ($part) = @_;
my $mod = $part->{level};
@@ -86,7 +91,7 @@ sub module($) {
$mod;
}
-sub updateIsFormatted($) {
+sub updateIsFormatted {
my ($part) = @_;
$part->{isFormatted} = and_ map { $_->{isFormatted} } @{$part->{disks}};
$part->{notFormatted} = and_ map { $_->{notFormatted} } @{$part->{disks}};
@@ -98,13 +103,13 @@ sub update {
}
}
-sub write($) {
- my ($raid, $file) = @_;
+sub write {
+ my ($raids, $file) = @_;
local *F;
local $\ = "\n";
open F, ">$file" or die _("Can't write file $file");
- foreach (grep {$_} @$raid) {
+ foreach (grep {$_} @$raids) {
print F <<"EOF";
raiddev /dev/$_->{device}
raid-level $_->{level}
@@ -120,39 +125,39 @@ EOF
}
sub make {
- my ($raid, $part) = @_;
- isMDRAID($_) and make($raid, $_) foreach @{$part->{disks}};
+ my ($raids, $part) = @_;
+ isRAID($_) and make($raids, $_) foreach @{$part->{disks}};
my $dev = devices::make($part->{device});
eval { modules::load(module($part)) };
- &write($raid, "/etc/raidtab");
+ &write($raids, "/etc/raidtab");
run_program::run("raidstop", $dev);
run_program::run("mkraid", "--really-force", $dev) or die
$::isStandalone ? _("mkraid failed (maybe raidtools are missing?)") : _("mkraid failed");
}
-sub format_part($$) {
- my ($raid, $part) = @_;
+sub format_part {
+ my ($raids, $part) = @_;
$part->{isFormatted} and return;
- make($raid->{raid}, $part);
+ make($raids, $part);
fs::real_format_part($part);
$_->{isFormatted} = 1 foreach @{$part->{disks}};
}
-sub verify($) {
- my ($raid) = @_;
- $raid && $raid->{raid} or return;
- foreach (grep {$_} @{$raid->{raid}}) {
+sub verify {
+ my ($raids) = @_;
+ $raids or return;
+ foreach (grep {$_} @$raids) {
@{$_->{disks}} >= ($_->{level} =~ /4|5/ ? 3 : 2) or die _("Not enough partitions for RAID level %d\n", $_->{level});
}
}
-sub prepare_prefixed($$) {
- my ($raid, $prefix) = @_;
- $raid && $raid->{raid} or return;
+sub prepare_prefixed {
+ my ($raids, $prefix) = @_;
+ $raids or return;
eval { commands::cp("-f", "/etc/raidtab", "$prefix/etc/raidtab") };
- foreach (@{$raid->{raid}}) {
+ foreach (grep {$_} @$raids) {
devices::make("$prefix/dev/$_->{device}") foreach @{$_->{disks}};
}
}