diff --git a/raid/create_raid.cgi b/raid/create_raid.cgi index 16f23d444..12617e5ea 100755 --- a/raid/create_raid.cgi +++ b/raid/create_raid.cgi @@ -79,16 +79,29 @@ elsif ($in{'group_mode'} == 2) { 'value' => $in{'newgroup'} }); } -&create_raid($raid); -&unlock_raid_files(); +if ($raid_mode eq "raidtools") { + # Create config before actually creating RAID. + &create_raid($raid); + } + if ($err = &make_raid($raid, $in{'force'}, $in{'missing'}, $in{'assume'})) { - &delete_raid($raid); + if ($raid_mode eq "raidtools") { + &delete_raid($raid); + } &error($err); } -elsif ($in{'level'} != 0) { - # Set RAID to read/write mode after creation except for RAID0 which is automatically set to read/write. - &readwrite_raid($raid); -} +elsif ($raid_mode eq "mdadm") { + # Create config after actually creating RAID to be able to get UUID. + $uuid = &get_uuid($raid); + &create_raid($raid, $uuid); + if ($in{'level'} != 0) { + # Set RAID to read/write mode after creation except for RAID0 which is automatically set to read/write. + &readwrite_raid($raid); + } + } + +&unlock_raid_files(); + &webmin_log("create", undef, $in{'device'}, \%in); &redirect(""); diff --git a/raid/lang/en b/raid/lang/en index ac5ab91b7..c0b4a5267 100644 --- a/raid/lang/en +++ b/raid/lang/en @@ -67,6 +67,7 @@ create_o3_layout=3 Offset Copies view_title=RAID Device view_header=RAID device options view_device=Device file +view_uuid=UUID view_level=RAID level view_status=Filesystem status view_errors=RAID errors diff --git a/raid/raid-lib.pl b/raid/raid-lib.pl index 24a34606c..08f48ca79 100755 --- a/raid/raid-lib.pl +++ b/raid/raid-lib.pl @@ -177,6 +177,11 @@ else { { 'name' => 'parity-algorithm', 'value' => $1 }); } + elsif (/^\s+UUID\s+:\s*(.*)/) { + push(@{$md->{'members'}}, + { 'name' => 'array-uuid', + 'value' => $1 }); + } } close(MDSTAT); local $lastdev; @@ -216,6 +221,19 @@ else { return \@get_raidtab_cache; } +# get_uuid(&raid) +# Get the UUID of an mdadm RAID after creation. +sub get_uuid +{ + open(MDSTAT, "mdadm --detail $_[0]->{'value'} |"); + while() { + if (/^\s+UUID\s+:\s*(.*)/) { + return $1; + } + } + close(MDSTAT); +} + # disk_errors(string) # Converts an mdstat errors string into an array of disk statuses sub disk_errors @@ -255,19 +273,10 @@ if ($raid_mode eq "raidtools") { &flush_file_lines(); } else { - # Add to /etc/mdadm.conf - local ($d, @devices); - foreach $d (&find("device", $_[0]->{'members'})) { - push(@devices, $d->{'value'}); - } + # Add to mdadm.conf local $sg = &find_value("spare-group", $_[0]->{'members'}); local $lref = &read_file_lines($config{'mdadm'}); - local $lvl = &find_value('raid-level', $_[0]->{'members'}); - $lvl = $lvl =~ /^\d+$/ ? "raid$lvl" : $lvl; - push(@$lref, "DEVICE ". - join(" ", map { &device_to_volid($_) } @devices)); - push(@$lref, "ARRAY $_[0]->{'value'} level=$lvl devices=". - join(",", @devices). + push(@$lref, "ARRAY $_[0]->{'value'} uuid=$_[1]". ($sg ? " spare-group=$sg" : "")); &flush_file_lines(); &update_initramfs(); diff --git a/raid/view_raid.cgi b/raid/view_raid.cgi index 469896c01..575a9e316 100755 --- a/raid/view_raid.cgi +++ b/raid/view_raid.cgi @@ -20,6 +20,10 @@ print &ui_table_start($text{'view_header'}, undef, 2); # Device name print &ui_table_row($text{'view_device'}, "$raid->{'value'}"); +# UUID +$uuid = &find_value('array-uuid', $raid->{'members'}); +print &ui_table_row($text{'view_uuid'}, $uuid); + # RAID level $lvl = &find_value('raid-level', $raid->{'members'}); print &ui_table_row($text{'view_level'},