summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-09-12 05:23:11 +0000
committerNeil Brown <neilb@suse.de>2005-09-12 05:23:11 +0000
commit308e1801baa05edbcfda6e8054fdf90727581c62 (patch)
tree5793bfc567206cc898a1fb9cf5812275038fffcc
parent265e0f17317e6d23864263c04ae581b35f946b5e (diff)
downloadmdadm-308e1801baa05edbcfda6e8054fdf90727581c62.tar.gz
mdadm-308e1801baa05edbcfda6e8054fdf90727581c62.tar.xz
mdadm-308e1801baa05edbcfda6e8054fdf90727581c62.zip
Fix assembling of array with spares when verion-1 superblock is used.
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>
-rw-r--r--Assemble.c6
-rw-r--r--ChangeLog3
-rw-r--r--Manage.c2
-rwxr-xr-xmakedist2
-rw-r--r--test9
-rw-r--r--tests/03r5assemV157
6 files changed, 51 insertions, 28 deletions
diff --git a/Assemble.c b/Assemble.c
index c522dab..ae06f57 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -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;
diff --git a/ChangeLog b/ChangeLog
index e5a543a..b67e2a9 100644
--- 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
diff --git a/Manage.c b/Manage.c
index 4cf40e1..67e7210 100644
--- 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 */
}
diff --git a/makedist b/makedist
index fe24794..8da4ab4 100755
--- 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 3ad0147..0a45d50 100644
--- 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;}
diff --git a/tests/03r5assemV1 b/tests/03r5assemV1
index 7c72ad6..7df277e 100644
--- a/tests/03r5assemV1
+++ b/tests/03r5assemV1
@@ -1,109 +1,116 @@
# 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