atom feed3 messages in org.kernel.vger.kernel-janitorsRe: [PATCH] [JFFS2] Move jffs2_gcd_mt...
FromSent OnAttachments
Gerard LledoMay 29, 2009 1:19 am 
Andrew MortonJun 1, 2009 4:20 pm 
Gerard LledoJun 2, 2009 4:32 am 
Subject:Re: [PATCH] [JFFS2] Move jffs2_gcd_mtd threads to the new kthread API
From:Gerard Lledo (gera@gmail.com)
Date:Jun 2, 2009 4:32:16 am
List:org.kernel.vger.kernel-janitors

On Mon, Jun 01, 2009 at 04:20:10PM -0700, Andrew Morton wrote:

On Fri, 29 May 2009 11:19:41 +0300 Gerard Lledo <gera@gmail.com> wrote:

kernel_thread() is being depracated. This patch moves the jffs2 garbage collecting thread to the new kthread API with the minimal impact.

Signed-off-by: Gerard Lledo <gera@gmail.com>

--- fs/jffs2/background.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c index e958010..077fa65 100644 --- a/fs/jffs2/background.c +++ b/fs/jffs2/background.c @@ -15,6 +15,7 @@ #include <linux/completion.h> #include <linux/sched.h> #include <linux/freezer.h> +#include <linux/kthread.h> #include "nodelist.h"

@@ -31,7 +32,7 @@ void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c) /* This must only ever be called when no GC thread is currently running */ int jffs2_start_garbage_collect_thread(struct jffs2_sb_info *c) { - pid_t pid; + struct task_struct *tsk; int ret = 0;

BUG_ON(c->gc_task); @@ -39,15 +40,16 @@ int jffs2_start_garbage_collect_thread(struct jffs2_sb_info
*c) init_completion(&c->gc_thread_start); init_completion(&c->gc_thread_exit);

- pid = kernel_thread(jffs2_garbage_collect_thread, c, CLONE_FS|CLONE_FILES); - if (pid < 0) { - printk(KERN_WARNING "fork failed for JFFS2 garbage collect thread: %d\n",
-pid); + tsk = kthread_create(jffs2_garbage_collect_thread, c, "jffs2_gcd_mtd%d",
c->mtd->index); + if (IS_ERR(tsk)) { + printk(KERN_WARNING "fork failed for JFFS2 garbage collect thread: %ld\n",
-PTR_ERR(tsk)); complete(&c->gc_thread_exit); - ret = pid; + ret = PTR_ERR(tsk); } else { - /* Wait for it... */ - D1(printk(KERN_DEBUG "JFFS2: Garbage collect thread is pid %d\n", pid)); + D1(printk(KERN_DEBUG "JFFS2: Garbage collect thread is pid %d\n", tsk->pid)); + wake_up_process(tsk); wait_for_completion(&c->gc_thread_start); + ret = tsk->pid; }

A simple kthread_run() would be preferable here. The code presently sort-of open-codes it.

return ret;

Also, manipulating kernel threads via their pids is atypical and inefficient. In-kernel it is better to refer to threads via their task_struct*.

Fortunately all callers of this function ignore its return value so I expect we can simply change it to be void-returning. But that's a cleanup which would best be done in a spearate patch.

OK, I'll redo the previous patch with kthread_run() instead. I will also post a different patch to cleanup the return value and use void.