No subject


Tue Apr 21 15:07:30 UTC 2009


probably always returns 'readable' to select, so we will need
to wait on POLLPRI to get the 'new data is available' signal.

When using select, this corresponds to an 'exception', so
adjust calls to select accordingly.
In one case we sometimes wait on a socket and sometime on
/proc/mounts, so we need to test which.

Signed-off-by: NeilBrown <neilb at suse.de>

---

 Monitor.c |    2 +-
 mdstat.c  |   14 ++++++++++++--
 monitor.c |    2 +-
 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;




More information about the pkg-mdadm-commits mailing list