diff options
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 3d3accb1f800..0e8ca0347707 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -92,7 +92,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) | |||
92 | "BdiDirtyThresh: %8lu kB\n" | 92 | "BdiDirtyThresh: %8lu kB\n" |
93 | "DirtyThresh: %8lu kB\n" | 93 | "DirtyThresh: %8lu kB\n" |
94 | "BackgroundThresh: %8lu kB\n" | 94 | "BackgroundThresh: %8lu kB\n" |
95 | "WriteBack threads:%8lu\n" | 95 | "WritebackThreads: %8lu\n" |
96 | "b_dirty: %8lu\n" | 96 | "b_dirty: %8lu\n" |
97 | "b_io: %8lu\n" | 97 | "b_io: %8lu\n" |
98 | "b_more_io: %8lu\n" | 98 | "b_more_io: %8lu\n" |
@@ -604,15 +604,36 @@ static void bdi_wb_shutdown(struct backing_dev_info *bdi) | |||
604 | 604 | ||
605 | /* | 605 | /* |
606 | * Finally, kill the kernel threads. We don't need to be RCU | 606 | * Finally, kill the kernel threads. We don't need to be RCU |
607 | * safe anymore, since the bdi is gone from visibility. | 607 | * safe anymore, since the bdi is gone from visibility. Force |
608 | * unfreeze of the thread before calling kthread_stop(), otherwise | ||
609 | * it would never exet if it is currently stuck in the refrigerator. | ||
608 | */ | 610 | */ |
609 | list_for_each_entry(wb, &bdi->wb_list, list) | 611 | list_for_each_entry(wb, &bdi->wb_list, list) { |
612 | thaw_process(wb->task); | ||
610 | kthread_stop(wb->task); | 613 | kthread_stop(wb->task); |
614 | } | ||
615 | } | ||
616 | |||
617 | /* | ||
618 | * This bdi is going away now, make sure that no super_blocks point to it | ||
619 | */ | ||
620 | static void bdi_prune_sb(struct backing_dev_info *bdi) | ||
621 | { | ||
622 | struct super_block *sb; | ||
623 | |||
624 | spin_lock(&sb_lock); | ||
625 | list_for_each_entry(sb, &super_blocks, s_list) { | ||
626 | if (sb->s_bdi == bdi) | ||
627 | sb->s_bdi = NULL; | ||
628 | } | ||
629 | spin_unlock(&sb_lock); | ||
611 | } | 630 | } |
612 | 631 | ||
613 | void bdi_unregister(struct backing_dev_info *bdi) | 632 | void bdi_unregister(struct backing_dev_info *bdi) |
614 | { | 633 | { |
615 | if (bdi->dev) { | 634 | if (bdi->dev) { |
635 | bdi_prune_sb(bdi); | ||
636 | |||
616 | if (!bdi_cap_flush_forker(bdi)) | 637 | if (!bdi_cap_flush_forker(bdi)) |
617 | bdi_wb_shutdown(bdi); | 638 | bdi_wb_shutdown(bdi); |
618 | bdi_debug_unregister(bdi); | 639 | bdi_debug_unregister(bdi); |