]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
monitor: don't unblock a device that isn't blocked.
authorNeilBrown <neilb@suse.de>
Tue, 6 Dec 2011 21:39:39 +0000 (08:39 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 6 Dec 2011 21:39:39 +0000 (08:39 +1100)
When we see a failed device, we both unblock and remove it (after
updating the metadata).
However it might not be blocked as there can be a delay between
unblocking and the device being free to be removed.

If this happens the clearing of 'blocked' succeeds so md sends a sysfs
notification and mdmon checks again and tries to clear 'blocked'
again.
Thus it enters a busy-loop until the 'remove' succeeds.

To avoid this, only try to unblock if the device was blocked.

Signed-off-by: NeilBrown <neilb@suse.de>
monitor.c

index b002e90f757b025470cfb0491d22ee25517d54b2..29bde18a5eacfee892ecec9bba700e9b62d35f8e 100644 (file)
--- a/monitor.c
+++ b/monitor.c
@@ -339,7 +339,8 @@ static int read_and_act(struct active_array *a)
                        a->container->ss->set_disk(a, mdi->disk.raid_disk,
                                                   mdi->curr_state);
                        check_degraded = 1;
-                       mdi->next_state |= DS_UNBLOCK;
+                       if (mdi->curr_state & DS_BLOCKED)
+                               mdi->next_state |= DS_UNBLOCK;
                        if (a->curr_state == read_auto) {
                                a->container->ss->set_array_state(a, 0);
                                a->next_state = active;