diff options
| -rw-r--r-- | fs/aio.c | 14 |
1 files changed, 6 insertions, 8 deletions
| @@ -228,12 +228,6 @@ static void __put_ioctx(struct kioctx *ctx) | |||
| 228 | call_rcu(&ctx->rcu_head, ctx_rcu_free); | 228 | call_rcu(&ctx->rcu_head, ctx_rcu_free); |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | static inline void get_ioctx(struct kioctx *kioctx) | ||
| 232 | { | ||
| 233 | BUG_ON(atomic_read(&kioctx->users) <= 0); | ||
| 234 | atomic_inc(&kioctx->users); | ||
| 235 | } | ||
| 236 | |||
| 237 | static inline int try_get_ioctx(struct kioctx *kioctx) | 231 | static inline int try_get_ioctx(struct kioctx *kioctx) |
| 238 | { | 232 | { |
| 239 | return atomic_inc_not_zero(&kioctx->users); | 233 | return atomic_inc_not_zero(&kioctx->users); |
| @@ -609,11 +603,16 @@ static void aio_fput_routine(struct work_struct *data) | |||
| 609 | fput(req->ki_filp); | 603 | fput(req->ki_filp); |
| 610 | 604 | ||
| 611 | /* Link the iocb into the context's free list */ | 605 | /* Link the iocb into the context's free list */ |
| 606 | rcu_read_lock(); | ||
| 612 | spin_lock_irq(&ctx->ctx_lock); | 607 | spin_lock_irq(&ctx->ctx_lock); |
| 613 | really_put_req(ctx, req); | 608 | really_put_req(ctx, req); |
| 609 | /* | ||
| 610 | * at that point ctx might've been killed, but actual | ||
| 611 | * freeing is RCU'd | ||
| 612 | */ | ||
| 614 | spin_unlock_irq(&ctx->ctx_lock); | 613 | spin_unlock_irq(&ctx->ctx_lock); |
| 614 | rcu_read_unlock(); | ||
| 615 | 615 | ||
| 616 | put_ioctx(ctx); | ||
| 617 | spin_lock_irq(&fput_lock); | 616 | spin_lock_irq(&fput_lock); |
| 618 | } | 617 | } |
| 619 | spin_unlock_irq(&fput_lock); | 618 | spin_unlock_irq(&fput_lock); |
| @@ -644,7 +643,6 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req) | |||
| 644 | * this function will be executed w/out any aio kthread wakeup. | 643 | * this function will be executed w/out any aio kthread wakeup. |
| 645 | */ | 644 | */ |
| 646 | if (unlikely(!fput_atomic(req->ki_filp))) { | 645 | if (unlikely(!fput_atomic(req->ki_filp))) { |
| 647 | get_ioctx(ctx); | ||
| 648 | spin_lock(&fput_lock); | 646 | spin_lock(&fput_lock); |
| 649 | list_add(&req->ki_list, &fput_head); | 647 | list_add(&req->ki_list, &fput_head); |
| 650 | spin_unlock(&fput_lock); | 648 | spin_unlock(&fput_lock); |
