| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Copyright (c) 2000-2001 Silicon Graphics, Inc. | |
| * All Rights Reserved. | |
| */ | |
| #include "global.h" | |
| long filesize; | |
| int blocksize; | |
| int count; | |
| int verbose; | |
| off64_t fileoffset; | |
| void usage(char *progname); | |
| void writeblk(int fd); | |
| void truncfile(int fd); | |
| void | |
| usage(char *progname) | |
| { | |
| fprintf(stderr, "usage: %s [-l filesize] [-b blocksize] [-c count] [-s seed] [-o fileoffset (hex)] [-v] filename\n", | |
| progname); | |
| exit(1); | |
| } | |
| int | |
| main(int argc, char *argv[]) | |
| { | |
| int seed, i, ch, fd; | |
| char *filename = NULL; | |
| filesize = 256*1024*1024; | |
| blocksize = 512; | |
| count = filesize/blocksize; | |
| verbose = 0; | |
| fileoffset = 0; | |
| seed = time(NULL); | |
| while ((ch = getopt(argc, argv, "b:l:s:c:o:v")) != EOF) { | |
| switch(ch) { | |
| case 'b': blocksize = atoi(optarg); break; | |
| case 'l': filesize = atol(optarg); break; | |
| case 's': seed = atoi(optarg); break; | |
| case 'c': count = atoi(optarg); break; | |
| case 'o': fileoffset = strtoll(optarg, NULL, 16); break; | |
| case 'v': verbose++; break; | |
| default: usage(argv[0]); break; | |
| } | |
| } | |
| if (optind == argc-1) | |
| filename = argv[optind]; | |
| else | |
| usage(argv[0]); | |
| printf("Seed = %d (use \"-s %d\" to re-execute this test)\n", seed, seed); | |
| srandom(seed); | |
| /* | |
| * Open the file, write rand block in random places, truncate the file, | |
| * repeat ad-nauseum, then close the file. | |
| */ | |
| if ((fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) { | |
| perror("open"); | |
| return 1; | |
| } | |
| for (i = 0; i < count; i++) { | |
| writeblk(fd); | |
| truncfile(fd); | |
| if (verbose && ((i % 100) == 0)) { | |
| printf("."); | |
| fflush(stdout); | |
| } | |
| } | |
| if (close(fd) < 0) { | |
| perror("close"); | |
| return 1; | |
| } | |
| return 0; | |
| } | |
| void | |
| writeblk(int fd) | |
| { | |
| off_t offset; | |
| static char *buffer = NULL; | |
| if ((buffer == NULL) && ((buffer = calloc(1, blocksize)) == NULL)) { | |
| perror("malloc"); | |
| exit(1); | |
| } | |
| offset = random() % filesize; | |
| if (lseek64(fd, (off64_t)(fileoffset + offset), SEEK_SET) < 0) { | |
| perror("lseek"); | |
| exit(1); | |
| } | |
| *(long *)buffer = *(long *)(buffer+256) = (long)offset; | |
| if (write(fd, buffer, blocksize) < blocksize) { | |
| perror("write"); | |
| exit(1); | |
| } | |
| if (verbose > 1) | |
| printf("writing data at offset=%llx\n", | |
| (unsigned long long)(fileoffset + offset)); | |
| } | |
| void | |
| truncfile(int fd) | |
| { | |
| off_t offset; | |
| offset = random() % filesize; | |
| if (ftruncate64(fd, (off64_t)(fileoffset + offset)) < 0) { | |
| perror("truncate"); | |
| exit(1); | |
| } | |
| if (verbose > 1) | |
| printf("truncated file to offset %llx\n", | |
| (unsigned long long)(fileoffset + offset)); | |
| } |