]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: don't ever consider a 'spare' to be the 'most recent'.
authorNeilBrown <neilb@suse.de>
Mon, 2 Sep 2013 01:48:06 +0000 (11:48 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 2 Sep 2013 01:48:06 +0000 (11:48 +1000)
If all devices have the same event count and the first one is a spare,
then that spare will be the 'most_recent'.
However then other devices will think the 'most_recent' has failed
(for v0.90 metadata) and will be rejected from the array.

So never consider a 'spare' to be 'most recent'.

Reported-by: Andreas Baer <synthetic.gods@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c

index 32e05b0344e70a36fa1ea537ac8ddc8376e5595b..60a52b2bb56c441d06118d057c737a4672defde8 100644 (file)
@@ -564,7 +564,7 @@ static int load_devices(struct devs *devices, char *devmap,
 #ifndef MDASSEMBLE
        int bitmap_done = 0;
 #endif
-       int most_recent = 0;
+       int most_recent = -1;
        int bestcnt = 0;
        int *best = *bestp;
 
@@ -695,10 +695,12 @@ static int load_devices(struct devs *devices, char *devmap,
                devices[devcnt].i.disk.major = major(stb.st_rdev);
                devices[devcnt].i.disk.minor = minor(stb.st_rdev);
 
-               if (devices[devcnt].i.events
-                   > devices[most_recent].i.events &&
-                   devices[devcnt].i.disk.state == 6)
+               if (devices[devcnt].i.disk.state == 6) {
+                       if (most_recent < 0 ||
+                           devices[devcnt].i.events
+                           > devices[most_recent].i.events)
                                most_recent = devcnt;
+               }
 
                if (content->array.level == LEVEL_MULTIPATH)
                        /* with multipath, the raid_disk from the superblock is meaningless */
@@ -766,7 +768,8 @@ static int load_devices(struct devs *devices, char *devmap,
                }
                devcnt++;
        }
-       *most_recentp = most_recent;
+       if (most_recent >= 0)
+               *most_recentp = most_recent;
        *bestcntp = bestcnt;
        *bestp = best;
        return devcnt;