diff options
-rw-r--r-- | Monitor.c | 2 | ||||
-rw-r--r-- | mdstat.c | 14 | ||||
-rw-r--r-- | monitor.c | 2 |
3 files changed, 14 insertions, 4 deletions
@@ -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); @@ -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; @@ -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; |