diff options
Diffstat (limited to 'block/ll_rw_blk.c')
-rw-r--r-- | block/ll_rw_blk.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 5a19e2eb5711..5b26af8597f3 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -3539,11 +3539,17 @@ void put_io_context(struct io_context *ioc) | |||
3539 | BUG_ON(atomic_read(&ioc->refcount) == 0); | 3539 | BUG_ON(atomic_read(&ioc->refcount) == 0); |
3540 | 3540 | ||
3541 | if (atomic_dec_and_test(&ioc->refcount)) { | 3541 | if (atomic_dec_and_test(&ioc->refcount)) { |
3542 | struct cfq_io_context *cic; | ||
3543 | |||
3542 | rcu_read_lock(); | 3544 | rcu_read_lock(); |
3543 | if (ioc->aic && ioc->aic->dtor) | 3545 | if (ioc->aic && ioc->aic->dtor) |
3544 | ioc->aic->dtor(ioc->aic); | 3546 | ioc->aic->dtor(ioc->aic); |
3545 | if (ioc->cic && ioc->cic->dtor) | 3547 | if (ioc->cic_root.rb_node != NULL) { |
3546 | ioc->cic->dtor(ioc->cic); | 3548 | struct rb_node *n = rb_first(&ioc->cic_root); |
3549 | |||
3550 | cic = rb_entry(n, struct cfq_io_context, rb_node); | ||
3551 | cic->dtor(ioc); | ||
3552 | } | ||
3547 | rcu_read_unlock(); | 3553 | rcu_read_unlock(); |
3548 | 3554 | ||
3549 | kmem_cache_free(iocontext_cachep, ioc); | 3555 | kmem_cache_free(iocontext_cachep, ioc); |
@@ -3556,6 +3562,7 @@ void exit_io_context(void) | |||
3556 | { | 3562 | { |
3557 | unsigned long flags; | 3563 | unsigned long flags; |
3558 | struct io_context *ioc; | 3564 | struct io_context *ioc; |
3565 | struct cfq_io_context *cic; | ||
3559 | 3566 | ||
3560 | local_irq_save(flags); | 3567 | local_irq_save(flags); |
3561 | task_lock(current); | 3568 | task_lock(current); |
@@ -3567,9 +3574,11 @@ void exit_io_context(void) | |||
3567 | 3574 | ||
3568 | if (ioc->aic && ioc->aic->exit) | 3575 | if (ioc->aic && ioc->aic->exit) |
3569 | ioc->aic->exit(ioc->aic); | 3576 | ioc->aic->exit(ioc->aic); |
3570 | if (ioc->cic && ioc->cic->exit) | 3577 | if (ioc->cic_root.rb_node != NULL) { |
3571 | ioc->cic->exit(ioc->cic); | 3578 | cic = rb_entry(rb_first(&ioc->cic_root), struct cfq_io_context, rb_node); |
3572 | 3579 | cic->exit(ioc); | |
3580 | } | ||
3581 | |||
3573 | put_io_context(ioc); | 3582 | put_io_context(ioc); |
3574 | } | 3583 | } |
3575 | 3584 | ||
@@ -3598,7 +3607,7 @@ struct io_context *current_io_context(gfp_t gfp_flags) | |||
3598 | ret->last_waited = jiffies; /* doesn't matter... */ | 3607 | ret->last_waited = jiffies; /* doesn't matter... */ |
3599 | ret->nr_batch_requests = 0; /* because this is 0 */ | 3608 | ret->nr_batch_requests = 0; /* because this is 0 */ |
3600 | ret->aic = NULL; | 3609 | ret->aic = NULL; |
3601 | ret->cic = NULL; | 3610 | ret->cic_root.rb_node = NULL; |
3602 | tsk->io_context = ret; | 3611 | tsk->io_context = ret; |
3603 | } | 3612 | } |
3604 | 3613 | ||