From e6c033f79a0a1e9ca850575dcfa51bb583b592fa Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Sun, 4 Oct 2015 09:20:12 -0700 Subject: raid5-cache: move reclaim stop to quiesce Move reclaim stop to quiesce handling, where is safer for this stuff. Signed-off-by: Shaohua Li Signed-off-by: NeilBrown --- drivers/md/raid5-cache.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'drivers/md/raid5-cache.c') 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) md_wakeup_thread(log->reclaim_thread); } +void r5l_quiesce(struct r5l_log *log, int state) +{ + if (!log || state == 2) + return; + if (state == 0) { + log->reclaim_thread = md_register_thread(r5l_reclaim_thread, + log->rdev->mddev, "reclaim"); + } else if (state == 1) { + /* + * at this point all stripes are finished, so io_unit is at + * least in STRIPE_END state + */ + r5l_wake_reclaim(log, -1L); + md_unregister_thread(&log->reclaim_thread); + r5l_do_reclaim(log); + } +} + struct r5l_recovery_ctx { struct page *meta_page; /* current meta */ sector_t meta_total_blocks; /* total size of current meta and data */ @@ -1120,19 +1138,7 @@ io_kc: void r5l_exit_log(struct r5l_log *log) { - /* - * at this point all stripes are finished, so io_unit is at least in - * STRIPE_END state - */ - r5l_wake_reclaim(log, -1L); md_unregister_thread(&log->reclaim_thread); - r5l_do_reclaim(log); - /* - * force a super update, r5l_do_reclaim might updated the super. - * mddev->thread is already stopped - */ - md_update_sb(log->rdev->mddev, 1); - kmem_cache_destroy(log->io_kc); kfree(log); } -- cgit v1.2.1