From: Linus Torvalds Date: Fri, 6 Dec 2013 16:32:59 +0000 (-0800) Subject: Merge git://git.kvack.org/~bcrl/aio-next X-Git-Tag: v3.13-rc3~2 X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=c537aba00e3f1df8ce6c7c9fcb98b82c0c2d1d2c;hp=7adfff587bc4d9ed8f85a31b12464513fda886a2;p=~andy%2Flinux Merge git://git.kvack.org/~bcrl/aio-next Pull aio fix from Benjamin LaHaise: "AIO fix from Gu Zheng that fixes a GPF that Dave Jones uncovered with trinity" * git://git.kvack.org/~bcrl/aio-next: aio: clean up aio ring in the fail path --- diff --git a/fs/aio.c b/fs/aio.c index 08159ed1364..6efb7f6cb22 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -367,8 +367,10 @@ static int aio_setup_ring(struct kioctx *ctx) if (nr_pages > AIO_RING_PAGES) { ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL); - if (!ctx->ring_pages) + if (!ctx->ring_pages) { + put_aio_ring_file(ctx); return -ENOMEM; + } } ctx->mmap_size = nr_pages * PAGE_SIZE; @@ -645,7 +647,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) aio_nr + nr_events < aio_nr) { spin_unlock(&aio_nr_lock); err = -EAGAIN; - goto err; + goto err_ctx; } aio_nr += ctx->max_reqs; spin_unlock(&aio_nr_lock); @@ -662,6 +664,8 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) err_cleanup: aio_nr_sub(ctx->max_reqs); +err_ctx: + aio_free_ring(ctx); err: free_percpu(ctx->cpu); free_percpu(ctx->reqs.pcpu_count);