--- rawio.c.orig Mon Nov 27 04:28:19 2000
+++ rawio.c Tue Jun 20 23:03:20 2006
@@ -58,6 +58,9 @@
#endif
#ifdef BSD4_4
#include <sys/disklabel.h>
+#if __FreeBSD__ >= 5
+#include <sys/disk.h>
+#endif
#endif
#include "randoms.h"
@@ -99,6 +102,7 @@
char *buf; /* and what we're using, for alignment */
int file;
size_t length;
+u_int sectorsize;
int count;
enum operation
@@ -331,13 +335,7 @@
maxchunk = (size_t) atoi (arg);
if (maxchunk < (size_t) 512)
{
- if (maxchunk <= (size_t) 0)
- {
- fprintf (stderr, "I/O transfer max must be at least 1 sector\n");
- usage ();
- }
- else
- maxchunk *= (size_t) 512;
+ maxchunk *= (size_t) 512;
}
if (maxchunk > (size_t) MAXPHYS)
{
@@ -423,7 +421,7 @@
printf ("No arg to n flag\n");
break;
}
- filesize = sizespec (argv [++i]);
+ filesize = sizespec (arg);
break;
case 'S':
@@ -500,11 +498,6 @@
buf = (char *) (((int) &physbuf [MAXPHYS]) & ~ (alignment - 1)); /* where to put the aligned buffer */
if (op == 0) /* no ops specified, */
op = RandomRead | SequentialRead; /* default to the read tests */
- if (maxchunk & 0x1ff)
- {
- fprintf (stderr, "Invalid transfer size, must be multiple of 512: %d\n", maxchunk);
- usage ();
- }
if (device == NULL)
{
fprintf (stderr, "No file name specified\n");
@@ -565,6 +558,27 @@
fprintf (stderr, "No file size specified\n");
usage ();
}
+#ifndef DIOCGSECTORSIZE
+ sectorsize = DEV_BSIZE;
+#else
+ if (ioctl (file, DIOCGSECTORSIZE, §orsize) == -1) /* failed to find native sector size */
+ {
+ if (verbose)
+ fprintf (stderr, "Can't get sector size of %s: %s\n", device, strerror (errno));
+ sectorsize = DEV_BSIZE;
+ }
+
+#endif
+ if (maxchunk <= sectorsize)
+ {
+ fprintf (stderr, "I/O transfer max must be at least 1 sector\n");
+ usage ();
+ }
+ if (maxchunk & (sectorsize - 1))
+ {
+ fprintf (stderr, "Invalid transfer size, must be multiple of %d: %d\n", sectorsize, maxchunk);
+ usage ();
+ }
if (id == NULL) /* no ID specified, */
{
id = strrchr (device, '/'); /* find the basename */
@@ -580,7 +594,11 @@
childinfo = mmap (NULL,
nproc * sizeof (struct childinfo),
PROT_READ | PROT_WRITE,
+#ifdef MAP_INHERIT
MAP_INHERIT | MAP_SHARED | MAP_ANON,
+#else
+ MAP_SHARED | MAP_ANON,
+#endif
-1,
(off_t) 0 );
#else
@@ -835,14 +853,6 @@
childinfo [proc].writes = 0;
childinfo [proc].bytes_written = 0;
- /* Get our own file handle */
- close(file); /* need our own FD */
- if ((file = open (device, openflags, 0)) < 0)
- {
- fprintf (stderr, "Child %d: Can't open %s: %s\n", proc, device, strerror (errno));
- exit (1);
- }
-
/* Don't jump the gun */
sigemptyset (&allsigs);
if (sigaction (SIGUSR1, &ignore, NULL) < 0)
@@ -863,20 +873,13 @@
length = maxchunk;
else
length = (myrandom (proc + nproc * i * 2)
- % (maxchunk * 2) + 512) & ~0x1ff; /* length of this transfer */
- offset = ((((off_t) (myrandom2 (proc + nproc * i)) * DEV_BSIZE)
- % (filesize - SKIPSTART - length)) & ~0x1ff) + SKIPSTART;
- if ((pos = lseek (file, offset, SEEK_SET)) != offset)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x (%" Quad "x): %s\n",
- proc,
- offset,
- pos,
- strerror (errno));
- else if ((iocount = read (file, buf, length)) != length)
+ % (maxchunk * 2) + sectorsize) & ~(sectorsize - 1); /* length of this transfer */
+ offset = (((((off_t) myrandom2 (proc + nproc * i)) * sectorsize)
+ % (filesize - SKIPSTART - length)) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if ((iocount = pread (file, buf, length, pos = offset)) != length)
{
int Errno = errno;
- pos = lseek (file, 0, SEEK_CUR);
+ pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -915,9 +918,9 @@
if (fixedoffset)
offset = SKIPSTART; /* start at the beginning */
else /* random start */
- offset = ((((off_t) (myrandom (proc + nproc)) * DEV_BSIZE)
+ offset = (((((off_t) myrandom (proc + nproc)) * sectorsize)
% (filesize - SKIPSTART /* decide where to start */
- - (maxrecs * length))) & ~0x1ff) + SKIPSTART;
+ - (maxrecs * length))) & ~((off_t)sectorsize - 1)) + SKIPSTART;
if ((offset + maxrecs * length) > filesize) /* XXX */
{
printf ("Overrun: offset %" Quad "d, end %" Quad "d, file size %" Quad "d\n",
@@ -928,18 +931,12 @@
}
if ((verbose > 2) && ! fixedoffset)
printf ("Child %d reading from %" Quad "d\n", proc, offset);
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x: %s\n",
- proc,
- offset,
- strerror (errno));
for (i = 1; i <= maxrecs; i++)
{
- if ((iocount = read (file, buf, length)) != length)
+ if ((iocount = pread (file, buf, length, offset)) != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -965,6 +962,7 @@
{
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
+ offset += iocount;
}
}
break;
@@ -976,30 +974,28 @@
length = maxchunk;
else
length = (myrandom (proc + nproc * i * 2)
- % (maxchunk * 2) + 512) & ~0x1ff; /* length of this transfer */
- offset = ((((off_t) (myrandom2 (proc + nproc * i)) * DEV_BSIZE)
- % (filesize - SKIPSTART - length)) & ~0x1ff) + SKIPSTART;
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr, "Child %d can't seek: %s", proc, strerror (errno));
- else
+ % (maxchunk * 2) + sectorsize) & ~(sectorsize - 1); /* length of this transfer */
+ offset = (((((off_t) myrandom2 (proc + nproc * i)) * sectorsize)
+ % (filesize - SKIPSTART - length)) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if (1)
{
if ((RWfrac == 100)
|| ((myrandom (proc + nproc * i * 2 + 1) % 100) < RWfrac) )
{
- iocount = write (file, buf, length);
+ iocount = pwrite (file, buf, length, offset);
childinfo [proc].writes++;
childinfo [proc].bytes_written += iocount;
}
else
{
- iocount = read (file, buf, length);
+ iocount = pread (file, buf, length, offset);
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
}
if (iocount != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n", offset,
@@ -1032,36 +1028,30 @@
if (fixedoffset)
offset = SKIPSTART; /* start at the beginning */
else /* random start */
- offset = ((((off_t) (myrandom (proc + nproc)) * DEV_BSIZE)
+ offset = (((((off_t) myrandom (proc + nproc)) * sectorsize)
% (filesize - SKIPSTART /* decide where to start */
- - (maxrecs * length))) & ~0x1ff) + SKIPSTART;
- if (lseek (file, offset, SEEK_SET) < 0)
- fprintf (stderr,
- "Child %d can't seek to %" Quad "x: %s\n",
- proc,
- offset,
- strerror (errno));
- else if ((verbose > 2) && ! fixedoffset)
+ - (maxrecs * length))) & ~((off_t)sectorsize - 1)) + SKIPSTART;
+ if ((verbose > 2) && ! fixedoffset)
printf ("Child %d writing to %" Quad "d\n", proc, offset);
for (i = 1; i <= maxrecs; i++)
{
if ((SWfrac == 100)
|| ((myrandom (proc + nproc * i * 2 + 1) % 100) < SWfrac) )
{
- iocount = write (file, buf, length);
+ iocount = pwrite (file, buf, length, offset);
childinfo [proc].writes++;
childinfo [proc].bytes_written += iocount;
}
else
{
- iocount = read (file, buf, length);
+ iocount = pread (file, buf, length, offset);
childinfo [proc].reads++;
childinfo [proc].bytes_read += iocount;
}
if (iocount != length)
{
int Errno = errno;
- off_t pos = lseek (file, (off_t) 0, SEEK_CUR);
+ off_t pos = offset + (iocount > 0 ? iocount : 0);
fprintf (stderr,
"offset %" Quad "d, filesize %" Quad "d\n",
@@ -1082,6 +1072,10 @@
iocount,
length );
exit (1);
+ }
+ else
+ {
+ offset += iocount;
}
}
break;