aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/aio.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/aio.c b/fs/aio.c
index e7cd40b626b7..5a28b69ad223 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -457,6 +457,8 @@ static inline struct kiocb *aio_get_req(struct kioctx *ctx)
457 457
458static inline void really_put_req(struct kioctx *ctx, struct kiocb *req) 458static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
459{ 459{
460 assert_spin_locked(&ctx->ctx_lock);
461
460 if (req->ki_dtor) 462 if (req->ki_dtor)
461 req->ki_dtor(req); 463 req->ki_dtor(req);
462 kmem_cache_free(kiocb_cachep, req); 464 kmem_cache_free(kiocb_cachep, req);
@@ -498,6 +500,8 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
498 dprintk(KERN_DEBUG "aio_put(%p): f_count=%d\n", 500 dprintk(KERN_DEBUG "aio_put(%p): f_count=%d\n",
499 req, atomic_read(&req->ki_filp->f_count)); 501 req, atomic_read(&req->ki_filp->f_count));
500 502
503 assert_spin_locked(&ctx->ctx_lock);
504
501 req->ki_users --; 505 req->ki_users --;
502 if (unlikely(req->ki_users < 0)) 506 if (unlikely(req->ki_users < 0))
503 BUG(); 507 BUG();
@@ -619,14 +623,13 @@ static void unuse_mm(struct mm_struct *mm)
619 * the kiocb (to tell the caller to activate the work 623 * the kiocb (to tell the caller to activate the work
620 * queue to process it), or 0, if it found that it was 624 * queue to process it), or 0, if it found that it was
621 * already queued. 625 * already queued.
622 *
623 * Should be called with the spin lock iocb->ki_ctx->ctx_lock
624 * held
625 */ 626 */
626static inline int __queue_kicked_iocb(struct kiocb *iocb) 627static inline int __queue_kicked_iocb(struct kiocb *iocb)
627{ 628{
628 struct kioctx *ctx = iocb->ki_ctx; 629 struct kioctx *ctx = iocb->ki_ctx;
629 630
631 assert_spin_locked(&ctx->ctx_lock);
632
630 if (list_empty(&iocb->ki_run_list)) { 633 if (list_empty(&iocb->ki_run_list)) {
631 list_add_tail(&iocb->ki_run_list, 634 list_add_tail(&iocb->ki_run_list,
632 &ctx->run_list); 635 &ctx->run_list);
@@ -771,13 +774,15 @@ out:
771 * Process all pending retries queued on the ioctx 774 * Process all pending retries queued on the ioctx
772 * run list. 775 * run list.
773 * Assumes it is operating within the aio issuer's mm 776 * Assumes it is operating within the aio issuer's mm
774 * context. Expects to be called with ctx->ctx_lock held 777 * context.
775 */ 778 */
776static int __aio_run_iocbs(struct kioctx *ctx) 779static int __aio_run_iocbs(struct kioctx *ctx)
777{ 780{
778 struct kiocb *iocb; 781 struct kiocb *iocb;
779 LIST_HEAD(run_list); 782 LIST_HEAD(run_list);
780 783
784 assert_spin_locked(&ctx->ctx_lock);
785
781 list_splice_init(&ctx->run_list, &run_list); 786 list_splice_init(&ctx->run_list, &run_list);
782 while (!list_empty(&run_list)) { 787 while (!list_empty(&run_list)) {
783 iocb = list_entry(run_list.next, struct kiocb, 788 iocb = list_entry(run_list.next, struct kiocb,
@@ -1604,12 +1609,14 @@ asmlinkage long sys_io_submit(aio_context_t ctx_id, long nr,
1604 1609
1605/* lookup_kiocb 1610/* lookup_kiocb
1606 * Finds a given iocb for cancellation. 1611 * Finds a given iocb for cancellation.
1607 * MUST be called with ctx->ctx_lock held.
1608 */ 1612 */
1609static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb, 1613static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb,
1610 u32 key) 1614 u32 key)
1611{ 1615{
1612 struct list_head *pos; 1616 struct list_head *pos;
1617
1618 assert_spin_locked(&ctx->ctx_lock);
1619
1613 /* TODO: use a hash or array, this sucks. */ 1620 /* TODO: use a hash or array, this sucks. */
1614 list_for_each(pos, &ctx->active_reqs) { 1621 list_for_each(pos, &ctx->active_reqs) {
1615 struct kiocb *kiocb = list_kiocb(pos); 1622 struct kiocb *kiocb = list_kiocb(pos);