xref: /freebsd/tools/test/stress2/misc/fsck14.sh (revision a953ac19dbc890a08b6b267f9572dc5974dbc8ad)
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