Blob Blame History Raw
From: Guoqing Jiang <gqjiang@suse.com>
Date: Tue, 24 Oct 2017 15:11:51 +0800
Subject: [PATCH] md-cluster: Suspend writes in RAID10 if within range
Git-commit: cb8a7a7e1098e74d36378b992a6d012668ec10d9
Patch-mainline: v4.15-rc1
References: fate#323171, bsc#1093023

If there is a resync going on, all nodes must suspend
writes to the range. This is recorded in suspend_info
and suspend_list.

If there is an I/O within the ranges of any of the
suspend_info, area_resyncing will return 1.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Coly Li <colyli@suse.de>
---
 drivers/md/raid10.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 61890231972e..cc6a56a659a3 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1294,6 +1294,22 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
 	sector_t sectors;
 	int max_sectors;
 
+	if ((mddev_is_clustered(mddev) &&
+	     md_cluster_ops->area_resyncing(mddev, WRITE,
+					    bio->bi_iter.bi_sector,
+					    bio_end_sector(bio)))) {
+		DEFINE_WAIT(w);
+		for (;;) {
+			prepare_to_wait(&conf->wait_barrier,
+					&w, TASK_IDLE);
+			if (!md_cluster_ops->area_resyncing(mddev, WRITE,
+				 bio->bi_iter.bi_sector, bio_end_sector(bio)))
+				break;
+			schedule();
+		}
+		finish_wait(&conf->wait_barrier, &w);
+	}
+
 	/*
 	 * Register the new request and wait if the reconstruction
 	 * thread has put up a bar for new requests.
-- 
2.16.3