pkgsrc/benchmarks/bonnie/patches/patch-ac
drochner 1c7ab8c04d The patch in PR pkg/21421 had a bug: The memory allocated for "Chunk"
was too short. This made the program die from EFAULT randomly.
Found by Konrad Schroder.
Apply his fix that and bump PKGREVISION.
2006-04-12 10:55:49 +00:00

113 lines
3.5 KiB
Text

$NetBSD: patch-ac,v 1.3 2006/04/12 10:55:49 drochner Exp $
--- bonnie.c.orig Wed Aug 28 12:23:49 1996
+++ bonnie.c Tue Apr 29 23:22:39 2003
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <stdio.h>
+#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
@@ -49,7 +50,8 @@
#define Seeks (4000)
#define UpdateSeek (10)
#define SeekProcCount (3)
-#define Chunk (16384)
+
+unsigned int Chunk = 16384;
/* labels for the tests, used as an array index */
typedef enum
@@ -91,7 +93,7 @@
int argc,
char * argv[])
{
- int buf[Chunk / IntSize];
+ int *buf;
int bufindex;
int chars[256];
int child;
@@ -122,6 +124,8 @@
for (next = 1; next < argc; next++)
if (strcmp(argv[next], "-d") == 0)
dir = argv[++next];
+ else if (strcmp(argv[next], "-c") == 0)
+ Chunk = atoi(argv[++next]);
else if (strcmp(argv[next], "-s") == 0)
size = atol(argv[++next]);
else if (strcmp(argv[next], "-m") == 0)
@@ -146,7 +150,12 @@
/* size is in meg, rounded down to multiple of Chunk */
size *= (1024 * 1024);
size = Chunk * (size / Chunk);
- fprintf(stderr, "File '%s', size: %ld\n", name, size);
+ fprintf(stderr, "File '%s', size: %qu\n", name, (u_quad_t) size);
+
+ if (!(buf = (int *) malloc(Chunk))) {
+ fprintf(stderr, "Error allocating buffer memory: %s\n", strerror(errno));
+ exit(1);
+ }
/* Fill up a file, writing it a char at a time with the stdio putc() call */
fprintf(stderr, "Writing with putc()...");
@@ -288,6 +297,7 @@
{ /* child process */
/* set up and wait for the go-ahead */
+ close(0); /* From FreeBSD */
close(seek_feedback[0]);
close(seek_control[1]);
newfile(name, &fd, &stream, 0);
@@ -303,7 +313,13 @@
/* loop until we read a 0 ticket back from our parent */
while(seek_tickets[0])
{ /* until Mom says stop */
- doseek((long) (random() % (size / Chunk)), fd,
+ off_t seekto;
+
+ if (size < ((off_t)1 << 32)) /* From FreeBSD */
+ seekto = random() % (size / Chunk);
+ else
+ seekto = ((off_t)random() << 32 + random()) % (size / Chunk);
+ doseek(seekto, fd,
((lseek_count++ % UpdateSeek) == 0));
if (read(seek_control[0], seek_tickets, 1) != 1)
io_error("read ticket");
@@ -413,7 +429,7 @@
printf("K/sec %%CPU K/sec %%CPU K/sec %%CPU K/sec %%CPU K/sec ");
printf("%%CPU /sec %%CPU\n");
- printf("%-8.8s %4d ", machine, size / (1024 * 1024));
+ printf("%-8.8s %4qu ", machine, (u_quad_t) size / (1024 * 1024));
printf("%5d %4.1f %5d %4.1f %5d %4.1f ",
(int) (((double) size) / (delta[(int) Putc][Elapsed] * 1024.0)),
delta[(int) Putc][CPU] / delta[(int) Putc][Elapsed] * 100.0,
@@ -458,7 +474,7 @@
usage()
{
fprintf(stderr,
- "usage: Bonnie [-d scratch-dir] [-s size-in-Mb] [-html] [-m machine-label]\n");
+ "usage: bonnie [-c chunk-size] [-d scratch-dir] [-s size-in-Mb] [-html] [-m machine-label]\n");
exit(1);
}
@@ -529,7 +545,7 @@
{
char buf[Chunk];
- sprintf(buf, "Bonnie: drastic I/O error (%s)", message);
+ sprintf(buf, "\nBonnie: drastic I/O error (%s)", message);
perror(buf);
exit(1);
}
@@ -568,7 +584,7 @@
/* touch a word */
buf[((int) random() % (size/IntSize - 2)) + 1]--;
- if (lseek(fd, (long) probe, 0) != probe)
+ if (lseek(fd, probe, 0) != probe)
io_error("lseek in doseek update");
if (write(fd, (char *) buf, size) == -1)
io_error("write in doseek");