Blame SOURCES/0045-mdadm-Replace-obsolete-usleep-with-nanosleep.patch

b33395
From 239b3cc0b5da87e966746533b1873c439db54b16 Mon Sep 17 00:00:00 2001
b33395
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
b33395
Date: Fri, 12 Aug 2022 16:36:02 +0200
2ad819
Subject: [PATCH 45/83] mdadm: Replace obsolete usleep with nanosleep
b33395
b33395
According to POSIX.1-2001, usleep is considered obsolete.
b33395
Replace it with a wrapper that uses nanosleep, as recommended in man.
b33395
Add handy macros for conversions between msec, usec and nsec.
b33395
b33395
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
b33395
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
b33395
---
b33395
 Assemble.c    |  2 +-
b33395
 Grow.c        |  4 ++--
b33395
 Manage.c      | 10 +++++-----
b33395
 managemon.c   |  8 ++++----
b33395
 mdadm.h       |  4 ++++
b33395
 mdmon.c       |  4 ++--
b33395
 super-intel.c |  6 +++---
b33395
 util.c        | 42 +++++++++++++++++++++++++++++++++---------
b33395
 8 files changed, 54 insertions(+), 26 deletions(-)
b33395
b33395
diff --git a/Assemble.c b/Assemble.c
b33395
index 6df6bfbc..be2160b4 100644
b33395
--- a/Assemble.c
b33395
+++ b/Assemble.c
b33395
@@ -1947,7 +1947,7 @@ out:
b33395
 						break;
b33395
 					close(mdfd);
b33395
 				}
b33395
-				usleep(usecs);
b33395
+				sleep_for(0, USEC_TO_NSEC(usecs), true);
b33395
 				usecs <<= 1;
b33395
 			}
b33395
 		}
b33395
diff --git a/Grow.c b/Grow.c
b33395
index 97f22c75..5780635a 100644
b33395
--- a/Grow.c
b33395
+++ b/Grow.c
b33395
@@ -954,7 +954,7 @@ int start_reshape(struct mdinfo *sra, int already_running,
b33395
 			err = sysfs_set_str(sra, NULL, "sync_action",
b33395
 					    "reshape");
b33395
 			if (err)
b33395
-				sleep(1);
b33395
+				sleep_for(1, 0, true);
b33395
 		} while (err && errno == EBUSY && cnt-- > 0);
b33395
 	}
b33395
 	return err;
b33395
@@ -5058,7 +5058,7 @@ int Grow_continue_command(char *devname, int fd,
b33395
 			}
b33395
 			st->ss->getinfo_super(st, content, NULL);
b33395
 			if (!content->reshape_active)
b33395
-				sleep(3);
b33395
+				sleep_for(3, 0, true);
b33395
 			else
b33395
 				break;
b33395
 		} while (cnt-- > 0);
b33395
diff --git a/Manage.c b/Manage.c
b33395
index e5e6abe4..a142f8bd 100644
b33395
--- a/Manage.c
b33395
+++ b/Manage.c
b33395
@@ -244,7 +244,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
b33395
 					    "array_state",
b33395
 					    "inactive")) < 0 &&
b33395
 		       errno == EBUSY) {
b33395
-			usleep(200000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(200), true);
b33395
 			count--;
b33395
 		}
b33395
 		if (err) {
b33395
@@ -328,7 +328,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
b33395
 		       sysfs_get_ll(mdi, NULL, "sync_max", &old_sync_max) == 0) {
b33395
 			/* must be in the critical section - wait a bit */
b33395
 			delay -= 1;
b33395
-			usleep(100000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(100), true);
b33395
 		}
b33395
 
b33395
 		if (sysfs_set_str(mdi, NULL, "sync_action", "frozen") != 0)
b33395
@@ -405,7 +405,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
b33395
 				 * quite started yet.  Wait a bit and
b33395
 				 * check  'sync_action' to see.
b33395
 				 */
b33395
-				usleep(10000);
b33395
+				sleep_for(0, MSEC_TO_NSEC(10), true);
b33395
 				sysfs_get_str(mdi, NULL, "sync_action", buf, sizeof(buf));
b33395
 				if (strncmp(buf, "reshape", 7) != 0)
b33395
 					break;
b33395
@@ -447,7 +447,7 @@ done:
b33395
 	count = 25; err = 0;
b33395
 	while (count && fd >= 0 &&
b33395
 	       (err = ioctl(fd, STOP_ARRAY, NULL)) < 0 && errno == EBUSY) {
b33395
-		usleep(200000);
b33395
+		sleep_for(0, MSEC_TO_NSEC(200), true);
b33395
 		count --;
b33395
 	}
b33395
 	if (fd >= 0 && err) {
b33395
@@ -1105,7 +1105,7 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
b33395
 				ret = sysfs_unique_holder(devnm, rdev);
b33395
 				if (ret < 2)
b33395
 					break;
b33395
-				usleep(100 * 1000);	/* 100ms */
b33395
+				sleep_for(0, MSEC_TO_NSEC(100), true);
b33395
 			} while (--count > 0);
b33395
 
b33395
 			if (ret == 0) {
b33395
diff --git a/managemon.c b/managemon.c
b33395
index 0e9bdf00..a7bfa8f6 100644
b33395
--- a/managemon.c
b33395
+++ b/managemon.c
b33395
@@ -207,7 +207,7 @@ static void replace_array(struct supertype *container,
b33395
 	remove_old();
b33395
 	while (pending_discard) {
b33395
 		while (discard_this == NULL)
b33395
-			sleep(1);
b33395
+			sleep_for(1, 0, true);
b33395
 		remove_old();
b33395
 	}
b33395
 	pending_discard = old;
b33395
@@ -568,7 +568,7 @@ static void manage_member(struct mdstat_ent *mdstat,
b33395
 		updates = NULL;
b33395
 		while (update_queue_pending || update_queue) {
b33395
 			check_update_queue(container);
b33395
-			usleep(15*1000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(15), true);
b33395
 		}
b33395
 		replace_array(container, a, newa);
b33395
 		if (sysfs_set_str(&a->info, NULL,
b33395
@@ -822,7 +822,7 @@ static void handle_message(struct supertype *container, struct metadata_update *
b33395
 	if (msg->len <= 0)
b33395
 		while (update_queue_pending || update_queue) {
b33395
 			check_update_queue(container);
b33395
-			usleep(15*1000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(15), true);
b33395
 		}
b33395
 
b33395
 	if (msg->len == 0) { /* ping_monitor */
b33395
@@ -836,7 +836,7 @@ static void handle_message(struct supertype *container, struct metadata_update *
b33395
 		wakeup_monitor();
b33395
 
b33395
 		while (monitor_loop_cnt - cnt < 0)
b33395
-			usleep(10 * 1000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(10), true);
b33395
 	} else if (msg->len == -1) { /* ping_manager */
b33395
 		struct mdstat_ent *mdstat = mdstat_read(1, 0);
b33395
 
b33395
diff --git a/mdadm.h b/mdadm.h
b33395
index 163f4a49..add9c0b6 100644
b33395
--- a/mdadm.h
b33395
+++ b/mdadm.h
b33395
@@ -1720,6 +1720,10 @@ extern int cluster_get_dlmlock(void);
b33395
 extern int cluster_release_dlmlock(void);
b33395
 extern void set_dlm_hooks(void);
b33395
 
b33395
+#define MSEC_TO_NSEC(msec) ((msec) * 1000000)
b33395
+#define USEC_TO_NSEC(usec) ((usec) * 1000)
b33395
+extern void sleep_for(unsigned int sec, long nsec, bool wake_after_interrupt);
b33395
+
b33395
 #define _ROUND_UP(val, base)	(((val) + (base) - 1) & ~(base - 1))
b33395
 #define ROUND_UP(val, base)	_ROUND_UP(val, (typeof(val))(base))
b33395
 #define ROUND_UP_PTR(ptr, base)	((typeof(ptr)) \
b33395
diff --git a/mdmon.c b/mdmon.c
b33395
index c057da63..e9d035eb 100644
b33395
--- a/mdmon.c
b33395
+++ b/mdmon.c
b33395
@@ -99,7 +99,7 @@ static int clone_monitor(struct supertype *container)
b33395
 	if (rc)
b33395
 		return rc;
b33395
 	while (mon_tid == -1)
b33395
-		usleep(10);
b33395
+		sleep_for(0, USEC_TO_NSEC(10), true);
b33395
 	pthread_attr_destroy(&attr);
b33395
 
b33395
 	mgr_tid = syscall(SYS_gettid);
b33395
@@ -209,7 +209,7 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock)
b33395
 		rv = kill(pid, SIGUSR1);
b33395
 		if (rv < 0)
b33395
 			break;
b33395
-		usleep(200000);
b33395
+		sleep_for(0, MSEC_TO_NSEC(200), true);
b33395
 	}
b33395
 }
b33395
 
b33395
diff --git a/super-intel.c b/super-intel.c
b33395
index 4ddfcf94..4d82af3d 100644
b33395
--- a/super-intel.c
b33395
+++ b/super-intel.c
b33395
@@ -5275,7 +5275,7 @@ static int get_super_block(struct intel_super **super_list, char *devnm, char *d
b33395
 	/* retry the load if we might have raced against mdmon */
b33395
 	if (err == 3 && devnm && mdmon_running(devnm))
b33395
 		for (retry = 0; retry < 3; retry++) {
b33395
-			usleep(3000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(3), true);
b33395
 			err = load_and_parse_mpb(dfd, s, NULL, keep_fd);
b33395
 			if (err != 3)
b33395
 				break;
b33395
@@ -5377,7 +5377,7 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
b33395
 
b33395
 		if (mdstat && mdmon_running(mdstat->devnm) && getpid() != mdmon_pid(mdstat->devnm)) {
b33395
 			for (retry = 0; retry < 3; retry++) {
b33395
-				usleep(3000);
b33395
+				sleep_for(0, MSEC_TO_NSEC(3), true);
b33395
 				rv = load_and_parse_mpb(fd, super, devname, 0);
b33395
 				if (rv != 3)
b33395
 					break;
b33395
@@ -12084,7 +12084,7 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
b33395
 				close(fd);
b33395
 				return 1;
b33395
 			}
b33395
-			usleep(30000);
b33395
+			sleep_for(0, MSEC_TO_NSEC(30), true);
b33395
 		} else
b33395
 			break;
b33395
 	} while (retry--);
b33395
diff --git a/util.c b/util.c
b33395
index 38f0420e..ca48d976 100644
b33395
--- a/util.c
b33395
+++ b/util.c
b33395
@@ -166,7 +166,7 @@ retry:
b33395
 		pr_err("error %d when get PW mode on lock %s\n", errno, str);
b33395
 		/* let's try several times if EAGAIN happened */
b33395
 		if (dlm_lock_res->lksb.sb_status == EAGAIN && retry_count < 10) {
b33395
-			sleep(10);
b33395
+			sleep_for(10, 0, true);
b33395
 			retry_count++;
b33395
 			goto retry;
b33395
 		}
b33395
@@ -1085,7 +1085,7 @@ int open_dev_excl(char *devnm)
b33395
 	int i;
b33395
 	int flags = O_RDWR;
b33395
 	dev_t devid = devnm2devid(devnm);
b33395
-	long delay = 1000;
b33395
+	unsigned int delay = 1; // miliseconds
b33395
 
b33395
 	sprintf(buf, "%d:%d", major(devid), minor(devid));
b33395
 	for (i = 0; i < 25; i++) {
b33395
@@ -1098,8 +1098,8 @@ int open_dev_excl(char *devnm)
b33395
 		}
b33395
 		if (errno != EBUSY)
b33395
 			return fd;
b33395
-		usleep(delay);
b33395
-		if (delay < 200000)
b33395
+		sleep_for(0, MSEC_TO_NSEC(delay), true);
b33395
+		if (delay < 200)
b33395
 			delay *= 2;
b33395
 	}
b33395
 	return -1;
b33395
@@ -1123,7 +1123,7 @@ void wait_for(char *dev, int fd)
b33395
 {
b33395
 	int i;
b33395
 	struct stat stb_want;
b33395
-	long delay = 1000;
b33395
+	unsigned int delay = 1; // miliseconds
b33395
 
b33395
 	if (fstat(fd, &stb_want) != 0 ||
b33395
 	    (stb_want.st_mode & S_IFMT) != S_IFBLK)
b33395
@@ -1135,8 +1135,8 @@ void wait_for(char *dev, int fd)
b33395
 		    (stb.st_mode & S_IFMT) == S_IFBLK &&
b33395
 		    (stb.st_rdev == stb_want.st_rdev))
b33395
 			return;
b33395
-		usleep(delay);
b33395
-		if (delay < 200000)
b33395
+		sleep_for(0, MSEC_TO_NSEC(delay), true);
b33395
+		if (delay < 200)
b33395
 			delay *= 2;
b33395
 	}
b33395
 	if (i == 25)
b33395
@@ -1821,7 +1821,7 @@ int hot_remove_disk(int mdfd, unsigned long dev, int force)
b33395
 	while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
b33395
 	       errno == EBUSY &&
b33395
 	       cnt-- > 0)
b33395
-		usleep(10000);
b33395
+		sleep_for(0, MSEC_TO_NSEC(10), true);
b33395
 
b33395
 	return ret;
b33395
 }
b33395
@@ -1834,7 +1834,7 @@ int sys_hot_remove_disk(int statefd, int force)
b33395
 	while ((ret = write(statefd, "remove", 6)) == -1 &&
b33395
 	       errno == EBUSY &&
b33395
 	       cnt-- > 0)
b33395
-		usleep(10000);
b33395
+		sleep_for(0, MSEC_TO_NSEC(10), true);
b33395
 	return ret == 6 ? 0 : -1;
b33395
 }
b33395
 
b33395
@@ -2375,3 +2375,27 @@ out:
b33395
 	close(fd_zero);
b33395
 	return ret;
b33395
 }
b33395
+
b33395
+/**
b33395
+ * sleep_for() - Sleeps for specified time.
b33395
+ * @sec: Seconds to sleep for.
b33395
+ * @nsec: Nanoseconds to sleep for, has to be less than one second.
b33395
+ * @wake_after_interrupt: If set, wake up if interrupted.
b33395
+ *
b33395
+ * Function immediately returns if error different than EINTR occurs.
b33395
+ */
b33395
+void sleep_for(unsigned int sec, long nsec, bool wake_after_interrupt)
b33395
+{
b33395
+	struct timespec delay = {.tv_sec = sec, .tv_nsec = nsec};
b33395
+
b33395
+	assert(nsec < MSEC_TO_NSEC(1000));
b33395
+
b33395
+	do {
b33395
+		errno = 0;
b33395
+		nanosleep(&delay, &delay);
b33395
+		if (errno != 0 && errno != EINTR) {
b33395
+			pr_err("Error sleeping for %us %ldns: %s\n", sec, nsec, strerror(errno));
b33395
+			return;
b33395
+		}
b33395
+	} while (!wake_after_interrupt && errno == EINTR);
b33395
+}
b33395
-- 
2ad819
2.38.1
b33395