diff -purN -X /home/mbligh/.diff.exclude 505-4g4g-aio-hang-fix/fs/aio.c 510-aio-retry-elevated-refcount/fs/aio.c
--- 505-4g4g-aio-hang-fix/fs/aio.c	2004-02-20 15:40:38.000000000 -0800
+++ 510-aio-retry-elevated-refcount/fs/aio.c	2004-02-20 15:40:43.000000000 -0800
@@ -771,14 +771,19 @@ out:
 static void __aio_run_iocbs(struct kioctx *ctx)
 {
 	struct kiocb *iocb;
-	ssize_t ret;
 	int count = 0;
 
 	while (!list_empty(&ctx->run_list)) {
 		iocb = list_entry(ctx->run_list.next, struct kiocb,
 			ki_run_list);
 		list_del(&iocb->ki_run_list);
-		ret = aio_run_iocb(iocb);
+		/*
+		 * Hold an extra reference while retrying i/o.
+		 */
+		iocb->ki_users++;	/* grab extra reference */
+		aio_run_iocb(iocb);
+		if (__aio_put_req(ctx, iocb))  /* drop extra ref */
+			put_ioctx(ctx);
 		count++;
 	}
 	aio_run++;