JFS: Use the kthread_ API
Use the kthread_ API instead of opencoding lots of hairy code for kernel thread creation and teardown. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
This commit is contained in:

committed by
Dave Kleikamp

parent
4837c672fd
commit
91dbb4deb3
@@ -25,6 +25,7 @@
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/posix_acl.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/seq_file.h>
|
||||
@@ -54,11 +55,9 @@ static int commit_threads = 0;
|
||||
module_param(commit_threads, int, 0);
|
||||
MODULE_PARM_DESC(commit_threads, "Number of commit threads");
|
||||
|
||||
int jfs_stop_threads;
|
||||
static pid_t jfsIOthread;
|
||||
static pid_t jfsCommitThread[MAX_COMMIT_THREADS];
|
||||
static pid_t jfsSyncThread;
|
||||
DECLARE_COMPLETION(jfsIOwait);
|
||||
static struct task_struct *jfsCommitThread[MAX_COMMIT_THREADS];
|
||||
struct task_struct *jfsIOthread;
|
||||
struct task_struct *jfsSyncThread;
|
||||
|
||||
#ifdef CONFIG_JFS_DEBUG
|
||||
int jfsloglevel = JFS_LOGLEVEL_WARN;
|
||||
@@ -661,12 +660,12 @@ static int __init init_jfs_fs(void)
|
||||
/*
|
||||
* I/O completion thread (endio)
|
||||
*/
|
||||
jfsIOthread = kernel_thread(jfsIOWait, NULL, CLONE_KERNEL);
|
||||
if (jfsIOthread < 0) {
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d", jfsIOthread);
|
||||
jfsIOthread = kthread_run(jfsIOWait, NULL, "jfsIO");
|
||||
if (IS_ERR(jfsIOthread)) {
|
||||
rc = PTR_ERR(jfsIOthread);
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
|
||||
goto end_txmngr;
|
||||
}
|
||||
wait_for_completion(&jfsIOwait); /* Wait until thread starts */
|
||||
|
||||
if (commit_threads < 1)
|
||||
commit_threads = num_online_cpus();
|
||||
@@ -674,24 +673,21 @@ static int __init init_jfs_fs(void)
|
||||
commit_threads = MAX_COMMIT_THREADS;
|
||||
|
||||
for (i = 0; i < commit_threads; i++) {
|
||||
jfsCommitThread[i] = kernel_thread(jfs_lazycommit, NULL,
|
||||
CLONE_KERNEL);
|
||||
if (jfsCommitThread[i] < 0) {
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d",
|
||||
jfsCommitThread[i]);
|
||||
jfsCommitThread[i] = kthread_run(jfs_lazycommit, NULL, "jfsCommit");
|
||||
if (IS_ERR(jfsCommitThread[i])) {
|
||||
rc = PTR_ERR(jfsCommitThread[i]);
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
|
||||
commit_threads = i;
|
||||
goto kill_committask;
|
||||
}
|
||||
/* Wait until thread starts */
|
||||
wait_for_completion(&jfsIOwait);
|
||||
}
|
||||
|
||||
jfsSyncThread = kernel_thread(jfs_sync, NULL, CLONE_KERNEL);
|
||||
if (jfsSyncThread < 0) {
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d", jfsSyncThread);
|
||||
jfsSyncThread = kthread_run(jfs_sync, NULL, "jfsSync");
|
||||
if (IS_ERR(jfsSyncThread)) {
|
||||
rc = PTR_ERR(jfsSyncThread);
|
||||
jfs_err("init_jfs_fs: fork failed w/rc = %d", rc);
|
||||
goto kill_committask;
|
||||
}
|
||||
wait_for_completion(&jfsIOwait); /* Wait until thread starts */
|
||||
|
||||
#ifdef PROC_FS_JFS
|
||||
jfs_proc_init();
|
||||
@@ -700,13 +696,9 @@ static int __init init_jfs_fs(void)
|
||||
return register_filesystem(&jfs_fs_type);
|
||||
|
||||
kill_committask:
|
||||
jfs_stop_threads = 1;
|
||||
wake_up_all(&jfs_commit_thread_wait);
|
||||
for (i = 0; i < commit_threads; i++)
|
||||
wait_for_completion(&jfsIOwait);
|
||||
|
||||
wake_up(&jfs_IO_thread_wait);
|
||||
wait_for_completion(&jfsIOwait); /* Wait for thread exit */
|
||||
kthread_stop(jfsCommitThread[i]);
|
||||
kthread_stop(jfsIOthread);
|
||||
end_txmngr:
|
||||
txExit();
|
||||
free_metapage:
|
||||
@@ -722,16 +714,13 @@ static void __exit exit_jfs_fs(void)
|
||||
|
||||
jfs_info("exit_jfs_fs called");
|
||||
|
||||
jfs_stop_threads = 1;
|
||||
txExit();
|
||||
metapage_exit();
|
||||
wake_up(&jfs_IO_thread_wait);
|
||||
wait_for_completion(&jfsIOwait); /* Wait until IO thread exits */
|
||||
wake_up_all(&jfs_commit_thread_wait);
|
||||
|
||||
kthread_stop(jfsIOthread);
|
||||
for (i = 0; i < commit_threads; i++)
|
||||
wait_for_completion(&jfsIOwait);
|
||||
wake_up(&jfs_sync_thread_wait);
|
||||
wait_for_completion(&jfsIOwait); /* Wait until Sync thread exits */
|
||||
kthread_stop(jfsCommitThread[i]);
|
||||
kthread_stop(jfsSyncThread);
|
||||
#ifdef PROC_FS_JFS
|
||||
jfs_proc_clean();
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user