Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 46055
b: refs/heads/master
c: dee11c2
h: refs/heads/master
i:
  46053: 3b5f1c1
  46051: 6557c50
  46047: cde1a46
v: v3
  • Loading branch information
Ken Chen authored and Linus Torvalds committed Feb 3, 2007
1 parent 0c2e450 commit ec70903
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3e8219806c33b64a00b0013f96f735451f30c64c
refs/heads/master: dee11c2364f51cac53df17d742a0c69097e29a4e
20 changes: 9 additions & 11 deletions trunk/fs/aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,17 +298,23 @@ static void wait_for_all_aios(struct kioctx *ctx)
struct task_struct *tsk = current;
DECLARE_WAITQUEUE(wait, tsk);

spin_lock_irq(&ctx->ctx_lock);
if (!ctx->reqs_active)
return;
goto out;

add_wait_queue(&ctx->wait, &wait);
set_task_state(tsk, TASK_UNINTERRUPTIBLE);
while (ctx->reqs_active) {
spin_unlock_irq(&ctx->ctx_lock);
schedule();
set_task_state(tsk, TASK_UNINTERRUPTIBLE);
spin_lock_irq(&ctx->ctx_lock);
}
__set_task_state(tsk, TASK_RUNNING);
remove_wait_queue(&ctx->wait, &wait);

out:
spin_unlock_irq(&ctx->ctx_lock);
}

/* wait_on_sync_kiocb:
Expand Down Expand Up @@ -424,7 +430,6 @@ static struct kiocb fastcall *__aio_get_req(struct kioctx *ctx)
ring = kmap_atomic(ctx->ring_info.ring_pages[0], KM_USER0);
if (ctx->reqs_active < aio_ring_avail(&ctx->ring_info, ring)) {
list_add(&req->ki_list, &ctx->active_reqs);
get_ioctx(ctx);
ctx->reqs_active++;
okay = 1;
}
Expand Down Expand Up @@ -536,8 +541,6 @@ int fastcall aio_put_req(struct kiocb *req)
spin_lock_irq(&ctx->ctx_lock);
ret = __aio_put_req(ctx, req);
spin_unlock_irq(&ctx->ctx_lock);
if (ret)
put_ioctx(ctx);
return ret;
}

Expand Down Expand Up @@ -779,8 +782,7 @@ static int __aio_run_iocbs(struct kioctx *ctx)
*/
iocb->ki_users++; /* grab extra reference */
aio_run_iocb(iocb);
if (__aio_put_req(ctx, iocb)) /* drop extra ref */
put_ioctx(ctx);
__aio_put_req(ctx, iocb);
}
if (!list_empty(&ctx->run_list))
return 1;
Expand Down Expand Up @@ -997,14 +999,10 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2)
/* everything turned out well, dispose of the aiocb. */
ret = __aio_put_req(ctx, iocb);

spin_unlock_irqrestore(&ctx->ctx_lock, flags);

if (waitqueue_active(&ctx->wait))
wake_up(&ctx->wait);

if (ret)
put_ioctx(ctx);

spin_unlock_irqrestore(&ctx->ctx_lock, flags);
return ret;
}

Expand Down

0 comments on commit ec70903

Please sign in to comment.