|
@@ -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
|