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
23 static int dirstress(char *dirname, int dirnum, int nfiles, int keep, int nprocs_per_dir);
24 static int create_entries(int nfiles);
25 static int scramble_entries(int nfiles);
26 static int remove_entries(int nfiles);
55 while ((c = getopt(argc, argv, "d:p:f:s:n:kvcC")) != EOF) {
58 nprocs = atoi(optarg);
61 nfiles = atoi(optarg);
64 nprocs_per_dir = atoi(optarg);
70 seed = strtol(optarg, NULL, 0);
89 if (errflg || (dirname == NULL)) {
90 printf("Usage: dirstress [-d dir] [-p nprocs] [-f nfiles] [-n procs per dir]\n"
91 " [-v] [-s seed] [-k] [-c]\n");
95 printf("** [%d] Using seed %ld\n", pid, seed);
98 for (i = 0; i < nprocs; i++) {
99 if (verbose) fprintf(stderr,"** [%d] fork\n", pid);
102 perror("Fork failed");
110 if (verbose) fprintf(stderr,"** [%d] forked\n", pid);
111 r=dirstress(dirname, i / nprocs_per_dir, nfiles, keep, nprocs_per_dir);
112 if (verbose) fprintf(stderr,"** [%d] exit %d\n", pid, r);
116 if (verbose) fprintf(stderr,"** [%d] wait\n", pid);
119 /* wait & reap children, accumulating error results */
120 while (wait(&status) != -1)
123 printf("INFO: Dirstress complete\n");
124 if (verbose) fprintf(stderr,"** [%d] parent exit %d\n", pid, istatus);
142 sprintf(buf, "%s/stressdir", dirname);
143 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
144 error = mkdir(buf, 0777);
145 if (error && (errno != EEXIST)) {
146 perror("Create stressdir directory failed");
150 if (verbose) fprintf(stderr,"** [%d] chdir %s\n", pid, buf);
153 perror("Cannot chdir to main directory");
157 sprintf(buf, "stress.%d", dirnum);
158 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
159 error = mkdir(buf, 0777);
160 if (error && (errno != EEXIST)) {
161 perror("Create pid directory failed");
165 if (verbose) fprintf(stderr,"** [%d] chdir %s\n", pid, buf);
168 perror("Cannot chdir to dirnum directory");
172 r=1; /* assume failure */
173 if (verbose) fprintf(stderr,"** [%d] create entries\n", pid);
174 if (create_entries(nfiles)) {
175 printf("!! [%d] create failed\n", pid);
177 if (create_only) return 0;
178 if (verbose) fprintf(stderr,"** [%d] scramble entries\n", pid);
179 if (scramble_entries(nfiles)) {
180 printf("!! [%d] scramble failed\n", pid);
183 if (verbose) fprintf(stderr,"** [%d] keep entries\n", pid);
186 if (verbose) fprintf(stderr,"** [%d] remove entries\n", pid);
187 if (remove_entries(nfiles)) {
188 printf("!! [%d] remove failed\n", pid);
196 if (verbose) fprintf(stderr,"** [%d] chdir ..\n", pid);
199 /* If this is multithreaded, then expecting a ENOENT here is fine,
200 * and ESTALE is normal in the NFS case. */
201 if (nprocs_per_dir > 1 && (errno == ENOENT || errno == ESTALE)) {
205 perror("Cannot chdir out of pid directory");
210 sprintf(buf, "stress.%d", dirnum);
211 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
214 if (checkflag) return 1;
218 if (verbose) fprintf(stderr,"** [%d] chdir ..\n", pid);
221 /* If this is multithreaded, then expecting a ENOENT here is fine,
222 * and ESTALE is normal in the NFS case. */
223 if (nprocs_per_dir > 1 && (errno == ENOENT || errno == ESTALE)) {
227 perror("Cannot chdir out of working directory");
232 if (verbose) fprintf(stderr,"** [%d] rmdir stressdir\n", pid);
233 if (rmdir("stressdir")) {
235 if (checkflag) return 1;
250 for (i = 0; i < nfiles; i++) {
251 sprintf(buf, "XXXXXXXXXXXX.%d", i);
257 if (verbose) fprintf(stderr,"** [%d] creat %s\n", pid, buf);
258 fd = creat(buf, 0666);
260 if (verbose) fprintf(stderr,"** [%d] close %s\n", pid, buf);
263 fprintf(stderr,"!! [%d] close %s failed\n", pid, buf);
265 if (checkflag) return 1;
273 if (verbose) fprintf(stderr,"** [%d] mkdir %s 0777\n", pid, buf);
274 if (mkdir(buf, 0777)) {
275 fprintf(stderr,"!! [%d] mkdir %s 0777 failed\n", pid, buf);
277 if (checkflag) return 1;
285 if (verbose) fprintf(stderr,"** [%d] symlink %s %s\n", pid, buf, buf);
286 if (symlink(buf, buf)) {
287 fprintf(stderr,"!! [%d] symlink %s %s failed\n", pid, buf, buf);
289 if (checkflag) return 1;
297 if (verbose) fprintf(stderr,"** [%d] mknod %s 0x%x\n", pid, buf, MKNOD_DEV);
298 if (mknod(buf, S_IFCHR | 0666, MKNOD_DEV)) {
299 fprintf(stderr,"!! [%d] mknod %s 0x%x failed\n", pid, buf, MKNOD_DEV);
301 if (checkflag) return 1;
323 for (i = 0; i < nfiles * 2; i++) {
327 * rename two random entries
329 r = random() % nfiles;
330 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
331 r = random() % nfiles;
332 sprintf(buf1, "XXXXXXXXXXXX.%ld", r);
334 if (verbose) fprintf(stderr,"** [%d] rename %s %s\n", pid, buf, buf1);
335 if (rename(buf, buf1)) {
337 if (checkflag) return 1;
342 * unlink a random entry
344 r = random() % nfiles;
345 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
346 if (verbose) fprintf(stderr,"** [%d] unlink %s\n", pid, buf);
348 fprintf(stderr,"!! [%d] unlink %s failed\n", pid, buf);
350 if (checkflag) return 1;
355 * rmdir a random entry
357 r = random() % nfiles;
358 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
359 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
361 fprintf(stderr,"!! [%d] rmdir %s failed\n", pid, buf);
363 if (checkflag) return 1;
368 * create a random entry
370 r = random() % nfiles;
371 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
373 if (verbose) fprintf(stderr,"** [%d] creat %s 0666\n", pid, buf);
374 fd = creat(buf, 0666);
376 if (verbose) fprintf(stderr,"** [%d] close %s\n", pid, buf);
378 fprintf(stderr,"!! [%d] close %s failed\n", pid, buf);
380 if (checkflag) return 1;
383 fprintf(stderr,"!! [%d] creat %s 0666 failed\n", pid, buf);
385 if (checkflag) return 1;
390 * mkdir a random entry
392 r = random() % nfiles;
393 sprintf(buf, "XXXXXXXXXXXX.%ld", r);
394 if (verbose) fprintf(stderr,"** [%d] mkdir %s\n", pid, buf);
395 if (mkdir(buf, 0777)) {
396 fprintf(stderr,"!! [%d] mkdir %s failed\n", pid, buf);
398 if (checkflag) return 1;
417 for (i = 0; i < nfiles; i++) {
418 sprintf(buf, "XXXXXXXXXXXX.%d", i);
419 error = lstat(buf, &statb);
421 /* ignore this one */
424 if (S_ISDIR(statb.st_mode)) {
425 if (verbose) fprintf(stderr,"** [%d] rmdir %s\n", pid, buf);
427 fprintf(stderr,"!! [%d] rmdir %s failed\n", pid, buf);
429 if (checkflag) return 1;
432 if (verbose) fprintf(stderr,"** [%d] unlink %s\n", pid, buf);
434 fprintf(stderr,"!! [%d] unlink %s failed\n", pid, buf);
436 if (checkflag) return 1;