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