xref: /freebsd/tools/test/stress2/misc/msdos17.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# No problems observed
10*ef777be9SPeter Holm
11*ef777be9SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
12*ef777be9SPeter Holm
13*ef777be9SPeter Holm. ../default.cfg
14*ef777be9SPeter Holm
15*ef777be9SPeter Holmset -u
16*ef777be9SPeter Holmprog=$(basename "$0" .sh)
17*ef777be9SPeter Holmmount | grep -q "on $mntpoint " && umount $mntpoint
18*ef777be9SPeter Holm[ -c /dev/md$mdstart ] && mdconfig -d -u $mdstart
19*ef777be9SPeter Holm
20*ef777be9SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart
21*ef777be9SPeter Holmgpart create -s bsd md$mdstart > /dev/null
22*ef777be9SPeter Holmgpart add -t freebsd-ufs md$mdstart > /dev/null
23*ef777be9SPeter Holmpart=a
24*ef777be9SPeter Holmnewfs_msdos -F 32 -b 8192 /dev/md${mdstart}$part > /dev/null || exit 1
25*ef777be9SPeter Holmmount -t msdosfs /dev/md${mdstart}$part $mntpoint
26*ef777be9SPeter Holm
27*ef777be9SPeter Holmhere=`pwd`
28*ef777be9SPeter Holmcd /tmp
29*ef777be9SPeter Holmcat > $prog.c <<EOF
30*ef777be9SPeter Holm#include <sys/param.h>
31*ef777be9SPeter Holm#include <sys/mman.h>
32*ef777be9SPeter Holm#include <sys/stat.h>
33*ef777be9SPeter Holm#include <sys/wait.h>
34*ef777be9SPeter Holm
35*ef777be9SPeter Holm#include <machine/atomic.h>
36*ef777be9SPeter Holm
37*ef777be9SPeter Holm#include <err.h>
38*ef777be9SPeter Holm#include <errno.h>
39*ef777be9SPeter Holm#include <fcntl.h>
40*ef777be9SPeter Holm#include <stdio.h>
41*ef777be9SPeter Holm#include <stdlib.h>
42*ef777be9SPeter Holm#include <unistd.h>
43*ef777be9SPeter Holm
44*ef777be9SPeter Holmstatic volatile u_int *share;
45*ef777be9SPeter Holmstatic char file1[80], file2[80];
46*ef777be9SPeter Holm
47*ef777be9SPeter Holm#define SYNC 0
48*ef777be9SPeter Holm#define STOP 1
49*ef777be9SPeter Holm
50*ef777be9SPeter Holmstatic void
51*ef777be9SPeter Holmtest0(void)
52*ef777be9SPeter Holm{
53*ef777be9SPeter Holm	struct stat sb;
54*ef777be9SPeter Holm
55*ef777be9SPeter Holm	while (share[STOP] == 0) {
56*ef777be9SPeter Holm		while (share[SYNC] != 0)
57*ef777be9SPeter Holm			usleep(100);
58*ef777be9SPeter Holm		if (rename(file1, file2) == -1)
59*ef777be9SPeter Holm			err(1, "rename(%s, %s)", file1, file2);
60*ef777be9SPeter Holm		if (stat(file1, &sb) == 0)
61*ef777be9SPeter Holm			err(1, "stat(%s)", file1);
62*ef777be9SPeter Holm		atomic_add_int(&share[SYNC], 1);
63*ef777be9SPeter Holm	}
64*ef777be9SPeter Holm
65*ef777be9SPeter Holm	_exit(0);
66*ef777be9SPeter Holm}
67*ef777be9SPeter Holm
68*ef777be9SPeter Holmstatic void
69*ef777be9SPeter Holmtest1(void)
70*ef777be9SPeter Holm{
71*ef777be9SPeter Holm	struct stat sb;
72*ef777be9SPeter Holm
73*ef777be9SPeter Holm	while (share[STOP] == 0) {
74*ef777be9SPeter Holm		while (share[SYNC] != 1)
75*ef777be9SPeter Holm			usleep(100);
76*ef777be9SPeter Holm		if (rename(file2, file1) == -1)
77*ef777be9SPeter Holm			err(1, "rename(%s, %s)", file2, file1);
78*ef777be9SPeter Holm		if (stat(file2, &sb) == 0)
79*ef777be9SPeter Holm			err(1, "stat(%s)", file2);
80*ef777be9SPeter Holm		atomic_add_int(&share[SYNC], -1);
81*ef777be9SPeter Holm	}
82*ef777be9SPeter Holm
83*ef777be9SPeter Holm	_exit(0);
84*ef777be9SPeter Holm}
85*ef777be9SPeter Holm
86*ef777be9SPeter Holmint
87*ef777be9SPeter Holmmain(void)
88*ef777be9SPeter Holm{
89*ef777be9SPeter Holm	pid_t pids[2];
90*ef777be9SPeter Holm	size_t len;
91*ef777be9SPeter Holm	int fd;
92*ef777be9SPeter Holm	char cwd[80];
93*ef777be9SPeter Holm
94*ef777be9SPeter Holm	len = PAGE_SIZE;
95*ef777be9SPeter Holm	if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE,
96*ef777be9SPeter Holm	    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
97*ef777be9SPeter Holm		err(1, "mmap");
98*ef777be9SPeter Holm
99*ef777be9SPeter Holm	if (getcwd(cwd, sizeof(cwd)) == NULL)
100*ef777be9SPeter Holm		err(1, "getcwd()");
101*ef777be9SPeter Holm	snprintf(file1, sizeof(file1), "%s/a.%06d", cwd, getpid());
102*ef777be9SPeter Holm	snprintf(file2, sizeof(file2), "%s/b.%06d", cwd, getpid());
103*ef777be9SPeter Holm	if ((fd = open(file1, O_CREAT, 0640)) == -1)
104*ef777be9SPeter Holm		err(1, "open(%s)", file1);
105*ef777be9SPeter Holm	close(fd);
106*ef777be9SPeter Holm
107*ef777be9SPeter Holm	if ((pids[0] = fork()) == 0)
108*ef777be9SPeter Holm		test0();
109*ef777be9SPeter Holm	if ((pids[1] = fork()) == 0)
110*ef777be9SPeter Holm		test1();
111*ef777be9SPeter Holm
112*ef777be9SPeter Holm	sleep(120);
113*ef777be9SPeter Holm	share[STOP] = 1;
114*ef777be9SPeter Holm
115*ef777be9SPeter Holm	if (waitpid(pids[0], NULL, 0) == -1)
116*ef777be9SPeter Holm		err(1, "waitpid(%d)", pids[0]);
117*ef777be9SPeter Holm	if (waitpid(pids[1], NULL, 0) == -1)
118*ef777be9SPeter Holm		err(1, "waitpid(%d)", pids[1]);
119*ef777be9SPeter Holm	unlink(file1);
120*ef777be9SPeter Holm	unlink(file2);
121*ef777be9SPeter Holm}
122*ef777be9SPeter HolmEOF
123*ef777be9SPeter Holmmycc -o $prog -Wall $prog.c || exit 1
124*ef777be9SPeter Holmrm -f $prog.c
125*ef777be9SPeter Holmcd $here
126*ef777be9SPeter Holm
127*ef777be9SPeter Holm(cd ../testcases/swap; ./swap -t 5m -i 20 -l 100) &
128*ef777be9SPeter Holmcd $mntpoint
129*ef777be9SPeter Holmpids=""
130*ef777be9SPeter Holmfor i in `jot 30`; do
131*ef777be9SPeter Holm	/tmp/$prog &
132*ef777be9SPeter Holm	pids="$pids $!"
133*ef777be9SPeter Holmdone
134*ef777be9SPeter Holmfor pid in $pids; do
135*ef777be9SPeter Holm	wait $pid
136*ef777be9SPeter Holmdone
137*ef777be9SPeter Holmcd $here
138*ef777be9SPeter Holmwhile pkill swap; do :; done
139*ef777be9SPeter Holmwait
140*ef777be9SPeter Holm
141*ef777be9SPeter Holmumount $mntpoint
142*ef777be9SPeter Holmmdconfig -d -u $mdstart
143*ef777be9SPeter Holmrm -f /tmp/$prog
144*ef777be9SPeter Holmexit 0
145