Minor bits to wrap up this series. - Bumped up the number of blocks read at once from 10 to 256 - Shorten remaining long lines - Re-factor findblock() - Get rid of global variable "nvalid" - Add a few more comments - Give all global symbols static scope - Update the copyright message - Various other minor formatting changes. Signed-off-by: Alex Elder <aelder@xxxxxxx> --- src/randholes.c | 155 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 69 deletions(-) Index: b/src/randholes.c =================================================================== --- a/src/randholes.c +++ b/src/randholes.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -20,31 +20,31 @@ #include "global.h" -unsigned char *valid; /* Bit-vector array showing which blocks have been written */ -int nvalid; /* number of bytes in valid array */ -#define SETBIT(ARRAY, N) ((ARRAY)[(N)/8] |= (1 << ((N)%8))) -#define BITVAL(ARRAY, N) ((ARRAY)[(N)/8] & (1 << ((N)%8))) - #define power_of_2(x) ((x) && !((x) & ((x) - 1))) #define DEFAULT_FILESIZE ((__uint64_t) (256 * 1024 * 1024)) #define DEFAULT_BLOCKSIZE 512 -__uint64_t filesize; +#define SETBIT(ARRAY, N) ((ARRAY)[(N)/8] |= (1 << ((N)%8))) +#define BITVAL(ARRAY, N) ((ARRAY)[(N)/8] & (1 << ((N)%8))) + +/* Bit-vector array showing which blocks have been written */ +static unsigned char *valid; -unsigned int blocksize; -int count; -int verbose; -int wsync; -int direct; -int alloconly; -int rt; -int extsize; /* used only for real-time */ -int preserve; -int test; -__uint64_t fileoffset; +static __uint64_t filesize; +static __uint64_t fileoffset; +static unsigned int blocksize; +static int count; +static int verbose; +static int wsync; +static int direct; +static int alloconly; +static int rt; +static int extsize; /* used only for real-time */ +static int preserve; +static int test; -#define READ_XFER 10 /* block to read at a time when checking */ +#define READ_XFER 256 /* blocks to read at a time when checking */ /* * Define xfscntl() to mask the difference between the Linux @@ -62,7 +62,7 @@ __uint64_t fileoffset; xfsctl((filename), (fd), XFS_IOC_ ## cmd, (arg)) #endif /* ! __sgi__ */ -void +static void usage(char *progname) { fprintf(stderr, @@ -82,7 +82,6 @@ usage(char *progname) } /* Returns filename if successful or a null pointer if an error occurs */ - static char * parseargs(int argc, char *argv[]) { @@ -119,31 +118,35 @@ parseargs(int argc, char *argv[]) if ((filesize % blocksize) != 0) { filesize -= filesize % blocksize; - printf("filesize not a multiple of blocksize, reducing filesize to %llu\n", - (unsigned long long)filesize); + printf("filesize not a multiple of blocksize, " + "reducing filesize to %llu\n", + (unsigned long long) filesize); } if ((fileoffset % blocksize) != 0) { fileoffset -= fileoffset % blocksize; - printf("fileoffset not a multiple of blocksize, reducing fileoffset to %llu\n", - (unsigned long long)fileoffset); + printf("fileoffset not a multiple of blocksize, " + "reducing fileoffset to %llu\n", + (unsigned long long) fileoffset); } if (count > (filesize/blocksize)) { count = (filesize/blocksize); - printf("count of blocks written is too large, setting to %d\n", - count); + printf("count of blocks written is too large, " + "setting to %d\n", count); } else if (count < 1) { count = 1; - printf("count of blocks written is too small, setting to %d\n", - count); + printf("count of blocks written is too small, " + "setting to %d\n", count); } - printf("randholes: Seed = %d (use \"-s %d\" to re-execute this test)\n", seed, seed); + printf("randholes: Seed = %d (use \"-s %d\" " + "to re-execute this test)\n", seed, seed); srandom(seed); printf("randholes: blocksize=%d, filesize=%llu, seed=%d\n" "randholes: count=%d, offset=%llu, extsize=%d\n", blocksize, (unsigned long long)filesize, seed, count, (unsigned long long)fileoffset, extsize); - printf("randholes: verbose=%d, wsync=%d, direct=%d, rt=%d, alloconly=%d, preserve=%d, test=%d\n", + printf("randholes: verbose=%d, wsync=%d, direct=%d, " + "rt=%d, alloconly=%d, preserve=%d, test=%d\n", verbose, wsync, direct ? 1 : 0, rt, alloconly, preserve, test); /* Last argument is the file name. Return it. */ @@ -151,40 +154,45 @@ parseargs(int argc, char *argv[]) return argv[optind]; /* Success */ } -int +/* + * Determine the next random block number to which to write. + * If an already-written block is selected, choose the next + * unused higher-numbered block. Returns the block number, + * or -1 if we exhaust available blocks looking for an unused + * one. + */ +static int findblock(void) { int block, numblocks; numblocks = filesize / blocksize; block = random() % numblocks; - if (BITVAL(valid, block) == 0) - return(block); - for ( ; BITVAL(valid, block) != 0; block++) { - if (block == (numblocks-1)) - block = -1; - } - if (block == -1) - printf("returning block -1\n"); - return(block); + while (BITVAL(valid, block)) { + if (++block == numblocks) { + printf("returning block -1\n"); + return -1; + } + } + return block; } -void +static void dumpblock(int *buffer, __uint64_t offset, int blocksize) { int i; for (i = 0; i < (blocksize / 16); i++) { printf("%llx: 0x%08x 0x%08x 0x%08x 0x%08x\n", - (unsigned long long)offset, *buffer, *(buffer + 1), *(buffer + 2), - *(buffer + 3)); + (unsigned long long) offset, *buffer, *(buffer + 1), + *(buffer + 2), *(buffer + 3)); offset += 16; buffer += 4; } } -void +static void writeblks(char *fname, int fd, size_t alignment) { __uint64_t offset; @@ -255,7 +263,7 @@ writeblks(char *fname, int fd, size_t al free(buffer); } -int +static int readblks(int fd, size_t alignment) { __uint64_t offset; @@ -335,7 +343,7 @@ readblks(int fd, size_t alignment) * system; otherwise pointer alignment is fine. Returns the * alignment multiple, or 0 if an error occurs. */ -size_t +static size_t get_alignment(char *filename, int fd) { struct dioattr dioattr; @@ -400,58 +408,67 @@ realtime_setup(char *filename, int fd) int main(int argc, char *argv[]) { - int fd, oflags; - char *filename; - int r; - size_t alignment; + char *filename; + size_t size; + int oflags; + int fd; + size_t alignment; + int errors; filename = parseargs(argc, argv); if (! filename) return 1; /* - * Open the file, write rand block in random places, read them all - * back to check for correctness, then close the file. + * Allocate a bitmap big enough to track the range of + * blocks we'll be dealing with. */ - nvalid = (filesize / blocksize) / 8 + 1; - if ((valid = (unsigned char *)calloc(1, (unsigned)nvalid)) == NULL) { + size = (filesize / blocksize) / 8 + 1; + valid = malloc(size); + if ((valid = malloc(size)) == NULL) { perror("malloc"); return 1; } - oflags=test?(O_RDONLY):(O_RDWR | O_CREAT); - oflags |= (preserve ? 0 : O_TRUNC) | - (wsync ? O_SYNC : 0) | - (direct ? O_DIRECT : 0); + /* Lots of arguments affect how we open the file */ + oflags = test ? O_RDONLY : O_RDWR|O_CREAT; + oflags |= preserve ? 0 : O_TRUNC; + oflags |= wsync ? O_SYNC : 0; + oflags |= direct ? O_DIRECT : 0; + /* + * Open the file, write rand block in random places, read them all + * back to check for correctness, then close the file. + */ if ((fd = open(filename, oflags, 0666)) < 0) { perror("open"); return 1; } - if (rt && realtime_setup(filename, fd)) return 1; - alignment = get_alignment(filename, fd); if (! alignment) return 1; - printf(test?"write (skipped)\n":"write\n"); + printf("write%s\n", test ? " (skipped)" : ""); writeblks(filename, fd, alignment); + printf("readback\n"); - r = readblks(fd, alignment); + errors = readblks(fd, alignment); + if (close(fd) < 0) { perror("close"); return 1; } free(valid); - if (r) { - printf("randholes: %d errors found during readback\n", r); - return 2; - } else { - printf("randholes: ok\n"); - return 0; + if (errors) { + printf("randholes: %d errors found during readback\n", errors); + return 2; } + + printf("randholes: ok\n"); + + return 0; } _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs