1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001 Silicon Graphics, Inc.
8 * This is mostly a "crash & burn" test. -v turns on verbosity
9 * and -c actually fails on errors - but expected errors aren't
22 static int dirstress(char *dirname, int dirnum, int nfiles, int keep, int nprocs_per_dir);
23 static int create_entries(int nfiles);
24 static int scramble_entries(int nfiles);
25 static int remove_entries(int nfiles);
54 while ((c = getopt(argc, argv, "d:p:f:s:n:kvc")) != EOF) {
57 nprocs = atoi(optarg);
60 nfiles = atoi(optarg);
63 nprocs_per_dir = atoi(optarg);
69 seed = strtol(optarg, NULL, 0);
85 if (errflg || (dirname == NULL)) {
86 printf("Usage: dirstress [-d dir] [-p nprocs] [-f nfiles] [-n procs per dir]\n"
87 " [-v] [-s seed] [-k] [-c]\n");
91 printf("** [%d] Using seed %ld\n", pid, seed);
94 for (i = 0; i < nprocs; i++) {
95 if (verbose) fprintf(stderr,"** [%d] fork\n", pid);
98 perror("Fork failed");
106 if (verbose) fprintf(stderr,"** [%d] forked\n", pid);
107 r=dirstress(dirname, i / nprocs_per_dir, nfiles, keep, nprocs_per_dir);
108 if (verbose) fprintf(stderr,"** [%d] exit %d\n", pid, r);
112 if (verbose) fprintf(stderr,"** [%d] wait\n", pid);
115 /* wait & reap children, accumulating error results */
116 while (wait(&status) != -1)
119 printf("INFO: Dirstress complete\n");
120 if (verbose) fprintf(stderr,"** [%d] parent exit %d\n", pid, istatus);
138 sprintf(buf, "%s/stressdir", dirname);
139 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
140 error = mkdir(buf, 0777);
141 if (error && (errno != EEXIST)) {
142 perror("Create stressdir directory failed");
146 if (verbose) fprintf(stderr,"** [%d] chdir %s\n", pid, buf);
149 perror("Cannot chdir to main directory");
153 sprintf(buf, "stress.%d", dirnum);
154 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
155 error = mkdir(buf, 0777);
156 if (error && (errno != EEXIST)) {
157 perror("Create pid directory failed");
161 if (verbose) fprintf(stderr,"** [%d] chdir %s\n", pid, buf);
164 perror("Cannot chdir to dirnum directory");
168 r=1; /* assume failure */
169 if (verbose) fprintf(stderr,"** [%d] create entries\n", pid);
170 if (create_entries(nfiles)) {
171 printf("!! [%d] create failed\n", pid);
173 if (verbose) fprintf(stderr,"** [%d] scramble entries\n", pid);
174 if (scramble_entries(nfiles)) {
175 printf("!! [%d] scramble failed\n", pid);
178 if (verbose) fprintf(stderr,"** [%d] keep entries\n", pid);
181 if (verbose) fprintf(stderr,"** [%d] remove entries\n", pid);
182 if (remove_entries(nfiles)) {
183 printf("!! [%d] remove failed\n", pid);
191 if (verbose) fprintf(stderr,"** [%d] chdir ..\n", pid);
194 /* If this is multithreaded, then expecting a ENOENT here is fine,
195 * and ESTALE is normal in the NFS case. */
196 if (nprocs_per_dir > 1 && (errno == ENOENT || errno == ESTALE)) {
200 perror("Cannot chdir out of pid directory");
205 sprintf(buf, "stress.%d", dirnum);
206 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
209 if (checkflag) return 1;
213 if (verbose) fprintf(stderr,"** [%d] chdir ..\n", pid);
216 /* If this is multithreaded, then expecting a ENOENT here is fine,
217 * and ESTALE is normal in the NFS case. */
218 if (nprocs_per_dir > 1 && (errno == ENOENT || errno == ESTALE)) {
222 perror("Cannot chdir out of working directory");
227 if (verbose) fprintf(stderr,"** [%d] rmdir stressdir\n", pid);
228 if (rmdir("stressdir")) {
230 if (checkflag) return 1;
245 for (i = 0; i < nfiles; i++) {
246 sprintf(buf, "XXXXXXXXXXXX.%d", i);
252 if (verbose) fprintf(stderr,"** [%d] creat %s\n", pid, buf);
253 fd = creat(buf, 0666);
255 if (verbose) fprintf(stderr,"** [%d] close %s\n", pid, buf);
258 fprintf(stderr,"!! [%d] close %s failed\n", pid, buf);
260 if (checkflag) return 1;
268 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
269 if (mkdir(buf, 0777)) {
270 fprintf(stderr,"!! [%d] mkdir %s 0777 failed\n", pid, buf);
272 if (checkflag) return 1;
280 if (verbose) fprintf(stderr,"** [%d] symlink %s %s\n", pid, buf, buf);
281 if (symlink(buf, buf)) {
282 fprintf(stderr,"!! [%d] symlink %s %s failed\n", pid, buf, buf);
284 if (checkflag) return 1;
292 if (verbose) fprintf(stderr,"** [%d] mknod %s 0x%x\n", pid, buf, MKNOD_DEV);
293 if (mknod(buf, S_IFCHR | 0666, MKNOD_DEV)) {
294 fprintf(stderr,"!! [%d] mknod %s 0x%x failed\n", pid, buf, MKNOD_DEV);
296 if (checkflag) return 1;
318 for (i = 0; i < nfiles * 2; i++) {
322 * rename two random entries
324 r = random() % nfiles;
325 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
326 r = random() % nfiles;
327 sprintf(buf1, "XXXXXXXXXXXX.%ld", r);
329 if (verbose) fprintf(stderr,"** [%d] rename %s %s\n", pid, buf, buf1);
330 if (rename(buf, buf1)) {
332 if (checkflag) return 1;
337 * unlink a random entry
339 r = random() % nfiles;
340 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
341 if (verbose) fprintf(stderr,"** [%d] unlink %s\n", pid, buf);
343 fprintf(stderr,"!! [%d] unlink %s failed\n", pid, buf);
345 if (checkflag) return 1;
350 * rmdir a random entry
352 r = random() % nfiles;
353 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
354 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
356 fprintf(stderr,"!! [%d] rmdir %s failed\n", pid, buf);
358 if (checkflag) return 1;
363 * create a random entry
365 r = random() % nfiles;
366 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
368 if (verbose) fprintf(stderr,"** [%d] creat %s 0666\n", pid, buf);
369 fd = creat(buf, 0666);
371 if (verbose) fprintf(stderr,"** [%d] close %s\n", pid, buf);
373 fprintf(stderr,"!! [%d] close %s failed\n", pid, buf);
375 if (checkflag) return 1;
378 fprintf(stderr,"!! [%d] creat %s 0666 failed\n", pid, buf);
380 if (checkflag) return 1;
385 * mkdir a random entry
387 r = random() % nfiles;
388 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
389 if (verbose) fprintf(stderr,"** [%d] mkdir %s\n", pid, buf);
390 if (mkdir(buf, 0777)) {
391 fprintf(stderr,"!! [%d] mkdir %s failed\n", pid, buf);
393 if (checkflag) return 1;
412 for (i = 0; i < nfiles; i++) {
413 sprintf(buf, "XXXXXXXXXXXX.%d", i);
414 error = lstat(buf, &statb);
416 /* ignore this one */
419 if (S_ISDIR(statb.st_mode)) {
420 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
422 fprintf(stderr,"!! [%d] rmdir %s failed\n", pid, buf);
424 if (checkflag) return 1;
427 if (verbose) fprintf(stderr,"** [%d] unlink %s\n", pid, buf);
429 fprintf(stderr,"!! [%d] unlink %s failed\n", pid, buf);
431 if (checkflag) return 1;