--- 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 +#if __FreeBSD__ >= 5 +#include +#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;