From 8d05d2240085703b7c2bb7d6ee5195804e512949 Mon Sep 17 00:00:00 2001 From: Louis Rilling Date: Fri, 4 Dec 2009 14:52:42 +0100 Subject: [PATCH] --- yaml --- r: 173012 b: refs/heads/master c: b69f2292063d2caf37ca9aec7d63ded203701bf3 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/block/blk-ioc.c | 10 +++++----- trunk/include/linux/iocontext.h | 5 +++-- trunk/kernel/exit.c | 2 +- trunk/kernel/fork.c | 3 ++- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index f8badc51d9ed..ef3b5ead2df4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 61cc74fbb87af6aa551a06a370590c9bc07e29d9 +refs/heads/master: b69f2292063d2caf37ca9aec7d63ded203701bf3 diff --git a/trunk/block/blk-ioc.c b/trunk/block/blk-ioc.c index dcd041290b28..cbdabb0dd6d7 100644 --- a/trunk/block/blk-ioc.c +++ b/trunk/block/blk-ioc.c @@ -66,14 +66,14 @@ static void cfq_exit(struct io_context *ioc) } /* Called by the exitting task */ -void exit_io_context(void) +void exit_io_context(struct task_struct *task) { struct io_context *ioc; - task_lock(current); - ioc = current->io_context; - current->io_context = NULL; - task_unlock(current); + task_lock(task); + ioc = task->io_context; + task->io_context = NULL; + task_unlock(task); if (atomic_dec_and_test(&ioc->nr_tasks)) { if (ioc->aic && ioc->aic->exit) diff --git a/trunk/include/linux/iocontext.h b/trunk/include/linux/iocontext.h index d61b0b8b5cd1..a63235996309 100644 --- a/trunk/include/linux/iocontext.h +++ b/trunk/include/linux/iocontext.h @@ -98,14 +98,15 @@ static inline struct io_context *ioc_task_link(struct io_context *ioc) return NULL; } +struct task_struct; #ifdef CONFIG_BLOCK int put_io_context(struct io_context *ioc); -void exit_io_context(void); +void exit_io_context(struct task_struct *task); struct io_context *get_io_context(gfp_t gfp_flags, int node); struct io_context *alloc_io_context(gfp_t gfp_flags, int node); void copy_io_context(struct io_context **pdst, struct io_context **psrc); #else -static inline void exit_io_context(void) +static inline void exit_io_context(struct task_struct *task) { } diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index f7864ac2ecc1..2544000125d9 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -1004,7 +1004,7 @@ NORET_TYPE void do_exit(long code) tsk->flags |= PF_EXITPIDONE; if (tsk->io_context) - exit_io_context(); + exit_io_context(tsk); if (tsk->splice_pipe) __free_pipe_info(tsk->splice_pipe); diff --git a/trunk/kernel/fork.c b/trunk/kernel/fork.c index 166b8c49257c..607353425bb0 100644 --- a/trunk/kernel/fork.c +++ b/trunk/kernel/fork.c @@ -1310,7 +1310,8 @@ static struct task_struct *copy_process(unsigned long clone_flags, if (pid != &init_struct_pid) free_pid(pid); bad_fork_cleanup_io: - put_io_context(p->io_context); + if (p->io_context) + exit_io_context(p); bad_fork_cleanup_namespaces: exit_task_namespaces(p); bad_fork_cleanup_mm: