1*a953ac19SPeter Holm#!/bin/sh 2*a953ac19SPeter Holm 3*a953ac19SPeter Holm# 4*a953ac19SPeter Holm# SPDX-License-Identifier: BSD-2-Clause 5*a953ac19SPeter Holm# 6*a953ac19SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org> 7*a953ac19SPeter Holm# 8*a953ac19SPeter Holm# Redistribution and use in source and binary forms, with or without 9*a953ac19SPeter Holm# modification, are permitted provided that the following conditions 10*a953ac19SPeter Holm# are met: 11*a953ac19SPeter Holm# 1. Redistributions of source code must retain the above copyright 12*a953ac19SPeter Holm# notice, this list of conditions and the following disclaimer. 13*a953ac19SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 14*a953ac19SPeter Holm# notice, this list of conditions and the following disclaimer in the 15*a953ac19SPeter Holm# documentation and/or other materials provided with the distribution. 16*a953ac19SPeter Holm# 17*a953ac19SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*a953ac19SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*a953ac19SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*a953ac19SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*a953ac19SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*a953ac19SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*a953ac19SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*a953ac19SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*a953ac19SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*a953ac19SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*a953ac19SPeter Holm# SUCH DAMAGE. 28*a953ac19SPeter Holm# 29*a953ac19SPeter Holm 30*a953ac19SPeter Holm# fsck -B test scenario with SUJ. -B implies "preen mode". 31*a953ac19SPeter Holm 32*a953ac19SPeter Holm# 'panic: ffs_blkfree_cg: bad size' seen: 33*a953ac19SPeter Holm# https://people.freebsd.org/~pho/stress/log/log0465.txt 34*a953ac19SPeter Holm# Fixed by: 220427da0e9b - Set UFS/FFS file type to snapshot before changing 35*a953ac19SPeter Holm# its block pointers. 36*a953ac19SPeter Holm 37*a953ac19SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 38*a953ac19SPeter Holm. ../default.cfg 39*a953ac19SPeter Holmmycc -o /tmp/flip -Wall -Wextra ../tools/flip.c || exit 2 40*a953ac19SPeter Holm 41*a953ac19SPeter Holmset -e 42*a953ac19SPeter Holmmd=/dev/md$mdstart 43*a953ac19SPeter Holmprog=$(basename "$0" .sh) 44*a953ac19SPeter Holmbackup=/tmp/$prog.sh.diskimage.`date +%Y%m%dT%H%M%S`.gz 45*a953ac19SPeter Holmlog=/tmp/$prog.sh.log 46*a953ac19SPeter Holm[ -c $md ] && mdconfig -d -u $mdstart 47*a953ac19SPeter Holmdd if=/dev/zero of=$diskimage bs=128m count=1 status=none 48*a953ac19SPeter Holmmdconfig -a -t vnode -f $diskimage -u $mdstart 49*a953ac19SPeter Holmbackups=`newfs -N $j $md | grep -A1 "super-block backups" | \ 50*a953ac19SPeter Holm tail -1 | sed 's/,//g'` 51*a953ac19SPeter Holmnewfs -j $md > /dev/null 2>&1 52*a953ac19SPeter Holmmount $md $mntpoint 53*a953ac19SPeter Holmset +e 54*a953ac19SPeter Holm 55*a953ac19SPeter Holmjot 5000 | xargs -P0 -I% touch $mntpoint/a% 56*a953ac19SPeter Holmwhile ! umount $mntpoint; do :; done 57*a953ac19SPeter Holm/tmp/flip -n 10 $diskimage 58*a953ac19SPeter Holmgzip < $diskimage > $backup 59*a953ac19SPeter Holmfsync $diskimage $backup 60*a953ac19SPeter Holm 61*a953ac19SPeter Holmmount -f $md $mntpoint 62*a953ac19SPeter Holm 63*a953ac19SPeter Holmif ! fsck_ffs -B $md > $log 2>&1; then 64*a953ac19SPeter Holm grep MANUALLY $log 65*a953ac19SPeter Holm umount $mntpoint 66*a953ac19SPeter Holm fsck_ffs -fy $md > $log 2>&1; s=$? 67*a953ac19SPeter Holm grep -Eq "IS CLEAN|MARKED CLEAN" $log || { 68*a953ac19SPeter Holm cat $log 69*a953ac19SPeter Holm echo "fsck_ffs -f failed with exit code $s" 70*a953ac19SPeter Holm umount $mntpoint; mdconfig -d -u $mdstart 71*a953ac19SPeter Holm rm -f $log /tmp/flip $diskimage $backup 72*a953ac19SPeter Holm exit 1 73*a953ac19SPeter Holm } 74*a953ac19SPeter Holm mount $md $mntpoint 75*a953ac19SPeter Holmfi 76*a953ac19SPeter Holm 77*a953ac19SPeter Holmjot 5000 | xargs -P0 -I% rm $mntpoint/a% 78*a953ac19SPeter Holmjot 5000 | xargs -P0 -I% touch $mntpoint/b% 79*a953ac19SPeter Holm 80*a953ac19SPeter Holmls -lR $mntpoint > /dev/null || { 81*a953ac19SPeter Holm echo "ls -lR $mntpoint failed after fsck -B" 82*a953ac19SPeter Holm umount $mntpoint; mdconfig -d -u $mdstart 83*a953ac19SPeter Holm rm -f $log /tmp/flip $diskimage $backup 84*a953ac19SPeter Holm exit 0 # For now, ignore non fatal errors 85*a953ac19SPeter Holm} 86*a953ac19SPeter Holm 87*a953ac19SPeter Holmjot 5000 | xargs -P0 -I% rm $mntpoint/b% || { 88*a953ac19SPeter Holm echo "clean failed" 89*a953ac19SPeter Holm umount $mntpoint; mdconfig -d -u $mdstart 90*a953ac19SPeter Holm rm -f $log /tmp/flip $diskimage $backup 91*a953ac19SPeter Holm exit 0 # For now, ignore non fatal errors 92*a953ac19SPeter Holm} 93*a953ac19SPeter Holmumount $mntpoint 94*a953ac19SPeter Holm 95*a953ac19SPeter Holmr=0 96*a953ac19SPeter Holmfor i in `jot 4`; do 97*a953ac19SPeter Holm fsck_ffs -fy $diskimage > $log 2>&1; r=$? 98*a953ac19SPeter Holm if grep -qiE "super-?block.*failed" $log; then 99*a953ac19SPeter Holm for b in $backups; do 100*a953ac19SPeter Holm echo "fsck_ffs -b $b -fy $diskimage" 101*a953ac19SPeter Holm fsck_ffs -b $b -fy $diskimage > $log 2>&1 102*a953ac19SPeter Holm r=$? 103*a953ac19SPeter Holm grep -qiE "super-?block.*failed" $log || 104*a953ac19SPeter Holm break 105*a953ac19SPeter Holm echo "Checking next SB" 106*a953ac19SPeter Holm done 107*a953ac19SPeter Holm fi 108*a953ac19SPeter Holm [ $r -ne 0 ] && continue 109*a953ac19SPeter Holm grep -Eq "WAS MODIFIED" $log && continue 110*a953ac19SPeter Holm grep -Eq "CLEAN" $log && break 111*a953ac19SPeter Holmdone 112*a953ac19SPeter Holmmount $md $mntpoint || exit 3 113*a953ac19SPeter Holmls -lR $mntpoint > /dev/null || { umount $mntpoint; mdconfig -d -u mdstart; echo "exit 4"; exit 4; } 114*a953ac19SPeter Holmumount $mntpoint 115*a953ac19SPeter Holmfsck_ffs -fy $md > $log 2>&1 116*a953ac19SPeter Holmgrep -Eq 'IS CLEAN|MARKED CLEAN' $log && s=0 || { s=1; cat $log; } 117*a953ac19SPeter Holmmdconfig -d -u $mdstart 118*a953ac19SPeter Holmrm -f $log /tmp/flip $diskimage $backup 119*a953ac19SPeter Holmexit $s 120