1*ce7b20e5SPeter Holm#!/bin/sh 2*ce7b20e5SPeter Holm 3*ce7b20e5SPeter Holm# 4*ce7b20e5SPeter Holm# SPDX-License-Identifier: BSD-2-Clause 5*ce7b20e5SPeter Holm# 6*ce7b20e5SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org> 7*ce7b20e5SPeter Holm# 8*ce7b20e5SPeter Holm# Redistribution and use in source and binary forms, with or without 9*ce7b20e5SPeter Holm# modification, are permitted provided that the following conditions 10*ce7b20e5SPeter Holm# are met: 11*ce7b20e5SPeter Holm# 1. Redistributions of source code must retain the above copyright 12*ce7b20e5SPeter Holm# notice, this list of conditions and the following disclaimer. 13*ce7b20e5SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 14*ce7b20e5SPeter Holm# notice, this list of conditions and the following disclaimer in the 15*ce7b20e5SPeter Holm# documentation and/or other materials provided with the distribution. 16*ce7b20e5SPeter Holm# 17*ce7b20e5SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*ce7b20e5SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*ce7b20e5SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*ce7b20e5SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*ce7b20e5SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*ce7b20e5SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*ce7b20e5SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*ce7b20e5SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*ce7b20e5SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*ce7b20e5SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*ce7b20e5SPeter Holm# SUCH DAMAGE. 28*ce7b20e5SPeter Holm# 29*ce7b20e5SPeter Holm 30*ce7b20e5SPeter Holm# Snapshot test 31*ce7b20e5SPeter Holm# Variation of force13.sh, but uses "gnop -f destroy" 32*ce7b20e5SPeter Holm 33*ce7b20e5SPeter Holm# Seen: 34*ce7b20e5SPeter Holm# UFS: forcibly unmounting /dev/md10.nop from /mnt 35*ce7b20e5SPeter Holm# panic: flush_pagedep_deps: failed to flush inodedep 36*ce7b20e5SPeter Holm 37*ce7b20e5SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 38*ce7b20e5SPeter Holm. ../default.cfg 39*ce7b20e5SPeter Holm 40*ce7b20e5SPeter Holmset -u 41*ce7b20e5SPeter Holmlog=/tmp/gnop13.sh.log 42*ce7b20e5SPeter Holmmount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint 43*ce7b20e5SPeter Holmmdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart 44*ce7b20e5SPeter Holmtruncate -s 10g $diskimage 45*ce7b20e5SPeter Holmmdconfig -a -t vnode -f $diskimage -u $mdstart 46*ce7b20e5SPeter Holmflags=$newfs_flags 47*ce7b20e5SPeter Holm[ `jot -r 1 0 1` -eq 1 ] && flags="-j" 48*ce7b20e5SPeter Holm 49*ce7b20e5SPeter Holmecho "newfs $flags md$mdstart" 50*ce7b20e5SPeter Holmnewfs $flags md$mdstart > /dev/null 2>&1 51*ce7b20e5SPeter Holm 52*ce7b20e5SPeter Holm# Exclude rename for now due to log0374.txt 53*ce7b20e5SPeter Holmexport TESTPROGS=`cd ..; find testcases/ -perm -1 -type f | \ 54*ce7b20e5SPeter Holm egrep -Ev "/run/|/badcode/|/pty/|/shm/|/socket/|sysctl|tcp|thr|udp|rename"` 55*ce7b20e5SPeter Holmexport runRUNTIME=3m 56*ce7b20e5SPeter Holmexport RUNDIR=$mntpoint/stressX 57*ce7b20e5SPeter Holmexport CTRLDIR=$mntpoint/stressX.control 58*ce7b20e5SPeter Holmstart=`date +%s` 59*ce7b20e5SPeter Holmwhile [ $((`date +%s` - start)) -lt $((15 * 60)) ]; do 60*ce7b20e5SPeter Holm gnop create /dev/md$mdstart || exit 1 61*ce7b20e5SPeter Holm mount /dev/md$mdstart.nop $mntpoint || exit 1 62*ce7b20e5SPeter Holm rm -fr $mntpoint/lost+found 63*ce7b20e5SPeter Holm chmod 777 $mntpoint 64*ce7b20e5SPeter Holm 65*ce7b20e5SPeter Holm su $testuser -c 'cd ..; ./testcases/run/run $TESTPROGS' > \ 66*ce7b20e5SPeter Holm /dev/null 2>&1 & 67*ce7b20e5SPeter Holm 68*ce7b20e5SPeter Holm t=`jot -r 1 60 120` 69*ce7b20e5SPeter Holm st=`date +%s` 70*ce7b20e5SPeter Holm for i in `jot 10`; do 71*ce7b20e5SPeter Holm [ -d $mntpoint/.snap ] || break 72*ce7b20e5SPeter Holm rm -f $mntpoint/.snap/$i 73*ce7b20e5SPeter Holm echo "mksnap_ffs $mntpoint $mntpoint/.snap/$i" 74*ce7b20e5SPeter Holm mksnap_ffs $mntpoint $mntpoint/.snap/$i 75*ce7b20e5SPeter Holm sleep `jot -r 1 1 5` 76*ce7b20e5SPeter Holm [ $((`date +%s` - st)) -ge $t ] && break 77*ce7b20e5SPeter Holm done & 78*ce7b20e5SPeter Holm sleep `jot -r 1 60 120` 79*ce7b20e5SPeter Holm while [ -c /dev/md$mdstart.nop ]; do 80*ce7b20e5SPeter Holm echo "gnop destroy -f /dev/md$mdstart.nop" 81*ce7b20e5SPeter Holm gnop destroy -f /dev/md$mdstart.nop || sleep 1 82*ce7b20e5SPeter Holm done 83*ce7b20e5SPeter Holm n=0 84*ce7b20e5SPeter Holm st=`date +%s` 85*ce7b20e5SPeter Holm while mount | grep -q "on $mntpoint "; do 86*ce7b20e5SPeter Holm [ $n -eq 0 ] && /bin/echo -n "Waiting for $mntpoint to force umount ..." 87*ce7b20e5SPeter Holm n=$((n + 1)) 88*ce7b20e5SPeter Holm sleep 2 89*ce7b20e5SPeter Holm if [ $((`date +%s` - st)) -ge 180 ]; then 90*ce7b20e5SPeter Holm echo "Giving up on waiting for umount of $mntpoint" 91*ce7b20e5SPeter Holm umount $mntpoint || umount -f $mntpoint 92*ce7b20e5SPeter Holm break 93*ce7b20e5SPeter Holm fi 94*ce7b20e5SPeter Holm done 95*ce7b20e5SPeter Holm [ $n -ne 0 ] && echo 96*ce7b20e5SPeter Holm 97*ce7b20e5SPeter Holm ../tools/killall.sh 98*ce7b20e5SPeter Holm wait 99*ce7b20e5SPeter Holm mount | grep -q "on $mntpoint " && umount -f $mntpoint 100*ce7b20e5SPeter Holm c=0 101*ce7b20e5SPeter Holm # Run fsck minimum two times 102*ce7b20e5SPeter Holm for i in `jot 5`; do 103*ce7b20e5SPeter Holm fsck_ffs -fy /dev/md$mdstart > $log 2>&1; s=$? 104*ce7b20e5SPeter Holm grep -q CLEAN $log && grep -q "MODIFIED" $log && c=$((c+=1)) 105*ce7b20e5SPeter Holm grep -Eq "FILE SYSTEM WAS MODIFIED" $log || break 106*ce7b20e5SPeter Holm done 107*ce7b20e5SPeter Holm [ $c -gt 1 ] && 108*ce7b20e5SPeter Holm { echo "Note: FS marked clean+modified $c times out of $i fsck runs"; s=101; } 109*ce7b20e5SPeter Holm [ $s -ne 0 ] && break 110*ce7b20e5SPeter Holm grep -Eq "IS CLEAN|MARKED CLEAN" $log || { s=102; break; } 111*ce7b20e5SPeter Holmdone 112*ce7b20e5SPeter Holm[ $s -eq 101 ] && s=0 # Ignore CLEANish problem for now 113*ce7b20e5SPeter Holmif [ $s -eq 0 ]; then 114*ce7b20e5SPeter Holm mount /dev/md$mdstart.nop $mntpoint 115*ce7b20e5SPeter Holm cp -R /usr/include $mntpoint 116*ce7b20e5SPeter Holm dd if=/dev/zero of=$mntpoint/big bs=1m count=10 status=none 117*ce7b20e5SPeter Holm find $mntpoint/* -delete 118*ce7b20e5SPeter Holm 119*ce7b20e5SPeter Holm # Check the RO snapshots 120*ce7b20e5SPeter Holm for f in $mntpoint/.snap/*; do 121*ce7b20e5SPeter Holm c=0 122*ce7b20e5SPeter Holm for i in `jot 5`; do 123*ce7b20e5SPeter Holm echo "fsck_ffs -fy $f" 124*ce7b20e5SPeter Holm fsck_ffs -fy $f > $log 2>&1; s=$? 125*ce7b20e5SPeter Holm grep -q CLEAN $log && grep -q "MODIFIED" $log && c=$((c+=1)) 126*ce7b20e5SPeter Holm grep -Eq "FILE SYSTEM WAS MODIFIED" $log || break 127*ce7b20e5SPeter Holm done 128*ce7b20e5SPeter Holm [ $c -gt 1 ] && 129*ce7b20e5SPeter Holm { echo "Note: snapshot $i marked clean+modified $c times out of $i fsck runs"; s=201; } 130*ce7b20e5SPeter Holm [ $s -ne 0 ] && break 131*ce7b20e5SPeter Holm grep -Eq "IS CLEAN|MARKED CLEAN" $log || 132*ce7b20e5SPeter Holm { s=202; tail -10 $log; break; } 133*ce7b20e5SPeter Holm done 134*ce7b20e5SPeter Holm umount $mntpoint 135*ce7b20e5SPeter Holm mdconfig -d -u $mdstart 136*ce7b20e5SPeter Holm rm -f $diskimage $log 137*ce7b20e5SPeter Holmfi 138*ce7b20e5SPeter Holmexit $s 139