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