]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix a recently introduced bug, and make --assemble more resilient to it.
authorNeil Brown <neilb@suse.de>
Mon, 26 Jun 2006 02:26:12 +0000 (12:26 +1000)
committerNeil Brown <neilb@suse.de>
Mon, 26 Jun 2006 02:26:12 +0000 (12:26 +1000)
Make -assemble a bit more resilient to finding strange
 information in superblocks.
Don't claim newly added spares are InSync!! (don't know why that
 code was ever in there)

Assemble.c
ChangeLog
super0.c

index aa7eeb2b5010c17a70fe33383e06c15ed397b3c4..90a9c576ce2b3681a5b3c2de87c0bca6c24f237f 100644 (file)
@@ -499,6 +499,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
                        if (nextspare < info.array.raid_disks)
                                nextspare = info.array.raid_disks;
                        i = nextspare++;
+               } else {
+                       if (i >= info.array.raid_disks &&
+                           i >= nextspare)
+                               nextspare = i+1;
                }
                if (i < 10000) {
                        if (i >= bestcnt) {
index ecbb598b3a65fd316c12dbf180bc1548fbbe16ba..75e53bbbcfb91f4fe0e4f26a61f297a41b6dfdde 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,10 @@ Changes Prior to this release
        to make it a bit easier to see what is happening.
     -   Work around bug in --add handling for  version-1 superblocks
        in 2.6.17 (and prior).
+    -   Make -assemble a bit more resilient to finding strange
+       information in superblocks.
+    -   Don't claim newly added spares are InSync!! (don't know why that
+       code was ever in there)
 
 Changes Prior to 2.5.1 release
     -   Various fixes for gcc warnings
index 0f993a25ad5b62789000f9c1c938141c580915eb..da6671d26fb1eb4ef65e38deafcce49ed11dce35 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -350,6 +350,7 @@ static void getinfo_super0(struct mdinfo *info, void *sbv)
        /* work_disks is calculated rather than read directly */
        for (i=0; i < MD_SB_DISKS; i++)
                if ((sb->disks[i].state & (1<<MD_DISK_SYNC)) &&
+                   (sb->disks[i].raid_disk < info->array.raid_disks) &&
                    (sb->disks[i].state & (1<<MD_DISK_ACTIVE)) &&
                    !(sb->disks[i].state & (1<<MD_DISK_FAULTY)))
                        working ++;
@@ -647,7 +648,6 @@ static int write_init_super0(struct supertype *st, void *sbv, mdu_disk_info_t *d
        }
 
        sb->disks[dinfo->number].state &= ~(1<<MD_DISK_FAULTY);
-       sb->disks[dinfo->number].state |= (1<<MD_DISK_SYNC);
 
        sb->this_disk = sb->disks[dinfo->number];
        sb->sb_csum = calc_sb0_csum(sb);