]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdmon: simplify try_kill_monitor
authorNeilBrown <neilb@suse.de>
Fri, 29 Jan 2010 00:33:01 +0000 (11:33 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 4 Feb 2010 01:04:16 +0000 (12:04 +1100)
After we SIGTERM the monitor we need to wait for it to finish up.
Rather than the complexity of waiting for every md array to be clean,
we can simply read from the sock connected to the monitor.
When the monitor dies, we will get EOF.  Before then we will block.

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

diff --git a/mdmon.c b/mdmon.c
index b2f35c2f5f399f28ba1797ee0e6fa35e887b1b21..c66b06bf4aaefbc32f69ba5a3d8241c0e7d03c93 100644 (file)
--- a/mdmon.c
+++ b/mdmon.c
@@ -179,8 +179,8 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock)
 {
        char buf[100];
        int fd;
-       struct mdstat_ent *mdstat;
        int n;
+       long fl;
 
        /* first rule of survival... don't off yourself */
        if (pid == getpid())
@@ -201,13 +201,12 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock)
 
        kill(pid, SIGTERM);
 
-       mdstat = mdstat_read(0, 0);
-       for ( ; mdstat; mdstat = mdstat->next)
-               if (is_container_member(mdstat, devname)) {
-                       sprintf(buf, "/dev/%s", mdstat->dev);
-                       WaitClean(buf, sock, 0);
-               }
-       free_mdstat(mdstat);
+       /* Wait for monitor to exit by reading from the socket, after
+        * clearing the non-blocking flag */
+       fl = fcntl(sock, F_GETFL, 0);
+       fl &= ~O_NONBLOCK;
+       fcntl(sock, F_SETFL, fl);
+       read(sock, buf, 100);
 }
 
 void remove_pidfile(char *devname)