[PATCH] md: fix hang in stop_sync_thread by setting THREAD_WAKEUP in md_wakeup_thread_directly

Jiasheng Jiang <[email protected]>
Newsgroups gmane.linux.raid,gmane.linux.kernel
Message-ID <[email protected]>
Analysis of md.c shows that the md_thread() loop relies on the
THREAD_WAKEUP bit being set to progress beyond wait_event(). However,
md_wakeup_thread_directly() currently only calls wake_up_process()
without setting this bit.

As a result, a thread woken by md_wakeup_thread_directly() will find the
wait condition remains False and immediately return to sleep without
executing its run() handler. In the case of stop_sync_thread(), this
causes the sync thread to ignore the interruption request, leading to
a permanent hang.

Fix this by ensuring the THREAD_WAKEUP bit is set before waking the
process in md_wakeup_thread_directly().

Signed-off-by: Jiasheng Jiang <[email protected]>
---
 drivers/md/md.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 6d73f6e196a9..8709e9fd7f39 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8512,8 +8512,10 @@ static void md_wakeup_thread_directly(struct md_thread __rcu **thread)
 
 	rcu_read_lock();
 	t = rcu_dereference(*thread);
-	if (t)
+	if (t) {
+		set_bit(THREAD_WAKEUP, &t->flags);
 		wake_up_process(t->tsk);
+	}
 	rcu_read_unlock();
 }
 
-- 
2.25.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.