Hold the context lock across unuse_mm


 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	2003-06-16 23:31:10.000000000 -0700
+++ 25-akpm/fs/aio.c	2003-06-16 23:31:10.000000000 -0700
@@ -750,19 +750,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);
@@ -770,11 +769,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 
@@ -786,8 +798,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);
 }
 
 

_