btrfs-progs/tests/fsck-tests/012-leaf-corruption/test.sh

113 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
source $TOP/tests/common
# Check file list for leaf corruption, no regular/preallocated
# file extent case.
# Corrupted leaf is 20832256, which contains inode 1862~1872
#
# 1862, ref from leaf 20828160 key 24(DIR_ITEM)
# 1863, ref from leaf 605388 item key 11(DIR_ITEM)
# 1864, no ref to rebuild, no need to rebuild
# 1865, ref from leaf 19767296 key 23(DIR_ITEM)
# 1866-1868 no ref to rebuild, all refs in corrupted leaf
# 1869, ref from leaf 4976640 key 22(DIR_ITEM)
# 1870 no ref to rebuild, all refs in corrupted leaf
# 1871, ref from leaf 19746816 key 38(DIR_ITEM)
# 1872, ref from leaf 19767296 key 14(DIR_ITEM)
# The list format is:
# INO SIZE MODE NAME
# INO: inode number
# SIZE: file size, only checked for regular file
# MODE: raw file mode, get from stat
# NAME: file name
leaf_no_data_ext_list=(
1862 0 40700 "install.d"
1862 0 40700 "install.d"
1863 0 40700 "gdb"
1865 0 40700 "iptables"
1869 0 40700 "snmp"
1871 0 100700 "machine-id"
1872 0 100700 "adjtime"
)
generate_leaf_corrupt_no_data_ext()
{
dest=$1
echo "generating leaf_corrupt_no_data_ext.btrfs-image" >> $RESULTS
tar --no-same-owner -xJf ./no_data_extent.tar.xz || \
_fail "failed to extract leaf_corrupt_no_data_ext.btrfs-image"
$TOP/btrfs-image -r test.img.btrfs-image $dest || \
_fail "failed to extract leaf_corrupt_no_data_ext.btrfs-image"
# leaf at 20832256 contains no regular data extent, clear its csum to
# corrupt the leaf.
dd if=/dev/zero of=$dest bs=1 count=32 conv=notrunc seek=20832256 \
1>/dev/null 2>&1
}
check_inode()
{
path=$1
ino=$2
size=$3
mode=$4
name=$5
# Check whether the inode exists
exists=$($SUDO_HELPER find $path -inum $ino)
if [ -z "$exists" ]; then
_fail "inode $ino not recovered correctly"
fi
# Check inode type
found_mode=$(printf "%o" 0x$($SUDO_HELPER stat $exists -c %f))
if [ $found_mode -ne $mode ]; then
echo "$found_mode"
_fail "inode $ino modes not recovered"
fi
# Check inode size
found_size=$($SUDO_HELPER stat $exists -c %s)
if [ $mode -ne 41700 -a $found_size -ne $size ]; then
_fail "inode $ino size not recovered correctly"
fi
# Check inode name
if [ "$(basename $exists)" != "$name" ]; then
_fail "inode $ino name not recovered correctly"
else
return 0
fi
}
# Check salvaged data in the recovered image
check_leaf_corrupt_no_data_ext()
{
image=$1
$SUDO_HELPER mount -o loop $image -o ro $TEST_MNT
i=0
while [ $i -lt ${#leaf_no_data_ext_list[@]} ]; do
check_inode $TEST_MNT/lost+found \
${leaf_no_data_ext_list[i]} \
${leaf_no_data_ext_list[i + 1]} \
${leaf_no_data_ext_list[i + 2]} \
${leaf_no_data_ext_list[i + 3]} \
${leaf_no_data_ext_list[i + 4]}
((i+=4))
done
$SUDO_HELPER umount $TEST_MNT
}
setup_root_helper
generate_leaf_corrupt_no_data_ext test.img
check_image test.img
check_leaf_corrupt_no_data_ext test.img
rm test.img
rm test.img.btrfs-image
# Not used, its function is the same as generate_leaf_corrupt_no_data_ext()
rm generate_image.sh