summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Monitor.c2
-rw-r--r--mdstat.c14
-rw-r--r--monitor.c2
3 files changed, 14 insertions, 4 deletions
diff --git a/Monitor.c b/Monitor.c
index af53129..2677f7b 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -706,7 +706,7 @@ int WaitClean(char *dev, int verbose)
if (sysfs_match_word(buf, clean_states) <= 4)
break;
FD_SET(state_fd, &fds);
- rv = select(state_fd + 1, &fds, NULL, NULL, &tm);
+ rv = select(state_fd + 1, NULL, NULL, &fds, &tm);
if (rv < 0 && errno != EINTR)
break;
lseek(state_fd, 0, SEEK_SET);
diff --git a/mdstat.c b/mdstat.c
index ebdfc67..8de51cf 100644
--- a/mdstat.c
+++ b/mdstat.c
@@ -280,8 +280,18 @@ void mdstat_wait_fd(int fd, const sigset_t *sigmask)
FD_ZERO(&rfds);
if (mdstat_fd >= 0)
FD_SET(mdstat_fd, &fds);
- if (fd >= 0)
- FD_SET(fd, &rfds);
+ if (fd >= 0) {
+ struct stat stb;
+ fstat(fd, &stb);
+ if ((stb.st_mode & S_IFMT) == S_IFREG)
+ /* Must be a /proc or /sys fd, so expect
+ * POLLPRI
+ * i.e. an 'exceptional' event.
+ */
+ FD_SET(fd, &fds);
+ else
+ FD_SET(fd, &rfds);
+ }
if (mdstat_fd > maxfd)
maxfd = mdstat_fd;
diff --git a/monitor.c b/monitor.c
index 3388d31..66fea80 100644
--- a/monitor.c
+++ b/monitor.c
@@ -498,7 +498,7 @@ static int wait_and_act(struct supertype *container, int nowait)
sigprocmask(SIG_UNBLOCK, NULL, &set);
sigdelset(&set, SIGUSR1);
monitor_loop_cnt |= 1;
- rv = pselect(maxfd+1, &rfds, NULL, NULL, NULL, &set);
+ rv = pselect(maxfd+1, NULL, NULL, &rfds, NULL, &set);
monitor_loop_cnt += 1;
if (rv == -1 && errno == EINTR)
rv = 0;