diff --git a/modules/cas_cache/threads.c b/modules/cas_cache/threads.c index 3ffcd42..8c610c2 100644 --- a/modules/cas_cache/threads.c +++ b/modules/cas_cache/threads.c @@ -52,8 +52,10 @@ static int _cas_io_queue_thread(void *data) /* If we get here, then thread was signalled to terminate. * So, let's free memory and exit. */ + wait_for_completion(&info->compl); printk(KERN_DEBUG "Thread %s stopped\n", info->name); kfree(info); + do_exit(0); return 0; } @@ -112,7 +114,9 @@ static int _cas_cleaner_thread(void *data) } } while (true); - complete_and_exit(&info->compl, 0); + wait_for_completion(&info->compl); + kfree(info); + do_exit(0); return 0; } @@ -144,7 +148,9 @@ static int _cas_metadata_updater_thread(void *data) atomic_read(&info->kicked)); } while (true); - complete_and_exit(&info->compl, 0); + wait_for_completion(&info->compl); + kfree(info); + do_exit(0); return 0; } @@ -202,8 +208,10 @@ static void _cas_start_thread(struct cas_thread_info *info) static void _cas_stop_thread(struct cas_thread_info *info) { if (info->running && info->thread) { + reinit_completion(&info->compl); atomic_set(&info->stop, 1); wake_up(&info->wq); + complete(&info->compl); } }