Blame SOURCES/Introduce1-sys_hot_remove_disk.patch

2c1b57
From fdd015696c2e2a6b234a92af564aea44b62e6a0d Mon Sep 17 00:00:00 2001
2c1b57
From: NeilBrown <neilb@suse.com>
2c1b57
Date: Mon, 27 Mar 2017 14:36:56 +1100
2c1b57
Subject: [RHEL7.5 PATCH 022/169] Introduce sys_hot_remove_disk()
2c1b57
2c1b57
The new hot_remove_disk() will retry HOT_REMOVE_DISK
2c1b57
several times in the face of EBUSY.
2c1b57
However we sometimes remove a device by writing "remove" to the
2c1b57
"state" attributed.  This should be retried as well.
2c1b57
So introduce sys_hot_remove_disk() to repeat this action a few times.
2c1b57
2c1b57
Signed-off-by: NeilBrown <neilb@suse.com>
2c1b57
Signed-off-by: Jes Sorensen <Jes.Sorensen@gmail.com>
2c1b57
---
2c1b57
 Manage.c |  6 +-----
2c1b57
 mdadm.h  |  1 +
2c1b57
 util.c   | 12 ++++++++++++
2c1b57
 3 files changed, 14 insertions(+), 5 deletions(-)
2c1b57
2c1b57
diff --git a/Manage.c b/Manage.c
2c1b57
index 9139f96..edf5798 100644
2c1b57
--- a/Manage.c
2c1b57
+++ b/Manage.c
2c1b57
@@ -1177,11 +1177,7 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
2c1b57
 		/* device has been removed and we don't know
2c1b57
 		 * the major:minor number
2c1b57
 		 */
2c1b57
-		int n = write(sysfd, "remove", 6);
2c1b57
-		if (n != 6)
2c1b57
-			err = -1;
2c1b57
-		else
2c1b57
-			err = 0;
2c1b57
+		err = sys_hot_remove_disk(sysfd);
2c1b57
 	} else {
2c1b57
 		err = hot_remove_disk(fd, rdev);
2c1b57
 		if (err && errno == ENODEV) {
2c1b57
diff --git a/mdadm.h b/mdadm.h
2c1b57
index 5bcfb86..b855d24 100644
2c1b57
--- a/mdadm.h
2c1b57
+++ b/mdadm.h
2c1b57
@@ -1477,6 +1477,7 @@ extern int add_disk(int mdfd, struct supertype *st,
2c1b57
 extern int remove_disk(int mdfd, struct supertype *st,
2c1b57
 		       struct mdinfo *sra, struct mdinfo *info);
2c1b57
 extern int hot_remove_disk(int mdfd, unsigned long dev);
2c1b57
+extern int sys_hot_remove_disk(int statefd);
2c1b57
 extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
2c1b57
 unsigned long long min_recovery_start(struct mdinfo *array);
2c1b57
 
2c1b57
diff --git a/util.c b/util.c
2c1b57
index d09a7e2..b718531 100644
2c1b57
--- a/util.c
2c1b57
+++ b/util.c
2c1b57
@@ -1813,6 +1813,18 @@ int hot_remove_disk(int mdfd, unsigned long dev)
2c1b57
 	return ret;
2c1b57
 }
2c1b57
 
2c1b57
+int sys_hot_remove_disk(int statefd)
2c1b57
+{
2c1b57
+	int cnt = 5;
2c1b57
+	int ret;
2c1b57
+
2c1b57
+	while ((ret = write(statefd, "remove", 6)) == -1 &&
2c1b57
+	       errno == EBUSY &&
2c1b57
+	       cnt-- > 0)
2c1b57
+		usleep(10000);
2c1b57
+	return ret == 6 ? 0 : -1;
2c1b57
+}
2c1b57
+
2c1b57
 int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
2c1b57
 {
2c1b57
 	/* Initialise kernel's knowledge of array.
2c1b57
-- 
2c1b57
2.7.4
2c1b57