Hold the context lock across unuse_mm 25-akpm/fs/aio.c | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) diff -puN fs/aio.c~unuse_mm-locked fs/aio.c --- 25/fs/aio.c~unuse_mm-locked Mon Jul 7 15:51:01 2003 +++ 25-akpm/fs/aio.c Mon Jul 7 15:51:01 2003 @@ -749,19 +749,18 @@ out: } /* - * aio_run_iocbs: + * __aio_run_iocbs: * Process all pending retries queued on the ioctx * run list. * Assumes it is operating within the aio issuer's mm - * context. + * context. Expects to be called with ctx->ctx_lock held */ -static void aio_run_iocbs(struct kioctx *ctx) +static void __aio_run_iocbs(struct kioctx *ctx) { struct kiocb *iocb; ssize_t ret; int count = 0; - spin_lock_irq(&ctx->ctx_lock); while (!list_empty(&ctx->run_list)) { iocb = list_entry(ctx->run_list.next, struct kiocb, ki_run_list); @@ -769,11 +768,24 @@ static void aio_run_iocbs(struct kioctx ret = aio_run_iocb(iocb); count++; } - spin_unlock_irq(&ctx->ctx_lock); aio_run++; } /* + * aio_run_iocbs: + * Process all pending retries queued on the ioctx + * run list. + * Assumes it is operating within the aio issuer's mm + * context. + */ +static inline void aio_run_iocbs(struct kioctx *ctx) +{ + spin_lock_irq(&ctx->ctx_lock); + __aio_run_iocbs(ctx); + spin_unlock_irq(&ctx->ctx_lock); +} + +/* * aio_kick_handler: * Work queue handler triggered to process pending * retries on an ioctx. Takes on the aio issuer's @@ -785,8 +797,10 @@ static void aio_kick_handler(void *data) struct kioctx *ctx = data; use_mm(ctx->mm); - aio_run_iocbs(ctx); + spin_lock_irq(&ctx->ctx_lock); + __aio_run_iocbs(ctx); unuse_mm(ctx->mm); + spin_unlock_irq(&ctx->ctx_lock); } _