tree b41bec77e5e5123f8f5349eb01ced9ee8fd9a924
parent 187a27845a9dc1c3da3995e24625ccf2e7a346aa
author NeilBrown <[EMAIL PROTECTED]> Sun, 17 Apr 2005 05:26:41 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Sun, 17 Apr 2005 05:26:41 -0700
[PATCH] md: close a small race in md thread deregistration
There is a tiny race when de-registering an MD thread, in that the thread
could disappear before it is set a SIGKILL, causing send_sig to have
problems.
This is most easily closed by holding tasklist_lock between enabling the
thread to exit (setting ->run to NULL) and telling it to exit.
(akpm: ick. Needs to use kthread API and stop using signals)
Signed-off-by: Neil Brown <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
md/md.c | 20 ++++++++------------
1 files changed, 8 insertions(+), 12 deletions(-)
Index: drivers/md/md.c
===================================================================
--- b4374b7af235c0d14bc722999cd1d8d3e2743c0d/drivers/md/md.c (mode:100644
sha1:aa72c88a024f7ef06f4c32263497a379c0bd7094)
+++ b41bec77e5e5123f8f5349eb01ced9ee8fd9a924/drivers/md/md.c (mode:100644
sha1:44a164965546c3a57d60c2a9d90d9dce2c4962c7)
@@ -2840,16 +2840,6 @@
return thread;
}
-static void md_interrupt_thread(mdk_thread_t *thread)
-{
- if (!thread->tsk) {
- MD_BUG();
- return;
- }
- dprintk("interrupting MD-thread pid %d\n", thread->tsk->pid);
- send_sig(SIGKILL, thread->tsk, 1);
-}
-
void md_unregister_thread(mdk_thread_t *thread)
{
struct completion event;
@@ -2857,9 +2847,15 @@
init_completion(&event);
thread->event = &event;
+
+ /* As soon as ->run is set to NULL, the task could disappear,
+ * so we need to hold tasklist_lock until we have sent the signal
+ */
+ dprintk("interrupting MD-thread pid %d\n", thread->tsk->pid);
+ read_lock(&tasklist_lock);
thread->run = NULL;
- thread->name = NULL;
- md_interrupt_thread(thread);
+ send_sig(SIGKILL, thread->tsk, 1);
+ read_unlock(&tasklist_lock);
wait_for_completion(&event);
kfree(thread);
}
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html