xref: /freebsd/tools/test/stress2/misc/rmdir.sh (revision ef777be98543f7daae90bd123d4fc1ec4a54efc2)
1*ef777be9SPeter Holm#!/bin/sh
2*ef777be9SPeter Holm
3*ef777be9SPeter Holm#
4*ef777be9SPeter Holm# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org>
5*ef777be9SPeter Holm#
6*ef777be9SPeter Holm# SPDX-License-Identifier: BSD-2-Clause
7*ef777be9SPeter Holm#
8*ef777be9SPeter Holm
9*ef777be9SPeter Holm# Based on msdos11.sh
10*ef777be9SPeter Holm
11*ef777be9SPeter Holm. ../default.cfg
12*ef777be9SPeter Holm
13*ef777be9SPeter Holmset -u
14*ef777be9SPeter Holmprog=$(basename "$0" .sh)
15*ef777be9SPeter Holmlog=/tmp/$prog.log
16*ef777be9SPeter Holm
17*ef777be9SPeter Holmcat > /tmp/$prog.c <<EOF
18*ef777be9SPeter Holm#include <sys/param.h>
19*ef777be9SPeter Holm#include <sys/mman.h>
20*ef777be9SPeter Holm#include <sys/stat.h>
21*ef777be9SPeter Holm#include <sys/wait.h>
22*ef777be9SPeter Holm
23*ef777be9SPeter Holm
24*ef777be9SPeter Holm#include <err.h>
25*ef777be9SPeter Holm#include <errno.h>
26*ef777be9SPeter Holm#include <fcntl.h>
27*ef777be9SPeter Holm#include <stdatomic.h>
28*ef777be9SPeter Holm#include <stdio.h>
29*ef777be9SPeter Holm#include <stdlib.h>
30*ef777be9SPeter Holm#include <time.h>
31*ef777be9SPeter Holm#include <unistd.h>
32*ef777be9SPeter Holm
33*ef777be9SPeter Holmstatic _Atomic(int) *share;
34*ef777be9SPeter Holm
35*ef777be9SPeter Holm#define PARALLEL 3
36*ef777be9SPeter Holm#define RUNTIME (2 * 60)
37*ef777be9SPeter Holm#define SYNC 0
38*ef777be9SPeter Holm
39*ef777be9SPeter Holmstatic void
40*ef777be9SPeter Holmtest(void)
41*ef777be9SPeter Holm{
42*ef777be9SPeter Holm	time_t start;
43*ef777be9SPeter Holm
44*ef777be9SPeter Holm	atomic_fetch_add(&share[SYNC], 1);
45*ef777be9SPeter Holm	while (share[SYNC] != PARALLEL)
46*ef777be9SPeter Holm		;
47*ef777be9SPeter Holm	start = time(NULL);
48*ef777be9SPeter Holm	while ((time(NULL) - start) < 30) {
49*ef777be9SPeter Holm		mkdir("a", 0755);
50*ef777be9SPeter Holm		rename("a", "b");
51*ef777be9SPeter Holm		rmdir("b");
52*ef777be9SPeter Holm	}
53*ef777be9SPeter Holm
54*ef777be9SPeter Holm	_exit(0);
55*ef777be9SPeter Holm}
56*ef777be9SPeter Holm
57*ef777be9SPeter Holmint
58*ef777be9SPeter Holmmain(void)
59*ef777be9SPeter Holm{
60*ef777be9SPeter Holm	pid_t pids[PARALLEL];
61*ef777be9SPeter Holm	size_t len;
62*ef777be9SPeter Holm	time_t start;
63*ef777be9SPeter Holm	int e, i, status;
64*ef777be9SPeter Holm
65*ef777be9SPeter Holm	e = 0;
66*ef777be9SPeter Holm	len = PAGE_SIZE;
67*ef777be9SPeter Holm	if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE,
68*ef777be9SPeter Holm	    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
69*ef777be9SPeter Holm		err(1, "mmap");
70*ef777be9SPeter Holm
71*ef777be9SPeter Holm	start = time(NULL);
72*ef777be9SPeter Holm	while ((time(NULL) - start) < RUNTIME && e == 0) {
73*ef777be9SPeter Holm		share[SYNC] = 0;
74*ef777be9SPeter Holm		for (i = 0; i < PARALLEL; i++) {
75*ef777be9SPeter Holm			if ((pids[i] = fork()) == 0)
76*ef777be9SPeter Holm				test();
77*ef777be9SPeter Holm			if (pids[i] == -1)
78*ef777be9SPeter Holm				err(1, "fork()");
79*ef777be9SPeter Holm		}
80*ef777be9SPeter Holm		for (i = 0; i < PARALLEL; i++) {
81*ef777be9SPeter Holm			if (waitpid(pids[i], &status, 0) == -1)
82*ef777be9SPeter Holm				err(1, "waitpid(%d)", pids[i]);
83*ef777be9SPeter Holm			if (status != 0) {
84*ef777be9SPeter Holm				if (WIFSIGNALED(status))
85*ef777be9SPeter Holm					fprintf(stderr,
86*ef777be9SPeter Holm					    "pid %d exit signal %d\n",
87*ef777be9SPeter Holm					    pids[i], WTERMSIG(status));
88*ef777be9SPeter Holm			}
89*ef777be9SPeter Holm			e += status == 0 ? 0 : 1;
90*ef777be9SPeter Holm		}
91*ef777be9SPeter Holm	}
92*ef777be9SPeter Holm
93*ef777be9SPeter Holm	return (e);
94*ef777be9SPeter Holm}
95*ef777be9SPeter HolmEOF
96*ef777be9SPeter Holmmycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c || exit 1
97*ef777be9SPeter Holm
98*ef777be9SPeter Holmset -e
99*ef777be9SPeter Holmmount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint
100*ef777be9SPeter Holm[ -c /dev/md$mdstart ] &&  mdconfig -d -u $mdstart
101*ef777be9SPeter Holmmdconfig -a -t swap -s 512m -u $mdstart
102*ef777be9SPeter Holmnewfs $newfs_flags md$mdstart > /dev/null
103*ef777be9SPeter Holmmount /dev/md$mdstart $mntpoint
104*ef777be9SPeter Holmset +e
105*ef777be9SPeter Holm
106*ef777be9SPeter Holmhere=`pwd`
107*ef777be9SPeter Holm(cd $here/../testcases/swap; ./swap -t 2m -i 20 -l 100 > /dev/null) &
108*ef777be9SPeter Holmsleep .5
109*ef777be9SPeter Holm
110*ef777be9SPeter Holmcd $mntpoint
111*ef777be9SPeter Holm/tmp/$prog; s=$?
112*ef777be9SPeter Holmcd -
113*ef777be9SPeter Holmwait
114*ef777be9SPeter Holmumount $mntpoint
115*ef777be9SPeter Holmfsck_ffs /dev/md$mdstart > $log 2>&1
116*ef777be9SPeter Holmgrep -Eq "WAS MODIFIED" $log && { cat $log; s=32; }
117*ef777be9SPeter Holmmdconfig -d -u $mdstart
118*ef777be9SPeter Holmrm -f /tmp/$prog /tmp/$prog.c $log
119*ef777be9SPeter Holmexit $s
120