md-cluster: make resync lock also could be interruptted
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 12 Aug 2016 05:42:43 +0000 (13:42 +0800)
committerShaohua Li <shli@fb.com>
Wed, 21 Sep 2016 16:09:44 +0000 (09:09 -0700)
When one node is perform resync or recovery, other nodes
can't get resync lock and could block for a while before
it holds the lock, so we can't stop array immediately for
this scenario.

To make array could be stop quickly, we check MD_CLOSING
in dlm_lock_sync_interruptible to make us can interrupt
the lock request.

Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md-cluster.c

index 43b90485448d5e09cb9981b89b875167425ba241..2b13117fb918cbe27775ba61cc68c6f78e5408ff 100644 (file)
@@ -161,7 +161,8 @@ static int dlm_lock_sync_interruptible(struct dlm_lock_resource *res, int mode,
                return ret;
 
        wait_event(res->sync_locking, res->sync_locking_done
-                                     || kthread_should_stop());
+                                     || kthread_should_stop()
+                                     || test_bit(MD_CLOSING, &mddev->flags));
        if (!res->sync_locking_done) {
                /*
                 * the convert queue contains the lock request when request is
@@ -1045,7 +1046,7 @@ static void metadata_update_cancel(struct mddev *mddev)
 static int resync_start(struct mddev *mddev)
 {
        struct md_cluster_info *cinfo = mddev->cluster_info;
-       return dlm_lock_sync(cinfo->resync_lockres, DLM_LOCK_EX);
+       return dlm_lock_sync_interruptible(cinfo->resync_lockres, DLM_LOCK_EX, mddev);
 }
 
 static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)