diff options
Diffstat (limited to 'drivers/block/elevator.c')
-rw-r--r-- | drivers/block/elevator.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c index 55621d5c5774..58e881bfd189 100644 --- a/drivers/block/elevator.c +++ b/drivers/block/elevator.c | |||
@@ -642,6 +642,27 @@ EXPORT_SYMBOL_GPL(elv_register); | |||
642 | 642 | ||
643 | void elv_unregister(struct elevator_type *e) | 643 | void elv_unregister(struct elevator_type *e) |
644 | { | 644 | { |
645 | struct task_struct *g, *p; | ||
646 | |||
647 | /* | ||
648 | * Iterate every thread in the process to remove the io contexts. | ||
649 | */ | ||
650 | read_lock(&tasklist_lock); | ||
651 | do_each_thread(g, p) { | ||
652 | struct io_context *ioc = p->io_context; | ||
653 | if (ioc && ioc->cic) { | ||
654 | ioc->cic->exit(ioc->cic); | ||
655 | ioc->cic->dtor(ioc->cic); | ||
656 | ioc->cic = NULL; | ||
657 | } | ||
658 | if (ioc && ioc->aic) { | ||
659 | ioc->aic->exit(ioc->aic); | ||
660 | ioc->aic->dtor(ioc->aic); | ||
661 | ioc->aic = NULL; | ||
662 | } | ||
663 | } while_each_thread(g, p); | ||
664 | read_unlock(&tasklist_lock); | ||
665 | |||
645 | spin_lock_irq(&elv_list_lock); | 666 | spin_lock_irq(&elv_list_lock); |
646 | list_del_init(&e->list); | 667 | list_del_init(&e->list); |
647 | spin_unlock_irq(&elv_list_lock); | 668 | spin_unlock_irq(&elv_list_lock); |