#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2015 Oracle, Inc. All Rights Reserved. # # FS QA Test No. 010 # # Create and populate an ext4 filesystem, corrupt an inode bitmap, then # see how the kernel and e2fsck deal with it. # . ./common/preamble _begin_fstest fuzzers # Override the default cleanup function. _cleanup() { cd / #rm -f $tmp.* } # Import common functions. . ./common/filter . ./common/attr # real QA test starts here _supported_fs ext4 _require_scratch _require_dumpe2fs test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc _require_attrs _require_command "$RESIZE2FS_PROG" resize2fs TESTDIR="${SCRATCH_MNT}/scratchdir" TESTFILE="${TESTDIR}/testfile" echo "+ create scratch fs" _scratch_mkfs_ext4 > /dev/null 2>&1 $DUMPE2FS_PROG -g "${SCRATCH_DEV}" > /dev/null 2>&1 || _notrun "dumpe2fs -g not supported" $RESIZE2FS_PROG -M "${SCRATCH_DEV}" >> $seqres.full 2>&1 nr_groups="$($DUMPE2FS_PROG -g "${SCRATCH_DEV}" 2> /dev/null | tail -n 1 | cut -d : -f 1)" echo "+ mount fs image" _scratch_mount echo "+ make some files" # abuse orlov allocator in the hopes that each bg ends up with some inodes for i in `seq 1 $((nr_groups * 8))`; do mkdir -p "${SCRATCH_MNT}/d_${i}" done umount "${SCRATCH_MNT}" echo "+ check fs" e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" echo "+ corrupt image" $DUMPE2FS_PROG -g "${SCRATCH_DEV}" 2>/dev/null | awk -F ':' '{if (int($6) > 0) {print $6}}' | while read blk; do debugfs -w -n -R "zap_block ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "inode bitmap fuzz failed" done echo "+ mount image" _scratch_mount echo "+ modify files" touch "${SCRATCH_MNT}/file0" > /dev/null 2>&1 && _fail "touch should fail" umount "${SCRATCH_MNT}" echo "+ repair fs" e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 echo "+ mount image (2)" _scratch_mount echo "+ modify files (2)" touch "${SCRATCH_MNT}/file1" umount "${SCRATCH_MNT}" echo "+ check fs (2)" e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" status=0 exit