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

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