From: Jens Axboe Date: Sat, 26 Sep 2009 15:24:01 +0000 (+0200) Subject: aio: current->io_wait stuff X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=9eb652800c21ac87aaa11fae391f4a0c1a7a2a59;p=linux-block.git aio: current->io_wait stuff Signed-off-by: Jens Axboe --- diff --git a/fs/aio.c b/fs/aio.c index 02a2c9340573..0d5e06c1ffaa 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -695,7 +695,10 @@ static ssize_t aio_run_iocb(struct kiocb *iocb) * Now we are all set to call the retry method in async * context. */ + BUG_ON(current->io_wait != NULL); + current->io_wait = &iocb->ki_wait; ret = retry(iocb); + current->io_wait = NULL; if (ret != -EIOCBRETRY && ret != -EIOCBQUEUED) { BUG_ON(!list_empty(&iocb->ki_wait.task_list)); diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 21a6f5d9af22..c72de9cb643f 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -177,6 +177,7 @@ extern struct cred init_cred; [PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \ }, \ .dirties = INIT_PROP_LOCAL_SINGLE(dirties), \ + .io_wait = NULL, \ INIT_IDS \ INIT_PERF_EVENTS(tsk) \ INIT_TRACE_IRQFLAGS \ diff --git a/include/linux/sched.h b/include/linux/sched.h index 75e6e60bf583..e902d15fc708 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1455,6 +1455,7 @@ struct task_struct { struct backing_dev_info *backing_dev_info; struct io_context *io_context; + wait_queue_t *io_wait; unsigned long ptrace_message; siginfo_t *last_siginfo; /* For ptrace use. */ diff --git a/kernel/fork.c b/kernel/fork.c index 266c6af6ef1b..2a20e6fbd2d2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1075,6 +1075,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, p->real_start_time = p->start_time; monotonic_to_bootbased(&p->real_start_time); p->io_context = NULL; + p->io_wait = NULL; p->audit_context = NULL; cgroup_fork(p); #ifdef CONFIG_NUMA