diff options
Diffstat (limited to 'fs/aio.c')
-rw-r--r-- | fs/aio.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -476,14 +476,21 @@ static void kiocb_batch_init(struct kiocb_batch *batch, long total) | |||
476 | batch->count = total; | 476 | batch->count = total; |
477 | } | 477 | } |
478 | 478 | ||
479 | static void kiocb_batch_free(struct kiocb_batch *batch) | 479 | static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch) |
480 | { | 480 | { |
481 | struct kiocb *req, *n; | 481 | struct kiocb *req, *n; |
482 | 482 | ||
483 | if (list_empty(&batch->head)) | ||
484 | return; | ||
485 | |||
486 | spin_lock_irq(&ctx->ctx_lock); | ||
483 | list_for_each_entry_safe(req, n, &batch->head, ki_batch) { | 487 | list_for_each_entry_safe(req, n, &batch->head, ki_batch) { |
484 | list_del(&req->ki_batch); | 488 | list_del(&req->ki_batch); |
489 | list_del(&req->ki_list); | ||
485 | kmem_cache_free(kiocb_cachep, req); | 490 | kmem_cache_free(kiocb_cachep, req); |
491 | ctx->reqs_active--; | ||
486 | } | 492 | } |
493 | spin_unlock_irq(&ctx->ctx_lock); | ||
487 | } | 494 | } |
488 | 495 | ||
489 | /* | 496 | /* |
@@ -1742,7 +1749,7 @@ long do_io_submit(aio_context_t ctx_id, long nr, | |||
1742 | } | 1749 | } |
1743 | blk_finish_plug(&plug); | 1750 | blk_finish_plug(&plug); |
1744 | 1751 | ||
1745 | kiocb_batch_free(&batch); | 1752 | kiocb_batch_free(ctx, &batch); |
1746 | put_ioctx(ctx); | 1753 | put_ioctx(ctx); |
1747 | return i ? i : ret; | 1754 | return i ? i : ret; |
1748 | } | 1755 | } |