mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-15 19:05:50 +00:00
fde5ae2e49
Add support for custom convert test scripts, just like fsck tests. Instead of generic convert tests, we need more specifically created images for new convert tests. This patch provide the needed infrastructure for later convert test cases. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
207 lines
6.1 KiB
Bash
Executable File
207 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# convert ext2/3/4 images to btrfs images, and make sure the results are
|
|
# clean.
|
|
#
|
|
|
|
unset TOP
|
|
unset LANG
|
|
LANG=C
|
|
SCRIPT_DIR=$(dirname $(readlink -f $0))
|
|
TOP=$(readlink -f $SCRIPT_DIR/../)
|
|
RESULTS="$TOP/tests/convert-tests-results.txt"
|
|
# how many files to create.
|
|
DATASET_SIZE=50
|
|
|
|
source $TOP/tests/common
|
|
|
|
# Allow child test to use $TOP and $RESULTS
|
|
export TOP
|
|
export RESULTS
|
|
export LANG
|
|
|
|
rm -f $RESULTS
|
|
|
|
setup_root_helper
|
|
prepare_test_dev 512M
|
|
|
|
CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert.XXXXXXXXXX)
|
|
|
|
run_one_test() {
|
|
local testname
|
|
|
|
testname="$1"
|
|
echo " [TEST/conv] $testname"
|
|
cd $testname
|
|
echo "=== Entering $testname" >> $RESULTS
|
|
if [ -x test.sh ]; then
|
|
# Difference convert test case needs different tools to restore
|
|
# and check image, so only support custom test scripts
|
|
./test.sh
|
|
if [ $? -ne 0 ]; then
|
|
_fail "test failed for case $(basename $testname)"
|
|
fi
|
|
else
|
|
_fail "custom test script not found"
|
|
fi
|
|
}
|
|
|
|
generate_dataset() {
|
|
|
|
dataset_type="$1"
|
|
dirpath=$TEST_MNT/$dataset_type
|
|
run_check $SUDO_HELPER mkdir -p $dirpath
|
|
|
|
case $dataset_type in
|
|
small)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
|
|
count=1 >/dev/null 2>&1
|
|
done
|
|
;;
|
|
|
|
hardlink)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
|
|
run_check $SUDO_HELPER ln $dirpath/$dataset_type.$num $dirpath/hlink.$num
|
|
done
|
|
;;
|
|
|
|
symlink)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
|
|
run_check $SUDO_HELPER ln -s $dirpath/$dataset_type.$num $dirpath/slink.$num
|
|
done
|
|
;;
|
|
|
|
brokenlink)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER ln -s $dirpath/$dataset_type.$num $dirpath/blink.$num
|
|
done
|
|
;;
|
|
|
|
perm)
|
|
for modes in 777 775 755 750 700 666 664 644 640 600 444 440 400 000 \
|
|
1777 1775 1755 1750 1700 1666 1664 1644 1640 1600 1444 1440 1400 1000 \
|
|
2777 2775 2755 2750 2700 2666 2664 2644 2640 2600 2444 2440 2400 2000 \
|
|
4777 4775 4755 4750 4700 4666 4664 4644 4640 4600 4444 4440 4400 4000; do
|
|
if [[ "$modes" == *9* ]] || [[ "$modes" == *8* ]]
|
|
then
|
|
continue;
|
|
else
|
|
run_check $SUDO_HELPER touch $dirpath/$dataset_type.$modes
|
|
run_check $SUDO_HELPER chmod $modes $dirpath/$dataset_type.$modes
|
|
fi
|
|
done
|
|
;;
|
|
|
|
sparse)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
|
|
count=1 >/dev/null 2>&1
|
|
run_check $SUDO_HELPER truncate -s 500K $dirpath/$dataset_type.$num
|
|
run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
|
|
oflag=append conv=notrunc count=1 >/dev/null 2>&1
|
|
run_check $SUDO_HELPER truncate -s 800K $dirpath/$dataset_type.$num
|
|
done
|
|
;;
|
|
|
|
acls)
|
|
for num in $(seq 1 $DATASET_SIZE); do
|
|
run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
|
|
run_check $SUDO_HELPER setfacl -m "u:root:x" $dirpath/$dataset_type.$num
|
|
run_check $SUDO_HELPER setfattr -n user.foo -v bar$num $dirpath/$dataset_type.$num
|
|
done
|
|
;;
|
|
esac
|
|
}
|
|
|
|
populate_fs() {
|
|
|
|
for dataset_type in 'small' 'hardlink' 'symlink' 'brokenlink' 'perm' 'sparse' 'acls'; do
|
|
generate_dataset "$dataset_type"
|
|
done
|
|
}
|
|
|
|
convert_test() {
|
|
local features
|
|
local nodesize
|
|
|
|
features="$1"
|
|
shift
|
|
|
|
if [ -z "$features" ]; then
|
|
echo " [TEST/conv] $1, btrfs defaults"
|
|
else
|
|
echo " [TEST/conv] $1, btrfs $features"
|
|
fi
|
|
nodesize=$2
|
|
shift 2
|
|
echo "creating ext image with: $*" >> $RESULTS
|
|
# TEST_DEV not removed as the file might have special permissions, eg.
|
|
# when test image is on NFS and would not be writable for root
|
|
run_check truncate -s 0 $TEST_DEV
|
|
# 256MB is the smallest acceptable btrfs image.
|
|
run_check truncate -s 512M $TEST_DEV
|
|
run_check $* -F $TEST_DEV
|
|
|
|
# create a file to check btrfs-convert can convert regular file
|
|
# correct
|
|
run_check_mount_test_dev
|
|
|
|
# create a file inside the fs before convert, to make sure there is
|
|
# data covering btrfs backup superblock range (64M)
|
|
run_check $SUDO_HELPER dd if=/dev/zero bs=1M count=64 \
|
|
of=$TEST_MNT/convert_space_holder
|
|
|
|
populate_fs
|
|
run_check $SUDO_HELPER dd if=/dev/zero of=$TEST_MNT/test bs=$nodesize \
|
|
count=1 >/dev/null 2>&1
|
|
run_check_stdout $SUDO_HELPER find $TEST_MNT -type f ! -name 'image' -exec md5sum {} \+ > $CHECKSUMTMP
|
|
run_check_umount_test_dev
|
|
|
|
run_check $TOP/btrfs-convert ${features:+-O "$features"} -N "$nodesize" $TEST_DEV
|
|
run_check $TOP/btrfs check $TEST_DEV
|
|
run_check $TOP/btrfs-show-super -Ffa $TEST_DEV
|
|
|
|
run_check_mount_test_dev
|
|
run_check_stdout $SUDO_HELPER md5sum -c $CHECKSUMTMP |
|
|
grep -q 'FAILED' && _fail "file validation failed."
|
|
run_check_umount_test_dev
|
|
|
|
run_check $TOP/btrfs-convert --rollback $TEST_DEV
|
|
run_check fsck -n -t ext2,ext3,ext4 $TEST_DEV
|
|
}
|
|
|
|
if ! [ -z "$TEST" ]; then
|
|
echo " [TEST/conv] skipped all convert tests, TEST=$TEST"
|
|
exit 0
|
|
fi
|
|
|
|
for feature in '' 'extref' 'skinny-metadata' 'no-holes'; do
|
|
convert_test "$feature" "ext2 4k nodesize" 4096 mke2fs -b 4096
|
|
convert_test "$feature" "ext3 4k nodesize" 4096 mke2fs -j -b 4096
|
|
convert_test "$feature" "ext4 4k nodesize" 4096 mke2fs -t ext4 -b 4096
|
|
convert_test "$feature" "ext2 8k nodesize" 8192 mke2fs -b 4096
|
|
convert_test "$feature" "ext3 8k nodesize" 8192 mke2fs -j -b 4096
|
|
convert_test "$feature" "ext4 8k nodesize" 8192 mke2fs -t ext4 -b 4096
|
|
convert_test "$feature" "ext2 16k nodesize" 16384 mke2fs -b 4096
|
|
convert_test "$feature" "ext3 16k nodesize" 16384 mke2fs -j -b 4096
|
|
convert_test "$feature" "ext4 16k nodesize" 16384 mke2fs -t ext4 -b 4096
|
|
convert_test "$feature" "ext2 32k nodesize" 32768 mke2fs -b 4096
|
|
convert_test "$feature" "ext3 32k nodesize" 32768 mke2fs -j -b 4096
|
|
convert_test "$feature" "ext4 32k nodesize" 32768 mke2fs -t ext4 -b 4096
|
|
convert_test "$feature" "ext2 64k nodesize" 65536 mke2fs -b 4096
|
|
convert_test "$feature" "ext3 64k nodesize" 65536 mke2fs -j -b 4096
|
|
convert_test "$feature" "ext4 64k nodesize" 65536 mke2fs -t ext4 -b 4096
|
|
done
|
|
|
|
# Test special images
|
|
for i in $(find $TOP/tests/convert-tests -maxdepth 1 -mindepth 1 -type d \
|
|
${TEST:+-name "$TEST"} | sort)
|
|
do
|
|
run_one_test "$i"
|
|
done
|
|
|
|
rm $CHECKSUMTMP
|