From 93c694645054e2a48fd522d4a7afa63d3819f482 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 16 Apr 2005 15:26:41 -0700 Subject: [PATCH] --- yaml --- r: 198 b: refs/heads/master c: d28446fe2d87ea344c14741c39962dcc7aee5c78 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 20 ++++++++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 8dcac0a6542d..2c90e8bb858c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 187a27845a9dc1c3da3995e24625ccf2e7a346aa +refs/heads/master: d28446fe2d87ea344c14741c39962dcc7aee5c78 diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index aa72c88a024f..44a164965546 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -2840,16 +2840,6 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev, 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 @@ void md_unregister_thread(mdk_thread_t *thread) 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); }