diff options
author | Shaohua Li <shli@fb.com> | 2015-10-04 09:20:12 -0700 |
---|---|---|
committer | NeilBrown <neilb@suse.com> | 2015-11-01 13:48:27 +1100 |
commit | e6c033f79a0a1e9ca850575dcfa51bb583b592fa (patch) | |
tree | f3bc309e460231d295e36300ed1442dca875ac58 /drivers/md | |
parent | ac6096e9d5cb88a31f3af2d140df7d680b42745e (diff) | |
download | linux-e6c033f79a0a1e9ca850575dcfa51bb583b592fa.tar.bz2 |
raid5-cache: move reclaim stop to quiesce
Move reclaim stop to quiesce handling, where is safer for this stuff.
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5-cache.c | 30 | ||||
-rw-r--r-- | drivers/md/raid5.c | 1 | ||||
-rw-r--r-- | drivers/md/raid5.h | 1 |
3 files changed, 20 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) 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); } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index a622ccb3477a..216fa3c64287 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -7582,6 +7582,7 @@ static void raid5_quiesce(struct mddev *mddev, int state) unlock_all_device_hash_locks_irq(conf); break; } + r5l_quiesce(conf->log, state); } static void *raid45_takeover_raid0(struct mddev *mddev, int level) diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 32c8ce81248b..1ab534c909fe 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -630,4 +630,5 @@ extern void r5l_write_stripe_run(struct r5l_log *log); extern void r5l_flush_stripe_to_raid(struct r5l_log *log); extern void r5l_stripe_write_finished(struct stripe_head *sh); extern int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio); +extern void r5l_quiesce(struct r5l_log *log, int state); #endif |