]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Flush mdmon before next reshape step during container operation
authorAdam Kwolek <adam.kwolek@intel.com>
Tue, 7 Feb 2012 14:03:43 +0000 (15:03 +0100)
committerNeilBrown <neilb@suse.de>
Thu, 9 Feb 2012 01:20:52 +0000 (12:20 +1100)
Using takeover operation for grow purposes, mdadm has to be sure
that mdmon processes all updates, and if necessary it will be closed
at takeover to raid0 operation. If mdmon is late, next array in container
is processed and due to race condition mdmon closes itself instead to monitor
next reshape operation.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
msg.c
msg.h

diff --git a/Grow.c b/Grow.c
index 36a1de734d820b7c0dd9ccf897e74b83a570b3f6..70bdee113f0b688c975003ad31aa0b720dd76e65 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2003,6 +2003,9 @@ static int reshape_array(char *container, int fd, char *devname,
 
                if (reshape.level > 0 && st->ss->external) {
                        /* make sure mdmon is aware of the new level */
+                       if (mdmon_running(st->container_dev))
+                               flush_mdmon(container);
+
                        if (!mdmon_running(st->container_dev))
                                start_mdmon(st->container_dev);
                        ping_monitor(container);
@@ -2396,8 +2399,7 @@ started:
                /* Re-load the metadata as much could have changed */
                int cfd = open_dev(st->container_dev);
                if (cfd >= 0) {
-                       ping_manager(container);
-                       ping_monitor(container);
+                       flush_mdmon(container);
                        st->ss->free_super(st);
                        st->ss->load_container(st, cfd, container);
                        close(cfd);
@@ -2594,6 +2596,9 @@ int reshape_container(char *container, char *devname,
 
                sysfs_init(content, fd, mdstat->devnum);
 
+               if (mdmon_running(devname2devnum(container)))
+                       flush_mdmon(container);
+
                rv = reshape_array(container, fd, adev, st,
                                   content, force, NULL,
                                   backup_file, quiet, 1, restart,
@@ -2608,6 +2613,9 @@ int reshape_container(char *container, char *devname,
                restart = 0;
                if (rv)
                        break;
+
+               if (mdmon_running(devname2devnum(container)))
+                       flush_mdmon(container);
        }
        if (!rv)
                unfreeze(st);
diff --git a/msg.c b/msg.c
index dc780b3ed4bf6fde03a0e660f89f7c99c1584031..44aad1f60f75a18860eef2d96fcb6c361a57341a 100644 (file)
--- a/msg.c
+++ b/msg.c
@@ -487,3 +487,13 @@ int ping_manager(char *devname)
        close(sfd);
        return err;
 }
+
+/* using takeover operation for grow purposes, mdadm has to be sure
+ * that mdmon processes all updates, and if necessary it will be closed
+ * at takeover to raid0 operation
+  */
+void flush_mdmon(char *container)
+{
+       ping_manager(container);
+       ping_monitor(container);
+}
diff --git a/msg.h b/msg.h
index c6d037d99a3a2f37614bde047b193483622c5d5a..eefa6495f1e290e404a0cb410a26f551b97eab74 100644 (file)
--- a/msg.h
+++ b/msg.h
@@ -34,5 +34,6 @@ extern int block_monitor(char *container, const int freeze);
 extern void unblock_monitor(char *container, const int unfreeze);
 extern int fping_monitor(int sock);
 extern int ping_manager(char *devname);
+extern void flush_mdmon(char *container);
 
 #define MSG_MAX_LEN (4*1024*1024)