| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2015 Oracle, Inc. All Rights Reserved. |
| # |
| # FS QA Test No. 017 |
| # |
| # Create and populate an ext4 filesystem, corrupt a htree block, then |
| # see how the kernel and e2fsck deal with it. |
| # |
| seq=`basename $0` |
| seqres=$RESULT_DIR/$seq |
| echo "QA output created by $seq" |
| |
| here=`pwd` |
| tmp=/tmp/$$ |
| status=1 # failure is the default! |
| trap "_cleanup; exit \$status" 0 1 2 3 15 |
| |
| _cleanup() |
| { |
| cd / |
| #rm -f $tmp.* |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter |
| . ./common/attr |
| |
| # real QA test starts here |
| _supported_fs ext4 |
| |
| _require_scratch |
| test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc |
| _require_attrs |
| |
| rm -f $seqres.full |
| TESTDIR="${SCRATCH_MNT}/scratchdir" |
| TESTFILE="${TESTDIR}/testfile" |
| |
| echo "+ create scratch fs" |
| _scratch_mkfs_ext4 > /dev/null 2>&1 |
| |
| echo "+ mount fs image" |
| _scratch_mount |
| blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" |
| |
| echo "+ make some files" |
| mkdir -p "${SCRATCH_MNT}/test/" |
| for x in `seq 1 $((blksz * 4 / 256))`; do |
| fname="$(printf "%.255s\n" "$(perl -e "print \"${x}_\" x 500;")")" |
| touch "${SCRATCH_MNT}/test/${fname}" |
| done |
| umount "${SCRATCH_MNT}" |
| |
| echo "+ check fs" |
| e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" |
| |
| echo "+ corrupt image" |
| debugfs -w -R "zap -f /test 0" "${SCRATCH_DEV}" 2> /dev/null |
| |
| echo "+ mount image" |
| _scratch_mount |
| |
| echo "+ modify dirs" |
| mkdir -p "${SCRATCH_MNT}/test/newdir" 2> /dev/null && _fail "htree should be corrupt" |
| umount "${SCRATCH_MNT}" |
| |
| echo "+ repair fs" |
| e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 |
| |
| echo "+ mount image (2)" |
| _scratch_mount |
| |
| echo "+ modify dirs (2)" |
| mkdir -p "${SCRATCH_MNT}/test/newdir" || _fail "htree should not be corrupt" |
| umount "${SCRATCH_MNT}" |
| |
| echo "+ check fs (2)" |
| e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" |
| |
| status=0 |
| exit |