]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Monitor: don't Wait forever on a 'frozen' array.
authorNeilBrown <neilb@suse.de>
Mon, 6 Jul 2015 03:26:41 +0000 (13:26 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 6 Jul 2015 03:26:41 +0000 (13:26 +1000)
If Wait() finds the array resync is 'frozen', then wait
a little while to avoid races, but don't wait forever.

Signed-off-by: NeilBrown <neilb@suse.com>
Monitor.c

index a5300329b464b8108e2deec305cf1418a82ca5db..f19c2e58a5209728fc1af5447ec3dc5bacc63468 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -993,6 +993,7 @@ int Wait(char *dev)
        struct stat stb;
        char devnm[32];
        int rv = 1;
+       int frozen_remaining = 3;
 
        if (stat(dev, &stb) != 0) {
                pr_err("Cannot find %s: %s\n", dev,
@@ -1009,7 +1010,7 @@ int Wait(char *dev)
                        if (strcmp(e->devnm, devnm) == 0)
                                break;
 
-               if (e->percent == RESYNC_NONE) {
+               if (e && e->percent == RESYNC_NONE) {
                        /* We could be in the brief pause before something
                         * starts. /proc/mdstat doesn't show that, but
                         * sync_action does.
@@ -1019,8 +1020,15 @@ int Wait(char *dev)
                        sysfs_init(&mdi, -1, devnm);
                        if (sysfs_get_str(&mdi, NULL, "sync_action",
                                          buf, 20) > 0 &&
-                           strcmp(buf,"idle\n") != 0)
+                           strcmp(buf,"idle\n") != 0) {
                                e->percent = RESYNC_UNKNOWN;
+                               if (strcmp(buf, "frozen\n") == 0) {
+                                       if (frozen_remaining == 0)
+                                               e->percent = RESYNC_NONE;
+                                       else
+                                               frozen_remaining -= 1;
+                               }
+                       }
                }
                if (!e || e->percent == RESYNC_NONE) {
                        if (e && e->metadata_version &&