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

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