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

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