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