]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: use mdstat_wait to wait for delayed reshape.
authorNeilBrown <neilb@suse.de>
Wed, 10 Jul 2013 01:10:54 +0000 (11:10 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 10 Jul 2013 01:10:54 +0000 (11:10 +1000)
Having a fix time for a wait is clumsy and can make us
wait much too long.
So use mdstat_wait and keep the mdstat_fd open.
This requires an 'mdstat_close' so it doesn't stay open
forever.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
mdadm.h
mdstat.c

diff --git a/Grow.c b/Grow.c
index 7baa5f8af19e0d9f4757d3a431e99b525e5d8766..84f0a295ad844406f01aea6f36980e62fde5b52e 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -3228,7 +3228,7 @@ started:
        do {
                struct mdstat_ent *mds, *m;
                delayed = 0;
-               mds = mdstat_read(0, 0);
+               mds = mdstat_read(1, 0);
                for (m = mds; m; m = m->next)
                        if (strcmp(m->devnm, sra->sys_name) == 0) {
                                if (m->resync &&
@@ -3248,9 +3248,9 @@ started:
                        delayed = 0;
                }
                if (delayed)
-                       sleep(30 - (delayed-1) * 25);
+                       mdstat_wait(30 - (delayed-1) * 25);
        } while (delayed);
-
+       mdstat_close();
        close(fd);
        if (check_env("MDADM_GROW_VERIFY"))
                fd = open(devname, O_RDONLY | O_DIRECT);
diff --git a/mdadm.h b/mdadm.h
index fed3bc8ca015f75a8256d6e1611e530ec9580113..c1c0bb2ef2ec54e36ec9f43beccacd2d47206087 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -465,6 +465,7 @@ struct mdstat_ent {
 };
 
 extern struct mdstat_ent *mdstat_read(int hold, int start);
+extern void mdstat_close(void);
 extern void free_mdstat(struct mdstat_ent *ms);
 extern void mdstat_wait(int seconds);
 extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
index 9ebfc07500798c5812419488ac6ccc0c5bb6296d..8b16d3e89ec6b66c08b465b26d14f646f0ffc08b 100644 (file)
--- a/mdstat.c
+++ b/mdstat.c
@@ -289,6 +289,13 @@ struct mdstat_ent *mdstat_read(int hold, int start)
        return rv;
 }
 
+void mdstat_close(void)
+{
+       if (mdstat_fd >= 0)
+               close(mdstat_fd);
+       mdstat_fd = -1;
+}
+
 void mdstat_wait(int seconds)
 {
        fd_set fds;