From: Mingming Cao Here is a trivial patch fixed a bug in ioctx_alloc(). If aio_setup_ring() failed, ioctx_alloc() should pass the return error from aio_setup_ring() back to sys_io_setup(). fs/aio.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff -puN fs/aio.c~aio-retval-fix fs/aio.c --- 25/fs/aio.c~aio-retval-fix 2003-04-23 00:16:24.000000000 -0700 +++ 25-akpm/fs/aio.c 2003-04-23 00:20:53.000000000 -0700 @@ -204,6 +204,7 @@ static struct kioctx *ioctx_alloc(unsign { struct mm_struct *mm; struct kioctx *ctx; + int ret = 0; /* Prevent overflows */ if ((nr_events > (0x10000000U / sizeof(struct io_event))) || @@ -233,7 +234,8 @@ static struct kioctx *ioctx_alloc(unsign INIT_LIST_HEAD(&ctx->run_list); INIT_WORK(&ctx->wq, aio_kick_handler, ctx); - if (aio_setup_ring(ctx) < 0) + ret = aio_setup_ring(ctx); + if (unlikely(ret < 0)) goto out_freectx; /* limit the number of system wide aios */ @@ -259,7 +261,7 @@ out_cleanup: out_freectx: kmem_cache_free(kioctx_cachep, ctx); - ctx = ERR_PTR(-ENOMEM); + ctx = ERR_PTR(ret); dprintk("aio: error allocating ioctx %p\n", ctx); return ctx; _