]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix assembling of array with spares when verion-1 superblock is used.
authorNeil Brown <neilb@suse.de>
Mon, 12 Sep 2005 05:23:11 +0000 (05:23 +0000)
committerNeil Brown <neilb@suse.de>
Mon, 12 Sep 2005 05:23:11 +0000 (05:23 +0000)
As spared don't have a position in the raid array with verion-1 superblocks,
we need to handle them a bit differently.

Signed-off-by: Neil Brown <neilb@suse.de>
Assemble.c
ChangeLog
Manage.c
makedist
test
tests/03r5assemV1

index c522dab3c2efffa5553d14f3ea401a02199ff880..ae06f57217cd427d0447a514a28c39a16eca9281 100644 (file)
@@ -119,6 +119,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
        struct mdinfo info;
        struct mddev_ident_s ident2;
        char *avail;
+       int nextspare = 0;
        
        vers = md_get_version(mdfd);
        if (vers <= 0) {
@@ -320,6 +321,11 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
                        i = devcnt;
                else
                        i = devices[devcnt].raid_disk;
+               if (i+1 == 0) {
+                       if (nextspare < info.array.raid_disks)
+                               nextspare = info.array.raid_disks;
+                       i = nextspare++;
+               }
                if (i < 10000) {
                        if (i >= bestcnt) {
                                unsigned int newbestcnt = i+10;
index e5a543abf08032aae65a78fd6e01b1dd3889c1bd..b67e2a91c6c1962f430d2d598480006c03c88544 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,9 @@ Changes Prior to this release
          depending on which devices are present, and so will correctly
          handle "--assemble --force"  if multiple devices have failed.
     -   Report raid10 layout in --examine output.
+    -   Fix assembling of arrays that use the version-1 superblock and
+         have spares.  Previously the spares would be ignored.
+    -   Fix bug so that multiple drives can be re-added at once.
 
 Changes Prior to 2.0
     -   Support assembling from byte-swapped superblocks
index 4cf40e10d04ae56cc697339d275f28e24baab115..67e72107f4b97c1e2aacc114a75587e3ec957918 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -288,7 +288,7 @@ int Manage_subdevs(char *devname, int fd,
                                                if (ioctl(fd, ADD_NEW_DISK, &disc) == 0) {
                                                        if (verbose >= 0)
                                                                fprintf(stderr, Name ": re-added %s\n", dv->devname);
-                                                       return 0;
+                                                       continue;
                                                }
                                                /* fall back on normal-add */
                                        }
index fe24794082b1e7536c74a6fb4b04249b0895669b..8da4ab4cad77f209715c595c659e3193d7ec85a9 100755 (executable)
--- a/makedist
+++ b/makedist
@@ -61,7 +61,7 @@ else
     echo $target/$base does not exist.
     exit 1
   fi
-  ( cd .. ; ln -s mdadm mdadm-$version ; tar chf - --exclude="TAGS" --exclude='*,v' --exclude='*~' --exclude='*.o' --exclude mdadm --exclude=mdadm'.[^ch0-9]' --exclude=RCS mdadm-$version ; rm mdadm-$version ) | gzip --best > /var/tmp/mdadm-new.tgz
+  ( cd .. ; ln -s mdadm.v2 mdadm-$version ; tar chf - --exclude="TAGS" --exclude='*,v' --exclude='*~' --exclude='*.o' --exclude mdadm --exclude=mdadm'.[^ch0-9]' --exclude=RCS mdadm-$version ; rm mdadm-$version ) | gzip --best > /var/tmp/mdadm-new.tgz
   mkdir /var/tmp/mdadm-old ; zcat $target/$base | ( cd /var/tmp/mdadm-old ; tar xf - )
   mkdir /var/tmp/mdadm-new ; zcat /var/tmp/mdadm-new.tgz | ( cd /var/tmp/mdadm-new ; tar xf - )
   diff -ru /var/tmp/mdadm-old /var/tmp/mdadm-new 
diff --git a/test b/test
index 3ad0147ebfe6415e4f9d44c0fe6d0155cfc7b9da..0a45d502982ed72afcb57ee6a2fe657d14019a70 100644 (file)
--- a/test
+++ b/test
@@ -60,12 +60,19 @@ path1=$dev7
 
 # mdadm always adds --quiet, and we want to see any unexpected messages
 mdadm() {
-    $mdadm 2>&1 --quiet "$@"
+    $mdadm --quiet "$@"
 }
 
 # check various things
 check() {
    case $1 in
+    spares )
+       spares=`tr '] ' '\012\012' < /proc/mdstat | grep -c '(S)' || exit 0`
+       if [ $spares -ne $2 ]
+       then
+          echo >&2 "ERROR expected $2 spares, found $spares"; exit 1;
+       fi
+      ;;
     raid* | linear )
       grep -s "active $1 " /proc/mdstat > /dev/null || {
                echo >&2 "ERROR active $1 not found" ; cat /proc/mdstat ; exit 1;}
index 7c72ad63543d13bdc2d68eb9d5f94f27aa1e06da..7df277eca78270a046ad101d5d58fc48154b1b1e 100644 (file)
 
 # create a v-1 raid5 array and assemble in various ways
 
-mdadm -CR -e1 --name one $md1 -l5 -n3 $dev0 $dev1 $dev2 
+mdadm -CR -e1 --name one $md1 -l5 -n3 -x2 $dev0 $dev1 $dev2 $dev3 $dev4
 tst="check raid5 ;testdev $md1 2 $mdsize1 64 ; mdadm -S $md1"
 uuid=`mdadm -Db $md1 | sed 's/.*UUID=//'`
 check wait
 
 eval $tst
 
-mdadm -A $md1 $dev0 $dev1 $dev2 
+mdadm -A $md1 $dev0 $dev1 $dev2
+mdadm $md1 --add $dev3 $dev4
+check spares 2
 eval $tst
 
-mdadm -A $md1 -u $uuid $devlist 
+mdadm -A $md1 -u $uuid $devlist
+check spares 2
 eval $tst
 
-mdadm -A $md1 --name one $devlist  
+mdadm -A $md1 --name one $devlist
+check spares 2
 eval $tst
 
 
 conf=$targetdir/mdadm.conf
-{ 
+{
   echo DEVICE $devlist
   echo array $md1 UUID=$uuid
 } > $conf
 
-mdadm -As -c $conf $md1 
+mdadm -As -c $conf $md1
 eval $tst
 
-{ 
+{
   echo DEVICE $devlist
   echo array $md1 name=one
 } > $conf
 
-mdadm -As -c $conf  
+mdadm -As -c $conf
 eval $tst
 
-{ 
+{
   echo DEVICE $devlist
-  echo array $md1 devices=$dev0,$dev1,$dev2
+  echo array $md1 devices=$dev0,$dev1,$dev2,$dev3,$dev4
 } > $conf
 
-mdadm -As -c $conf 
+mdadm -As -c $conf
 
 echo "DEVICE $devlist" > $conf
 mdadm -Db $md1 >> $conf
 eval $tst
 
-mdadm --assemble --scan --config=$conf $md1 
+mdadm --assemble --scan --config=$conf $md1
 eval $tst
+echo PING >&2
 
-echo "  metadata=1.0 devices=$dev0,$dev1,$dev2" >> $conf
-mdadm --assemble --scan --config=$conf $md1 
+echo "  metadata=1.0 devices=$dev0,$dev1,$dev2,$dev3,$dev4" >> $conf
+mdadm --assemble --scan --config=$conf $md1
 eval $tst
 
 ### Now with a missing device
 
-mdadm -AR $md1 $dev0 $dev2 
+mdadm -AR $md1 $dev0 $dev2 $dev3 $dev4 #
 check state U_U
+check spares 1
 eval $tst
 
-mdadm -A $md1 -u $uuid $devlist 
+mdadm -A $md1 -u $uuid $devlist
 check state U_U
 eval $tst
 
-mdadm -A $md1 --name=one $devlist  
+mdadm -A $md1 --name=one $devlist
 check state U_U
+check spares 1
 eval $tst
 
 
 conf=$targetdir/mdadm.conf
-{ 
+{
   echo DEVICE $devlist
   echo array $md1 UUID=$uuid
 } > $conf
 
-mdadm -As -c $conf $md1 
+mdadm -As -c $conf $md1
 check state U_U
 eval $tst
 
-{ 
+{
   echo DEVICE $devlist
   echo array $md1 name=one
 } > $conf
 
-mdadm -As -c $conf  
+mdadm -As -c $conf
 check state U_U
 eval $tst
 
-{ 
+{
   echo DEVICE $devlist
   echo array $md1 devices=$dev0,$dev1,$dev2
 } > $conf
 
-mdadm -As -c $conf 
+mdadm -As -c $conf
 
 echo "DEVICE $devlist" > $conf
 mdadm -Db $md1 >> $conf
 check state U_U
 eval $tst
 
-mdadm --assemble --scan --config=$conf $md1 
+mdadm --assemble --scan --config=$conf $md1
 check state U_U
 eval $tst
 
 echo "  metadata=1.0 devices=$dev0,$dev1,$dev2" >> $conf
-mdadm --assemble --scan --config=$conf $md1 
+mdadm --assemble --scan --config=$conf $md1
 check state U_U
 eval $tst