X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=fs%2Faio.c;h=ded94c4fa30d31a6997625d007548d119c2aa75d;hb=83e32fc6d7aa9fb584b6fe9855e7d503667020c5;hp=ebd06fd0de89c8e61d7de1712b8c43450347a5c0;hpb=40329a6815e0740c68fcdb596ea35c2884868426;p=firefly-linux-kernel-4.4.55.git diff --git a/fs/aio.c b/fs/aio.c index ebd06fd0de89..ded94c4fa30d 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -310,7 +310,6 @@ static void free_ioctx(struct kioctx *ctx) avail = (head <= ctx->tail ? ctx->tail : ctx->nr_events) - head; - atomic_sub(avail, &ctx->reqs_active); head += avail; head %= ctx->nr_events; } @@ -678,6 +677,7 @@ void aio_complete(struct kiocb *iocb, long res, long res2) put_rq: /* everything turned out well, dispose of the aiocb. */ aio_put_req(iocb); + atomic_dec(&ctx->reqs_active); /* * We have to order our ring_info tail store above and test @@ -717,6 +717,8 @@ static long aio_read_events_ring(struct kioctx *ctx, if (head == ctx->tail) goto out; + head %= ctx->nr_events; + while (ret < nr) { long avail; struct io_event *ev; @@ -755,8 +757,6 @@ static long aio_read_events_ring(struct kioctx *ctx, flush_dcache_page(ctx->ring_pages[0]); pr_debug("%li h%u t%u\n", ret, head, ctx->tail); - - atomic_sub(ret, &ctx->reqs_active); out: mutex_unlock(&ctx->ring_lock);