]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
DDF: ddf_activate_spare: bugfix for 62ff3c40
authorMartin Wilck <mwilck@arcor.de>
Tue, 30 Jul 2013 21:18:25 +0000 (23:18 +0200)
committerNeilBrown <neilb@suse.de>
Wed, 31 Jul 2013 02:47:44 +0000 (12:47 +1000)
Move the check for good drives in the dl loop - otherwise dl
may be NULL and mdmon may crash.

Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
super-ddf.c

index 683f9697a53b2cf5d8e1802256bdc12d3748dad3..46262ceb1c46d0226bc42b354ea74046428619eb 100644 (file)
@@ -4774,13 +4774,6 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
        /* For each slot, if it is not working, find a spare */
        dl = ddf->dlist;
        for (i = 0; i < a->info.array.raid_disks; i++) {
-               be16 state = ddf->phys->entries[dl->pdnum].state;
-               if (be16_and(state,
-                            cpu_to_be16(DDF_Failed|DDF_Missing)) ||
-                   !be16_and(state,
-                             cpu_to_be16(DDF_Online)))
-                       continue;
-
                for (d = a->info.devs ; d ; d = d->next)
                        if (d->disk.raid_disk == i)
                                break;
@@ -4798,6 +4791,13 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
                        int is_dedicated = 0;
                        struct extent *ex;
                        unsigned int j;
+                       be16 state = ddf->phys->entries[dl->pdnum].state;
+                       if (be16_and(state,
+                                    cpu_to_be16(DDF_Failed|DDF_Missing)) ||
+                           !be16_and(state,
+                                     cpu_to_be16(DDF_Online)))
+                               continue;
+
                        /* If in this array, skip */
                        for (d2 = a->info.devs ; d2 ; d2 = d2->next)
                                if (d2->state_fd >= 0 &&