]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdmon: don't monitor /proc/mounts to decide when to create .pid file.
authorNeilBrown <neilb@suse.de>
Mon, 8 Feb 2010 03:12:46 +0000 (14:12 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 8 Feb 2010 06:26:18 +0000 (17:26 +1100)
Monitoring /proc/mounts and creating a .pid file as soon as /var/run
is writable is racy.  Most distros clean all non-directories from
/var/run early in boot and if mdmon races with this it could
lose the files as soon as they are created.

Instead require that "mdmon --takeover" be run after /var is writable.

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

index 2a73d4b050a2dc7afb6498fee43ff38e4fd0054e..e01d13b9445c1329722e03f762de9c03a4838b61 100644 (file)
@@ -677,14 +677,12 @@ void do_manager(struct supertype *container)
 {
        struct mdstat_ent *mdstat;
        sigset_t set;
-       int proc_fd;
 
        sigprocmask(SIG_UNBLOCK, NULL, &set);
        sigdelset(&set, SIGUSR1);
        sigdelset(&set, SIGHUP);
        sigdelset(&set, SIGALRM);
        sigdelset(&set, SIGTERM);
-       proc_fd = open("/proc/mounts", O_RDONLY);
 
        do {
 
@@ -711,10 +709,6 @@ void do_manager(struct supertype *container)
                                        char *dir = ALT_RUN;
                                        if (mkdir(dir, 0600) < 0 && errno != EEXIST)
                                                dir = NULL;
-                               } else {
-                                       if (proc_fd >= 0)
-                                               close(proc_fd);
-                                       proc_fd = -1;
                                }
                                if (dir && !sigterm &&
                                    (container->sock < 0 ||
@@ -742,7 +736,7 @@ void do_manager(struct supertype *container)
                        wakeup_monitor();
 
                if (update_queue == NULL)
-                       mdstat_wait_fd(container->sock, proc_fd, &set);
+                       mdstat_wait_fd(container->sock, &set);
                else
                        /* If an update is happening, just wait for signal */
                        pselect(0, NULL, NULL, NULL, NULL, &set);
diff --git a/mdadm.h b/mdadm.h
index f65a4622936dea1c3b9bdc48e9e126317ddc6368..a7d8b797530c097b95ea38a6eb489c9ff6aae59d 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -341,7 +341,7 @@ struct mdstat_ent {
 extern struct mdstat_ent *mdstat_read(int hold, int start);
 extern void free_mdstat(struct mdstat_ent *ms);
 extern void mdstat_wait(int seconds);
-extern void mdstat_wait_fd(int fd, int fd2, const sigset_t *sigmask);
+extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
 extern int mddev_busy(int devnum);
 
 struct map_ent {
index 4b3f6fec4ed0a56fb316515ea21a23a5bd78a2c2..4a9f370060f36839792dfcd708bf3a23fed72c49 100644 (file)
--- a/mdstat.c
+++ b/mdstat.c
@@ -266,7 +266,7 @@ void mdstat_wait(int seconds)
        select(maxfd + 1, NULL, NULL, &fds, &tm);
 }
 
-void mdstat_wait_fd(int fd, int fd2, const sigset_t *sigmask)
+void mdstat_wait_fd(int fd, const sigset_t *sigmask)
 {
        fd_set fds, rfds;
        int maxfd = 0;
@@ -276,10 +276,7 @@ void mdstat_wait_fd(int fd, int fd2, const sigset_t *sigmask)
        if (mdstat_fd >= 0)
                FD_SET(mdstat_fd, &fds);
 
-       if (fd < 0)
-               fd = fd2, fd2 = -1;
-
-       while (fd >= 0) {
+       if (fd >= 0) {
                struct stat stb;
                fstat(fd, &stb);
                if ((stb.st_mode & S_IFMT) == S_IFREG)
@@ -294,8 +291,6 @@ void mdstat_wait_fd(int fd, int fd2, const sigset_t *sigmask)
                if (fd > maxfd)
                        maxfd = fd;
 
-               fd = fd2;
-               fd2 = -1;
        }
        if (mdstat_fd > maxfd)
                maxfd = mdstat_fd;