diff options
author | Dan Williams <dan.j.williams@intel.com> | 2008-10-01 18:50:43 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2008-10-15 14:15:52 -0700 |
commit | 695154b2e7f975527f8f3f9591f0a21474bfe1b1 (patch) | |
tree | 98a16315f08174369ce8038bc1948a68ae2e60a9 /managemon.c | |
parent | 1e4bc070a73716292c1681a86524f46f656f8acb (diff) | |
download | mdadm-695154b2e7f975527f8f3f9591f0a21474bfe1b1.tar.gz mdadm-695154b2e7f975527f8f3f9591f0a21474bfe1b1.tar.xz mdadm-695154b2e7f975527f8f3f9591f0a21474bfe1b1.zip |
mdmon: periodically retry to create the socket
If initial socket creation fails, EROFS, set a periodic alarm to wake up
the manager and retry. Include a kernel patch that will wake us up if
the mount flags are changed.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'managemon.c')
-rw-r--r-- | managemon.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/managemon.c b/managemon.c index dc3ff7f..730334c 100644 --- a/managemon.c +++ b/managemon.c @@ -606,10 +606,13 @@ 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); + proc_fd = open("/proc/mounts", O_RDONLY); do { @@ -627,12 +630,14 @@ void do_manager(struct supertype *container) read_sock(container); - if (socket_hup_requested) { + if (container->sock < 0 || socket_hup_requested) { close(container->sock); container->sock = make_control_sock(container->devname); make_pidfile(container->devname, 0); socket_hup_requested = 0; } + if (container->sock < 0) + alarm(30); free_mdstat(mdstat); } @@ -642,9 +647,12 @@ void do_manager(struct supertype *container) manager_ready = 1; - if (update_queue == NULL) - mdstat_wait_fd(container->sock, &set); - else + if (update_queue == NULL) { + if (container->sock < 0) + mdstat_wait_fd(proc_fd, &set); + else + mdstat_wait_fd(container->sock, &set); + } else /* If an update is happening, just wait for signal */ pselect(0, NULL, NULL, NULL, NULL, &set); } while(1); |