overlay: Test invalidate of readdir cache
[xfstests-dev.git] / src / resvtest.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
4  */ 
5
6 #include "global.h"
7
8 int
9 main(int argc, char **argv)
10 {
11         int             c, i, j, n, err = 0;
12         int             writefd, readfd;
13         long            iterations = 100;
14         long            psize, bsize, leaksize = 32 * 1024 * 1024;
15         char            *filename;
16         char            *readbuffer, *writebuffer;
17         off64_t         resvsize;
18         xfs_flock64_t   resvsp;
19
20         psize = bsize = getpagesize();
21         resvsize = bsize * (off64_t) 10000;
22
23         while ((c = getopt(argc, argv, "b:i:l:s:")) != EOF) {
24                 switch(c) {
25                 case 'b':
26                         bsize = atol(optarg);
27                         break;
28                 case 'i':
29                         iterations = atol(optarg);
30                         break;
31                 case 'l':
32                         leaksize = atol(optarg);
33                         break;
34                 case 's':
35                         resvsize = (off64_t) atoll(optarg);
36                         break;
37                 default:
38                         err++;
39                         break;
40                 }
41         }
42
43         if (optind > argc + 1)
44                 err++;
45
46         if (err) {
47                 printf("Usage: %s [-b blksize] [-l leaksize] [-r resvsize]\n",
48                         argv[0]);
49                 exit(0);
50         }
51
52         filename = argv[optind];
53
54         readbuffer = memalign(psize, bsize);
55         writebuffer = memalign(psize, bsize);
56         if (!readbuffer || !writebuffer) {
57                 perror("open");
58                 exit(1);
59         }
60         memset(writebuffer, 'A', bsize);
61
62         unlink(filename);
63         writefd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
64         if (writefd < 0) {
65                 perror("open");
66                 exit(1);
67         }
68         readfd = open(filename, O_RDONLY);
69         if (readfd < 0) {
70                 perror("open");
71                 exit(1);
72         }
73
74         /* preallocate file space */
75         resvsp.l_whence = 0;
76         resvsp.l_start = 0;
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);
83         } else {
84                 fprintf(stdout, "reserved %lld bytes for %s using %s\n",
85                                 (long long int)resvsize, filename, "XFS_IOC_RESVSP64");
86         }
87
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.
91          */
92
93         n = 0;
94         while (++n < iterations) {
95                 char *p;
96                 int numerrors;
97
98                 if (write(writefd, writebuffer, bsize) < 0) {
99                         perror("write");
100                         exit(1);
101                 }
102
103                 /* Apply some memory pressure 
104                  * (allocate another chunk and touch all pages)
105                  */
106                 for (i = 0; i < (leaksize / psize); i++) {
107                         p = malloc(psize);
108                         if (p)
109                                 p[7] = '7';
110                 }
111                 sleep(1);
112                 lseek(readfd, SEEK_SET, 0);
113                 numerrors = 0;
114                 for (j = 0; j < n; j++) {
115                         if (read(readfd, readbuffer, bsize) < 0) {
116                                 perror("read");
117                                 exit(1);
118                         }
119                         for (i = 0; i < bsize; i++) {
120                                 if (readbuffer[i] != 'A') {
121                                         fprintf(stderr,
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]);
125                                         numerrors++;
126                                         break;
127                                 }
128                         }
129                 }
130                 if (numerrors > 10) {
131                         exit(1);
132                 } else if (numerrors) {
133                         fprintf(stdout, "\n");
134                 }
135         }
136
137         return(0);
138 }