File 1002-bnc808647-retry-failed-removes.patch of Package mdadm.7533

---
 Manage.c |   19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

Index: mdadm-3.3.4/Manage.c
===================================================================
--- mdadm-3.3.4.orig/Manage.c
+++ mdadm-3.3.4/Manage.c
@@ -1086,7 +1086,8 @@ int Manage_add(int fd, int tfd, struct m
 }
 
 int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
-		  int sysfd, unsigned long rdev, int verbose, char *devname)
+		  int sysfd, unsigned long rdev, int force, int verbose,
+		  char *devname)
 {
 	int lfd = -1;
 	int err;
@@ -1144,7 +1145,9 @@ int Manage_remove(struct supertype *tst,
 		else
 			err = 0;
 	} else {
-		err = ioctl(fd, HOT_REMOVE_DISK, rdev);
+		do {
+			err = ioctl(fd, HOT_REMOVE_DISK, rdev);
+		} while (err && errno == EBUSY && force && usleep(50000) == 0);
 		if (err && errno == ENODEV) {
 			/* Old kernels rejected this if no personality
 			 * is registered */
@@ -1566,9 +1569,13 @@ int Manage_subdevs(char *devname, int fd
 				}
 			}
 
-			if (dv->disposition == 'F')
+			if (dv->disposition == 'F') {
 				/* Need to remove first */
-				ioctl(fd, HOT_REMOVE_DISK, rdev);
+				int err;
+				do {
+					err = ioctl(fd, HOT_REMOVE_DISK, rdev);
+				} while (err && (errno == EBUSY) && force && (usleep(50000) == 0));
+			}
 			/* Make sure it isn't in use (in 2.6 or later) */
 			tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
 			if (tfd >= 0) {
@@ -1610,7 +1617,7 @@ int Manage_subdevs(char *devname, int fd
 				rv = -1;
 			} else
 				rv = Manage_remove(tst, fd, dv, sysfd,
-						   rdev, verbose,
+						   rdev, force, verbose,
 						   devname);
 			if (sysfd >= 0)
 				close(sysfd);
openSUSE Build Service is sponsored by