[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