Skip to content

Commit

Permalink
aio: fix kioctx not being freed after cancellation at exit time
Browse files Browse the repository at this point in the history
The recent changes overhauling fs/aio.c introduced a bug that results in
the kioctx not being freed when outstanding kiocbs are cancelled at
exit_aio() time.  Specifically, a kiocb that is cancelled has its
completion events discarded by batch_complete_aio(), which then fails to
wake up the process stuck in free_ioctx().  Fix this by modifying the
wait_event() condition in free_ioctx() appropriately.

This patch was tested with the cancel operation in the thread based code
posted yesterday.

[akpm@linux-foundation.org: fix build]
Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
Signed-off-by: Kent Overstreet <koverstreet@google.com>
Cc: Kent Overstreet <koverstreet@google.com>
Cc: Josh Boyer <jwboyer@redhat.com>
Cc: Zach Brown <zab@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Benjamin LaHaise authored and Linus Torvalds committed May 24, 2013
1 parent a9ff785 commit 03e04f0
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion fs/aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,9 @@ static void free_ioctx(struct kioctx *ctx)
kunmap_atomic(ring);

while (atomic_read(&ctx->reqs_active) > 0) {
wait_event(ctx->wait, head != ctx->tail);
wait_event(ctx->wait,
head != ctx->tail ||
atomic_read(&ctx->reqs_active) <= 0);

avail = (head <= ctx->tail ? ctx->tail : ctx->nr_events) - head;

Expand Down

0 comments on commit 03e04f0

Please sign in to comment.