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-28 11:21:12.000000000 -0800 +++ 510-aio-retry-elevated-refcount/fs/aio.c 2004-02-28 11:21:15.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++;