diff options
Diffstat (limited to 'drivers/md/raid5-cache.c')
-rw-r--r-- | drivers/md/raid5-cache.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 0460882a5fd7..289ca3f5d4b3 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c | |||
@@ -748,6 +748,24 @@ static void r5l_wake_reclaim(struct r5l_log *log, sector_t space) | |||
748 | md_wakeup_thread(log->reclaim_thread); | 748 | md_wakeup_thread(log->reclaim_thread); |
749 | } | 749 | } |
750 | 750 | ||
751 | void r5l_quiesce(struct r5l_log *log, int state) | ||
752 | { | ||
753 | if (!log || state == 2) | ||
754 | return; | ||
755 | if (state == 0) { | ||
756 | log->reclaim_thread = md_register_thread(r5l_reclaim_thread, | ||
757 | log->rdev->mddev, "reclaim"); | ||
758 | } else if (state == 1) { | ||
759 | /* | ||
760 | * at this point all stripes are finished, so io_unit is at | ||
761 | * least in STRIPE_END state | ||
762 | */ | ||
763 | r5l_wake_reclaim(log, -1L); | ||
764 | md_unregister_thread(&log->reclaim_thread); | ||
765 | r5l_do_reclaim(log); | ||
766 | } | ||
767 | } | ||
768 | |||
751 | struct r5l_recovery_ctx { | 769 | struct r5l_recovery_ctx { |
752 | struct page *meta_page; /* current meta */ | 770 | struct page *meta_page; /* current meta */ |
753 | sector_t meta_total_blocks; /* total size of current meta and data */ | 771 | sector_t meta_total_blocks; /* total size of current meta and data */ |
@@ -1120,19 +1138,7 @@ io_kc: | |||
1120 | 1138 | ||
1121 | void r5l_exit_log(struct r5l_log *log) | 1139 | void r5l_exit_log(struct r5l_log *log) |
1122 | { | 1140 | { |
1123 | /* | ||
1124 | * at this point all stripes are finished, so io_unit is at least in | ||
1125 | * STRIPE_END state | ||
1126 | */ | ||
1127 | r5l_wake_reclaim(log, -1L); | ||
1128 | md_unregister_thread(&log->reclaim_thread); | 1141 | md_unregister_thread(&log->reclaim_thread); |
1129 | r5l_do_reclaim(log); | ||
1130 | /* | ||
1131 | * force a super update, r5l_do_reclaim might updated the super. | ||
1132 | * mddev->thread is already stopped | ||
1133 | */ | ||
1134 | md_update_sb(log->rdev->mddev, 1); | ||
1135 | |||
1136 | kmem_cache_destroy(log->io_kc); | 1142 | kmem_cache_destroy(log->io_kc); |
1137 | kfree(log); | 1143 | kfree(log); |
1138 | } | 1144 | } |