raid5-cache: move reclaim stop to quiesce
authorShaohua Li <shli@fb.com>
Sun, 4 Oct 2015 16:20:12 +0000 (09:20 -0700)
committerNeilBrown <neilb@suse.com>
Sun, 1 Nov 2015 02:48:27 +0000 (13:48 +1100)
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>
drivers/md/raid5-cache.c
drivers/md/raid5.c
drivers/md/raid5.h

index 0460882a5fd74517fc21b6bbc0b3b6fc1e9f5bb2..289ca3f5d4b32e57284f6f05b83691ff38164f1b 100644 (file)
@@ -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);
 }
index a622ccb3477a09f306bf716f98881e61c7ae92b3..216fa3c64287e7afb2e1839560052ff38c771e02 100644 (file)
@@ -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)
index 32c8ce81248b53581e8601552f47f441ebe14933..1ab534c909fe6b1693441f1e3db4aa826c971ed0 100644 (file)
@@ -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