Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1b94327 authored by Gu Zheng's avatar Gu Zheng Committed by Benjamin LaHaise
Browse files

aio: clean up aio ring in the fail path

Clean up the aio ring file in the fail path of aio_setup_ring
and ioctx_alloc. And maybe it can fix the GPF issue reported by
Dave Jones:
https://lkml.org/lkml/2013/11/25/898



Signed-off-by: default avatarGu Zheng <guz.fnst@cn.fujitsu.com>
Signed-off-by: default avatarBenjamin LaHaise <bcrl@kvack.org>
parent ddb8c45b
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -316,9 +316,11 @@ 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;
	pr_debug("attempting mmap of %lu bytes\n", ctx->mmap_size);
@@ -594,7 +596,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);
@@ -611,6 +613,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);