Blame SOURCES/bz2109159-storage_mon-4-fix-possible-false-negatives.patch

98dd5d
From 0bb52cf9985bda47e13940761b3d8e2eaddf377c Mon Sep 17 00:00:00 2001
98dd5d
From: Kazunori INOUE <kazunori_inoue@newson.co.jp>
98dd5d
Date: Wed, 10 Aug 2022 17:35:54 +0900
98dd5d
Subject: [PATCH 1/4] storage_mon: Use the O_DIRECT flag in open() to eliminate
98dd5d
 cache effects
98dd5d
98dd5d
---
98dd5d
 tools/Makefile.am   |  1 +
98dd5d
 tools/storage_mon.c | 82 +++++++++++++++++++++++++++++++++------------
98dd5d
 2 files changed, 61 insertions(+), 22 deletions(-)
98dd5d
98dd5d
diff --git a/tools/Makefile.am b/tools/Makefile.am
98dd5d
index 1309223b4..08323fee3 100644
98dd5d
--- a/tools/Makefile.am
98dd5d
+++ b/tools/Makefile.am
98dd5d
@@ -74,6 +74,7 @@ sfex_stat_LDADD		= $(GLIBLIB) -lplumb -lplumbgpl
98dd5d
 findif_SOURCES		= findif.c
98dd5d
 
98dd5d
 storage_mon_SOURCES	= storage_mon.c
98dd5d
+storage_mon_CFLAGS	= -D_GNU_SOURCE
98dd5d
 
98dd5d
 if BUILD_TICKLE
98dd5d
 halib_PROGRAMS		+= tickle_tcp
98dd5d
diff --git a/tools/storage_mon.c b/tools/storage_mon.c
98dd5d
index 930ead41c..ba87492fc 100644
98dd5d
--- a/tools/storage_mon.c
98dd5d
+++ b/tools/storage_mon.c
98dd5d
@@ -31,23 +31,27 @@ static void usage(char *name, FILE *f)
98dd5d
 	fprintf(f, "      --help           print this message\n");
98dd5d
 }
98dd5d
 
98dd5d
-/* Check one device */
98dd5d
-static void *test_device(const char *device, int verbose, int inject_error_percent)
98dd5d
+static int open_device(const char *device, int verbose)
98dd5d
 {
98dd5d
-	uint64_t devsize;
98dd5d
 	int device_fd;
98dd5d
 	int res;
98dd5d
+	uint64_t devsize;
98dd5d
 	off_t seek_spot;
98dd5d
-	char buffer[512];
98dd5d
 
98dd5d
-	if (verbose) {
98dd5d
-		printf("Testing device %s\n", device);
98dd5d
+#if defined(__linux__) || defined(__FreeBSD__)
98dd5d
+	device_fd = open(device, O_RDONLY|O_DIRECT);
98dd5d
+	if (device_fd >= 0) {
98dd5d
+		return device_fd;
98dd5d
+	} else if (errno != EINVAL) {
98dd5d
+		fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
+		return -1;
98dd5d
 	}
98dd5d
+#endif
98dd5d
 
98dd5d
 	device_fd = open(device, O_RDONLY);
98dd5d
 	if (device_fd < 0) {
98dd5d
 		fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
-		exit(-1);
98dd5d
+		return -1;
98dd5d
 	}
98dd5d
 #ifdef __FreeBSD__
98dd5d
 	res = ioctl(device_fd, DIOCGMEDIASIZE, &devsize);
98dd5d
@@ -57,11 +61,12 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 	if (res != 0) {
98dd5d
 		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
 		close(device_fd);
98dd5d
-		exit(-1);
98dd5d
+		return -1;
98dd5d
 	}
98dd5d
 	if (verbose) {
98dd5d
 		fprintf(stderr, "%s: size=%zu\n", device, devsize);
98dd5d
 	}
98dd5d
+
98dd5d
 	/* Don't fret about real randomness */
98dd5d
 	srand(time(NULL) + getpid());
98dd5d
 	/* Pick a random place on the device - sector aligned */
98dd5d
@@ -70,35 +75,64 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 	if (res < 0) {
98dd5d
 		fprintf(stderr, "Failed to seek %s: %s\n", device, strerror(errno));
98dd5d
 		close(device_fd);
98dd5d
-		exit(-1);
98dd5d
+		return -1;
98dd5d
 	}
98dd5d
-
98dd5d
 	if (verbose) {
98dd5d
 		printf("%s: reading from pos %ld\n", device, seek_spot);
98dd5d
 	}
98dd5d
+	return device_fd;
98dd5d
+}
98dd5d
+
98dd5d
+/* Check one device */
98dd5d
+static void *test_device(const char *device, int verbose, int inject_error_percent)
98dd5d
+{
98dd5d
+	int device_fd;
98dd5d
+	int sec_size = 0;
98dd5d
+	int res;
98dd5d
+	void *buffer;
98dd5d
+
98dd5d
+	if (verbose) {
98dd5d
+		printf("Testing device %s\n", device);
98dd5d
+	}
98dd5d
+
98dd5d
+	device_fd = open_device(device, verbose);
98dd5d
+	if (device_fd < 0) {
98dd5d
+		exit(-1);
98dd5d
+	}
98dd5d
+
98dd5d
+	ioctl(device_fd, BLKSSZGET, &sec_size);
98dd5d
+	if (sec_size == 0) {
98dd5d
+		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
+		goto error;
98dd5d
+	}
98dd5d
 
98dd5d
-	res = read(device_fd, buffer, sizeof(buffer));
98dd5d
+	if (posix_memalign(&buffer, sysconf(_SC_PAGESIZE), sec_size) != 0) {
98dd5d
+		fprintf(stderr, "Failed to allocate aligned memory: %s\n", strerror(errno));
98dd5d
+		goto error;
98dd5d
+	}
98dd5d
+
98dd5d
+	res = read(device_fd, buffer, sec_size);
98dd5d
+	free(buffer);
98dd5d
 	if (res < 0) {
98dd5d
 		fprintf(stderr, "Failed to read %s: %s\n", device, strerror(errno));
98dd5d
-		close(device_fd);
98dd5d
-		exit(-1);
98dd5d
+		goto error;
98dd5d
 	}
98dd5d
-	if (res < (int)sizeof(buffer)) {
98dd5d
-		fprintf(stderr, "Failed to read %ld bytes from %s, got %d\n", sizeof(buffer), device, res);
98dd5d
-		close(device_fd);
98dd5d
-		exit(-1);
98dd5d
+	if (res < sec_size) {
98dd5d
+		fprintf(stderr, "Failed to read %d bytes from %s, got %d\n", sec_size, device, res);
98dd5d
+		goto error;
98dd5d
 	}
98dd5d
 
98dd5d
 	/* Fake an error */
98dd5d
-	if (inject_error_percent && ((rand() % 100) < inject_error_percent)) {
98dd5d
-		fprintf(stderr, "People, please fasten your seatbelts, injecting errors!\n");
98dd5d
-		close(device_fd);
98dd5d
-		exit(-1);
98dd5d
+	if (inject_error_percent) {
98dd5d
+		srand(time(NULL) + getpid());
98dd5d
+		if ((rand() % 100) < inject_error_percent) {
98dd5d
+			fprintf(stderr, "People, please fasten your seatbelts, injecting errors!\n");
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
 	}
98dd5d
 	res = close(device_fd);
98dd5d
 	if (res != 0) {
98dd5d
 		fprintf(stderr, "Failed to close %s: %s\n", device, strerror(errno));
98dd5d
-		close(device_fd);
98dd5d
 		exit(-1);
98dd5d
 	}
98dd5d
 
98dd5d
@@ -106,6 +140,10 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 		printf("%s: done\n", device);
98dd5d
 	}
98dd5d
 	exit(0);
98dd5d
+
98dd5d
+error:
98dd5d
+	close(device_fd);
98dd5d
+	exit(-1);
98dd5d
 }
98dd5d
 
98dd5d
 int main(int argc, char *argv[])
98dd5d
98dd5d
From ce4e632f29ed6b86b82a959eac5844655baed153 Mon Sep 17 00:00:00 2001
98dd5d
From: Kazunori INOUE <kazunori_inoue@newson.co.jp>
98dd5d
Date: Mon, 15 Aug 2022 19:17:21 +0900
98dd5d
Subject: [PATCH 2/4] storage_mon: fix build-related issues
98dd5d
98dd5d
---
98dd5d
 tools/storage_mon.c | 6 ++++--
98dd5d
 1 file changed, 4 insertions(+), 2 deletions(-)
98dd5d
98dd5d
diff --git a/tools/storage_mon.c b/tools/storage_mon.c
98dd5d
index ba87492fc..e34d1975a 100644
98dd5d
--- a/tools/storage_mon.c
98dd5d
+++ b/tools/storage_mon.c
98dd5d
@@ -38,7 +38,6 @@ static int open_device(const char *device, int verbose)
98dd5d
 	uint64_t devsize;
98dd5d
 	off_t seek_spot;
98dd5d
 
98dd5d
-#if defined(__linux__) || defined(__FreeBSD__)
98dd5d
 	device_fd = open(device, O_RDONLY|O_DIRECT);
98dd5d
 	if (device_fd >= 0) {
98dd5d
 		return device_fd;
98dd5d
@@ -46,7 +45,6 @@ static int open_device(const char *device, int verbose)
98dd5d
 		fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
 		return -1;
98dd5d
 	}
98dd5d
-#endif
98dd5d
 
98dd5d
 	device_fd = open(device, O_RDONLY);
98dd5d
 	if (device_fd < 0) {
98dd5d
@@ -100,7 +98,11 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 		exit(-1);
98dd5d
 	}
98dd5d
 
98dd5d
+#ifdef __FreeBSD__
98dd5d
+	ioctl(device_fd, DIOCGSECTORSIZE, &sec_size);
98dd5d
+#else
98dd5d
 	ioctl(device_fd, BLKSSZGET, &sec_size);
98dd5d
+#endif
98dd5d
 	if (sec_size == 0) {
98dd5d
 		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
 		goto error;
98dd5d
98dd5d
From 7a0aaa0dfdebeab3fae9fe9ddc412c3d1f610273 Mon Sep 17 00:00:00 2001
98dd5d
From: Kazunori INOUE <kazunori_inoue@newson.co.jp>
98dd5d
Date: Wed, 24 Aug 2022 17:36:23 +0900
98dd5d
Subject: [PATCH 3/4] storage_mon: do random lseek even with O_DIRECT, etc
98dd5d
98dd5d
---
98dd5d
 tools/storage_mon.c | 118 ++++++++++++++++++++++----------------------
98dd5d
 1 file changed, 58 insertions(+), 60 deletions(-)
98dd5d
98dd5d
diff --git a/tools/storage_mon.c b/tools/storage_mon.c
98dd5d
index e34d1975a..0bdb48649 100644
98dd5d
--- a/tools/storage_mon.c
98dd5d
+++ b/tools/storage_mon.c
98dd5d
@@ -31,38 +31,43 @@ static void usage(char *name, FILE *f)
98dd5d
 	fprintf(f, "      --help           print this message\n");
98dd5d
 }
98dd5d
 
98dd5d
-static int open_device(const char *device, int verbose)
98dd5d
+/* Check one device */
98dd5d
+static void *test_device(const char *device, int verbose, int inject_error_percent)
98dd5d
 {
98dd5d
+	uint64_t devsize;
98dd5d
+	int flags = O_RDONLY | O_DIRECT;
98dd5d
 	int device_fd;
98dd5d
 	int res;
98dd5d
-	uint64_t devsize;
98dd5d
 	off_t seek_spot;
98dd5d
 
98dd5d
-	device_fd = open(device, O_RDONLY|O_DIRECT);
98dd5d
-	if (device_fd >= 0) {
98dd5d
-		return device_fd;
98dd5d
-	} else if (errno != EINVAL) {
98dd5d
-		fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
-		return -1;
98dd5d
+	if (verbose) {
98dd5d
+		printf("Testing device %s\n", device);
98dd5d
 	}
98dd5d
 
98dd5d
-	device_fd = open(device, O_RDONLY);
98dd5d
+	device_fd = open(device, flags);
98dd5d
 	if (device_fd < 0) {
98dd5d
-		fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
-		return -1;
98dd5d
+		if (errno != EINVAL) {
98dd5d
+			fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
+			exit(-1);
98dd5d
+		}
98dd5d
+		flags &= ~O_DIRECT;
98dd5d
+		device_fd = open(device, flags);
98dd5d
+		if (device_fd < 0) {
98dd5d
+			fprintf(stderr, "Failed to open %s: %s\n", device, strerror(errno));
98dd5d
+			exit(-1);
98dd5d
+		}
98dd5d
 	}
98dd5d
 #ifdef __FreeBSD__
98dd5d
 	res = ioctl(device_fd, DIOCGMEDIASIZE, &devsize);
98dd5d
 #else
98dd5d
 	res = ioctl(device_fd, BLKGETSIZE64, &devsize);
98dd5d
 #endif
98dd5d
-	if (res != 0) {
98dd5d
+	if (res < 0) {
98dd5d
 		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
-		close(device_fd);
98dd5d
-		return -1;
98dd5d
+		goto error;
98dd5d
 	}
98dd5d
 	if (verbose) {
98dd5d
-		fprintf(stderr, "%s: size=%zu\n", device, devsize);
98dd5d
+		printf("%s: opened %s O_DIRECT, size=%zu\n", device, (flags & O_DIRECT)?"with":"without", devsize);
98dd5d
 	}
98dd5d
 
98dd5d
 	/* Don't fret about real randomness */
98dd5d
@@ -72,65 +77,58 @@ static int open_device(const char *device, int verbose)
98dd5d
 	res = lseek(device_fd, seek_spot, SEEK_SET);
98dd5d
 	if (res < 0) {
98dd5d
 		fprintf(stderr, "Failed to seek %s: %s\n", device, strerror(errno));
98dd5d
-		close(device_fd);
98dd5d
-		return -1;
98dd5d
+		goto error;
98dd5d
 	}
98dd5d
 	if (verbose) {
98dd5d
 		printf("%s: reading from pos %ld\n", device, seek_spot);
98dd5d
 	}
98dd5d
-	return device_fd;
98dd5d
-}
98dd5d
-
98dd5d
-/* Check one device */
98dd5d
-static void *test_device(const char *device, int verbose, int inject_error_percent)
98dd5d
-{
98dd5d
-	int device_fd;
98dd5d
-	int sec_size = 0;
98dd5d
-	int res;
98dd5d
-	void *buffer;
98dd5d
-
98dd5d
-	if (verbose) {
98dd5d
-		printf("Testing device %s\n", device);
98dd5d
-	}
98dd5d
 
98dd5d
-	device_fd = open_device(device, verbose);
98dd5d
-	if (device_fd < 0) {
98dd5d
-		exit(-1);
98dd5d
-	}
98dd5d
+	if (flags & O_DIRECT) {
98dd5d
+		int sec_size = 0;
98dd5d
+		void *buffer;
98dd5d
 
98dd5d
 #ifdef __FreeBSD__
98dd5d
-	ioctl(device_fd, DIOCGSECTORSIZE, &sec_size);
98dd5d
+		res = ioctl(device_fd, DIOCGSECTORSIZE, &sec_size);
98dd5d
 #else
98dd5d
-	ioctl(device_fd, BLKSSZGET, &sec_size);
98dd5d
+		res = ioctl(device_fd, BLKSSZGET, &sec_size);
98dd5d
 #endif
98dd5d
-	if (sec_size == 0) {
98dd5d
-		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
-		goto error;
98dd5d
-	}
98dd5d
+		if (res < 0) {
98dd5d
+			fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
 
98dd5d
-	if (posix_memalign(&buffer, sysconf(_SC_PAGESIZE), sec_size) != 0) {
98dd5d
-		fprintf(stderr, "Failed to allocate aligned memory: %s\n", strerror(errno));
98dd5d
-		goto error;
98dd5d
-	}
98dd5d
+		if (posix_memalign(&buffer, sysconf(_SC_PAGESIZE), sec_size) != 0) {
98dd5d
+			fprintf(stderr, "Failed to allocate aligned memory: %s\n", strerror(errno));
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
+		res = read(device_fd, buffer, sec_size);
98dd5d
+		free(buffer);
98dd5d
+		if (res < 0) {
98dd5d
+			fprintf(stderr, "Failed to read %s: %s\n", device, strerror(errno));
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
+		if (res < sec_size) {
98dd5d
+			fprintf(stderr, "Failed to read %d bytes from %s, got %d\n", sec_size, device, res);
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
+	} else {
98dd5d
+		char buffer[512];
98dd5d
 
98dd5d
-	res = read(device_fd, buffer, sec_size);
98dd5d
-	free(buffer);
98dd5d
-	if (res < 0) {
98dd5d
-		fprintf(stderr, "Failed to read %s: %s\n", device, strerror(errno));
98dd5d
-		goto error;
98dd5d
-	}
98dd5d
-	if (res < sec_size) {
98dd5d
-		fprintf(stderr, "Failed to read %d bytes from %s, got %d\n", sec_size, device, res);
98dd5d
-		goto error;
98dd5d
+		res = read(device_fd, buffer, sizeof(buffer));
98dd5d
+		if (res < 0) {
98dd5d
+			fprintf(stderr, "Failed to read %s: %s\n", device, strerror(errno));
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
+		if (res < (int)sizeof(buffer)) {
98dd5d
+			fprintf(stderr, "Failed to read %ld bytes from %s, got %d\n", sizeof(buffer), device, res);
98dd5d
+			goto error;
98dd5d
+		}
98dd5d
 	}
98dd5d
 
98dd5d
 	/* Fake an error */
98dd5d
-	if (inject_error_percent) {
98dd5d
-		srand(time(NULL) + getpid());
98dd5d
-		if ((rand() % 100) < inject_error_percent) {
98dd5d
-			fprintf(stderr, "People, please fasten your seatbelts, injecting errors!\n");
98dd5d
-			goto error;
98dd5d
-		}
98dd5d
+	if (inject_error_percent && ((rand() % 100) < inject_error_percent)) {
98dd5d
+		fprintf(stderr, "People, please fasten your seatbelts, injecting errors!\n");
98dd5d
+		goto error;
98dd5d
 	}
98dd5d
 	res = close(device_fd);
98dd5d
 	if (res != 0) {
98dd5d
98dd5d
From db97e055a17526cec056c595844a9d8851e3ee19 Mon Sep 17 00:00:00 2001
98dd5d
From: Kazunori INOUE <kazunori_inoue@newson.co.jp>
98dd5d
Date: Thu, 25 Aug 2022 16:03:46 +0900
98dd5d
Subject: [PATCH 4/4] storage_mon: improve error messages when ioctl() fails
98dd5d
98dd5d
---
98dd5d
 tools/storage_mon.c | 4 ++--
98dd5d
 1 file changed, 2 insertions(+), 2 deletions(-)
98dd5d
98dd5d
diff --git a/tools/storage_mon.c b/tools/storage_mon.c
98dd5d
index 0bdb48649..f829c5081 100644
98dd5d
--- a/tools/storage_mon.c
98dd5d
+++ b/tools/storage_mon.c
98dd5d
@@ -63,7 +63,7 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 	res = ioctl(device_fd, BLKGETSIZE64, &devsize);
98dd5d
 #endif
98dd5d
 	if (res < 0) {
98dd5d
-		fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
+		fprintf(stderr, "Failed to get device size for %s: %s\n", device, strerror(errno));
98dd5d
 		goto error;
98dd5d
 	}
98dd5d
 	if (verbose) {
98dd5d
@@ -93,7 +93,7 @@ static void *test_device(const char *device, int verbose, int inject_error_perce
98dd5d
 		res = ioctl(device_fd, BLKSSZGET, &sec_size);
98dd5d
 #endif
98dd5d
 		if (res < 0) {
98dd5d
-			fprintf(stderr, "Failed to stat %s: %s\n", device, strerror(errno));
98dd5d
+			fprintf(stderr, "Failed to get block device sector size for %s: %s\n", device, strerror(errno));
98dd5d
 			goto error;
98dd5d
 		}
98dd5d