1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
9 main(int argc, char **argv)
11 int c, i, j, n, err = 0;
13 long iterations = 100;
14 long psize, bsize, leaksize = 32 * 1024 * 1024;
16 char *readbuffer, *writebuffer;
20 psize = bsize = getpagesize();
21 resvsize = bsize * (off64_t) 10000;
23 while ((c = getopt(argc, argv, "b:i:l:s:")) != EOF) {
29 iterations = atol(optarg);
32 leaksize = atol(optarg);
35 resvsize = (off64_t) atoll(optarg);
43 if (optind > argc + 1)
47 printf("Usage: %s [-b blksize] [-l leaksize] [-r resvsize]\n",
52 filename = argv[optind];
54 readbuffer = memalign(psize, bsize);
55 writebuffer = memalign(psize, bsize);
56 if (!readbuffer || !writebuffer) {
60 memset(writebuffer, 'A', bsize);
63 writefd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
68 readfd = open(filename, O_RDONLY);
74 /* preallocate file space */
77 resvsp.l_len = resvsize;
78 if (xfsctl(filename, writefd, XFS_IOC_RESVSP64, &resvsp) < 0) {
79 fprintf(stdout, "attempt to reserve %lld bytes for %s "
80 "using %s failed: %s (%d)\n",
81 (long long int)resvsize, filename, "XFS_IOC_RESVSP64",
82 strerror(errno), errno);
84 fprintf(stdout, "reserved %lld bytes for %s using %s\n",
85 (long long int)resvsize, filename, "XFS_IOC_RESVSP64");
88 /* Space is now preallocated, start IO --
89 * write at current offset, pressurize, seek to zero on reader
90 * and read up to current write offset.
94 while (++n < iterations) {
98 if (write(writefd, writebuffer, bsize) < 0) {
103 /* Apply some memory pressure
104 * (allocate another chunk and touch all pages)
106 for (i = 0; i < (leaksize / psize); i++) {
112 lseek(readfd, SEEK_SET, 0);
114 for (j = 0; j < n; j++) {
115 if (read(readfd, readbuffer, bsize) < 0) {
119 for (i = 0; i < bsize; i++) {
120 if (readbuffer[i] != 'A') {
122 "errors detected in file, pos: %d (%lld+%d), nwrites: %d [val=0x%x].\n",
123 j, (long long)j * 4096,
124 i, n, readbuffer[i]);
130 if (numerrors > 10) {
132 } else if (numerrors) {
133 fprintf(stdout, "\n");