diff --git a/raid/CHANGELOG b/raid/CHANGELOG
index f938ee982..06b860a83 100644
--- a/raid/CHANGELOG
+++ b/raid/CHANGELOG
@@ -15,3 +15,5 @@ Added a section for configuring RAID problem notification when using MDADM.
Converted all pages to use the new Webmin UI library, for a more consistent look.
Added a confirmation page before deleting a RAID array.
Create /dev/md* device file if missing when creating a RAID set.
+---- Changes since 1.450 ----
+Added a button for changing the number of active devices in a RAID 5 or 6 set, thanks to Diego Zuccato.
diff --git a/raid/lang/en b/raid/lang/en
index 039febc1c..d4eb9578c 100644
--- a/raid/lang/en
+++ b/raid/lang/en
@@ -84,6 +84,8 @@ view_delete=Delete RAID array
view_deletedesc=Click this button to totally remove this RAID device. Any data that it contains will almost certainly be lost!
view_remove=Remove partition:
view_removedesc=Select a partition that is part of the RAID device and click this button to remove it. This may cause data to be lost!
+view_grow=Grow RAID:
+view_growdesc=Grow array (convert hot spares to active members)
view_state=RAID status
view_rebuild=Rebuilding progress
view_newmount=Mount RAID on:
@@ -107,6 +109,7 @@ eforce=You must force the initialisation of this RAID : $1
emdadmstop=mdadm in --stop mode failed : $1
emdadmcreate=mdadm in --create mode failed : $1
emdadmadd=mdadm in --manage --add mode failed : $1
+emdadmgrow=mdadm in --grow mode failed : $1
emdadmremove=mdadm in --manage --remove mode failed : $1
emdadmfail=mdadm in --manage --fail mode failed : $1
diff --git a/raid/raid-lib.pl b/raid/raid-lib.pl
index 46f635eb5..75071a5a5 100644
--- a/raid/raid-lib.pl
+++ b/raid/raid-lib.pl
@@ -382,6 +382,19 @@ if ($raid_mode eq "mdadm") {
}
}
+# grow(&raid, totaldisks)
+# Grows a RAID set to contain totaldisks active partitions
+sub grow
+{
+if ($raid_mode eq "mdadm") {
+ # Call mdadm command to add
+ $cmd="mdadm --grow $_[0]->{'value'} -n $_[1] 2>&1";
+ local $out = &backquote_logged(
+ $cmd);
+ &error(&text('emdadmgrow', "'$cmd' -> $out")) if ($?);
+ }
+}
+
# remove_partition(&raid, device)
# Removes a device from some RAID set, both in the config file and for real
sub remove_partition
diff --git a/raid/save_raid.cgi b/raid/save_raid.cgi
index ead0b78da..11474f4ac 100755
--- a/raid/save_raid.cgi
+++ b/raid/save_raid.cgi
@@ -71,6 +71,14 @@ elsif ($in{'add'}) {
&webmin_log("add", undef, $old->{'value'}, { 'disk' => $in{'disk'} } );
&redirect("");
}
+elsif ($in{'grow'}) {
+ # Grow the array
+ &lock_raid_files();
+ &grow($old, $in{'ndisk'});
+ &unlock_raid_files();
+ &webmin_log("grow", undef, $old->{'value'}, { 'disk' => $in{'ndisk'} } );
+ &redirect("");
+ }
elsif ($in{'remove'}) {
# Remove a disk from a RAID set
&lock_raid_files();
diff --git a/raid/view_raid.cgi b/raid/view_raid.cgi
index 9221753c2..389c2b432 100755
--- a/raid/view_raid.cgi
+++ b/raid/view_raid.cgi
@@ -87,7 +87,8 @@ if ($raid->{'rebuild'}) {
# Display partitions in RAID
$rp = undef;
-foreach $d (&find('device', $raid->{'members'})) {
+@devs = &find('device', $raid->{'members'});
+foreach $d (@devs) {
if (&find('raid-disk', $d->{'members'}) ||
&find('parity-disk', $d->{'members'})) {
local $name = &mount::device_name($d->{'value'});
@@ -104,11 +105,17 @@ print &ui_table_row($text{'view_disks'}, $rp);
# Display spare partitions
$sp = undef;
-foreach $d (&find('device', $raid->{'members'})) {
+$sparescnt = 0;
+$newdisks = @rdisks;
+@spares = ( );
+foreach $d (@devs) {
if (&find('spare-disk', $d->{'members'})) {
local $name = &mount::device_name($d->{'value'});
$sp .= "$name
\n";
push(@rdisks, [ $d->{'value'}, $name ]);
+ $sparescnt++;
+ $newdisks++;
+ push(@spares, [ "$newdisks", "+ $sparescnt" ]);
}
}
if ($sp) {
@@ -139,6 +146,11 @@ if ($raid_mode eq "mdadm") {
&ui_select("rdisk", undef, \@rdisks),
$text{'view_removedesc'});
}
+ if ($sparescnt>0) {
+ push(@grid, &ui_submit($text{'view_grow'}, "grow")." ".
+ &ui_select("ndisk", undef, \@spares),
+ $text{'view_growdesc'});
+ }
}
if ($raid->{'active'} && !$st[2]) {