summaryrefslogtreecommitdiffstats
path: root/managemon.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-10-01 18:50:43 -0700
committerDan Williams <dan.j.williams@intel.com>2008-10-15 14:15:52 -0700
commit695154b2e7f975527f8f3f9591f0a21474bfe1b1 (patch)
tree98a16315f08174369ce8038bc1948a68ae2e60a9 /managemon.c
parent1e4bc070a73716292c1681a86524f46f656f8acb (diff)
downloadmdadm-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.c16
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);