Blame SOURCES/0092-Monitor-refresh-mdstat-fd-after-select.patch

e95a18
From e2308733910a157b0a4d4e78721f239d44b91a24 Mon Sep 17 00:00:00 2001
e95a18
From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
e95a18
Date: Wed, 9 Sep 2020 10:31:17 +0200
e95a18
Subject: [PATCH 092/108] Monitor: refresh mdstat fd after select
e95a18
e95a18
After 52209d6ee118 ("Monitor: release /proc/mdstat fd when no arrays
e95a18
present") mdstat fd is closed if mdstat is empty or cannot be opened.
e95a18
It causes that monitor is not able to select on mdstat. Select
e95a18
doesn't fail because it gets valid descriptor to a different resource.
e95a18
As a result any new event will be unnoticed until timeout (delay).
e95a18
e95a18
Refresh mdstat after wake up, don't poll on wrong resource.
e95a18
e95a18
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
e95a18
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
e95a18
---
e95a18
 Monitor.c | 6 +++---
e95a18
 mdstat.c  | 4 ++--
e95a18
 2 files changed, 5 insertions(+), 5 deletions(-)
e95a18
e95a18
diff --git a/Monitor.c b/Monitor.c
e95a18
index 2d6b3b9..80a3200 100644
e95a18
--- a/Monitor.c
e95a18
+++ b/Monitor.c
e95a18
@@ -216,8 +216,6 @@ int Monitor(struct mddev_dev *devlist,
e95a18
 		if (mdstat)
e95a18
 			free_mdstat(mdstat);
e95a18
 		mdstat = mdstat_read(oneshot ? 0 : 1, 0);
e95a18
-		if (!mdstat)
e95a18
-			mdstat_close();
e95a18
 
e95a18
 		for (st = statelist; st; st = st->next)
e95a18
 			if (check_array(st, mdstat, c->test, &info,
e95a18
@@ -238,8 +236,10 @@ int Monitor(struct mddev_dev *devlist,
e95a18
 		if (!new_found) {
e95a18
 			if (oneshot)
e95a18
 				break;
e95a18
-			else
e95a18
+			else {
e95a18
 				mdstat_wait(c->delay);
e95a18
+				mdstat_close();
e95a18
+			}
e95a18
 		}
e95a18
 		c->test = 0;
e95a18
 
e95a18
diff --git a/mdstat.c b/mdstat.c
e95a18
index 20577a3..48559e6 100644
e95a18
--- a/mdstat.c
e95a18
+++ b/mdstat.c
e95a18
@@ -135,7 +135,6 @@ struct mdstat_ent *mdstat_read(int hold, int start)
e95a18
 	if (hold && mdstat_fd != -1) {
e95a18
 		off_t offset = lseek(mdstat_fd, 0L, 0);
e95a18
 		if (offset == (off_t)-1) {
e95a18
-			mdstat_close();
e95a18
 			return NULL;
e95a18
 		}
e95a18
 		fd = dup(mdstat_fd);
e95a18
@@ -312,7 +311,8 @@ void mdstat_wait(int seconds)
e95a18
 	if (mdstat_fd >= 0) {
e95a18
 		FD_SET(mdstat_fd, &fds);
e95a18
 		maxfd = mdstat_fd;
e95a18
-	}
e95a18
+	} else
e95a18
+		return;
e95a18
 	tm.tv_sec = seconds;
e95a18
 	tm.tv_usec = 0;
e95a18
 	select(maxfd + 1, NULL, NULL, &fds, &tm;;
e95a18
-- 
e95a18
2.7.5
e95a18