summaryrefslogtreecommitdiffstats
path: root/perl-install/raid.pm
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>1999-11-09 03:02:37 +0000
committerPascal Rigaux <pixel@mandriva.com>1999-11-09 03:02:37 +0000
commit950fe7395621dc21885ac3e1280e007248646608 (patch)
treee3016a95189ee4c75a05b816d91dd22f071bd2c0 /perl-install/raid.pm
parentc7df31b71335c18d60cdb8a7f5fee24d56cca4b8 (diff)
downloaddrakx-950fe7395621dc21885ac3e1280e007248646608.tar
drakx-950fe7395621dc21885ac3e1280e007248646608.tar.gz
drakx-950fe7395621dc21885ac3e1280e007248646608.tar.bz2
drakx-950fe7395621dc21885ac3e1280e007248646608.tar.xz
drakx-950fe7395621dc21885ac3e1280e007248646608.zip
no_comment
Diffstat (limited to 'perl-install/raid.pm')
-rw-r--r--perl-install/raid.pm112
1 files changed, 112 insertions, 0 deletions
diff --git a/perl-install/raid.pm b/perl-install/raid.pm
new file mode 100644
index 000000000..7cc2eb7d6
--- /dev/null
+++ b/perl-install/raid.pm
@@ -0,0 +1,112 @@
+package raid;
+
+use diagnostics;
+use strict;
+
+#-######################################################################################
+#- misc imports
+#-######################################################################################
+use common qw(:common :functional);
+use run_program;
+use devices;
+use fs;
+
+sub nb($) {
+ my ($nb) = @_;
+ first((ref $nb ? $nb->{device} : $nb) =~ /(\d+)/);
+}
+
+sub is($) {
+ my ($part) = @_;
+ $part->{device} =~ /^md/;
+}
+
+sub new($$) {
+ my ($raid, $part) = @_;
+ my $nb = @$raid;
+ $raid->[$nb] = { 'chunk-size' => "64k", type => 0x83, disks => [ $part ], device => "md$nb", notFormatted => 1 };
+ $part->{raid} = $nb;
+}
+
+sub add($$$) {
+ my ($raid, $part, $nb) = @_;
+ $raid->[$nb]{isMounted} and die _("Can't add a partition to _formatted_ RAID md%d", $nb);
+ $part->{raid} = $nb;
+ push @{$raid->[$nb]{disks}}, $part;
+}
+
+sub delete($$) {
+ my ($raid, $nb) = @_;
+ $nb = nb($nb);
+
+ delete $_->{raid} foreach @{$raid->[$nb]{disks}};
+ $raid->[$nb] = undef;
+}
+
+sub removeDisk($$) {
+ my ($raid, $part) = @_;
+ my $nb = nb($part->{raid});
+ delete $part->{raid};
+ @{$raid->[$nb]{disks}} = grep { $_ != $part } @{$raid->[$nb]{disks}};
+ update($raid->[$nb]);
+}
+
+sub updateSize($) {
+ my ($part) = @_;
+ local $_ = $part->{level};
+ my @l = map { $_->{size} } @{$part->{disks}};
+
+ $part->{size} = do {
+ if (/0|linear/) { sum @l }
+ elsif (/1/ ) { min @l }
+ elsif (/4|5/) { min(@l) * $#l }
+ };
+}
+
+sub updateIsFormatted($) {
+ my ($part) = @_;
+ $part->{isFormatted} = and_ map { $_->{isFormatted} } @{$part->{disks}};
+ $part->{notFormatted} = and_ map { $_->{notFormatted} } @{$part->{disks}};
+}
+sub update($) {
+ &updateSize;
+ &updateIsFormatted;
+}
+
+sub write($) {
+ my ($raid, $file) = @_;
+ local *F;
+ local $\ = "\n";
+
+ foreach (grep {$_} @$raid) {
+ open F, ">$file" or die _("Can't write file $file");
+ print F <<"EOF";
+raiddev /dev/$_->{device}
+raid-level $_->{level}
+chunk-size $_->{'chunk-size'}
+persistent-superblock 1
+EOF
+ print F "nr-raid-disks ", int @{$_->{disks}};
+ map_index {
+ print F " device /dev/$_->{device}";
+ print F " raid-disk $::i";
+ } @{$_->{disks}};
+ }
+}
+
+sub make($$) {
+ my ($raid, $part) = @_;
+ my $dev = devices::make($part->{device});
+ run_program::run("raidstop", $dev);
+ &write($raid, "/etc/raidtab");
+ run_program::run("mkraid", "--really-force", $dev);
+ run_program::run("raidstart", $dev);
+}
+
+sub format_part($$) {
+ my ($raid, $part) = @_;
+ make($raid->{raid}, $part) if is($part);
+ fs::format_part($part);
+}
+
+1;