X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tests%2Fcommon.convert;h=1be804cf1942ac5332fcfa46301db3f6f3852cab;hb=6cedd688115d85e6f14a43f7653378749ef31624;hp=dcf0868c59af15f335ae1a9754dd432ae221ec86;hpb=c8d1c4c7920efea969fedfd6d7b0669832161d22;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/tests/common.convert b/tests/common.convert index dcf0868..1be804c 100644 --- a/tests/common.convert +++ b/tests/common.convert @@ -1,91 +1,37 @@ #!/bin/bash # helpers for btrfs-convert tests -# how many files to create. -DATASET_SIZE=50 - -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 - ;; - - fast_symlink) - for num in $(seq 1 $DATASET_SIZE); do - run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num - run_check cd $dirpath && $SUDO_HELPER ln -s $dataset_type.$num $dirpath/slink.$num && cd / - 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 - ;; - - fifo) - for num in $(seq 1 $DATASET_SIZE); do - run_check $SUDO_HELPER mkfifo $dirpath/$dataset_type.$num - done - ;; - - slow_symlink) - long_filename=`date +%s | sha256sum | cut -f1 -d'-'` - run_check $SUDO_HELPER touch $dirpath/$long_filename - for num in $(seq 1 $DATASET_SIZE); do - run_check $SUDO_HELPER ln -s $dirpath/$long_filename $dirpath/slow_slink.$num - done - ;; - esac +# mount image of converted filesystem of a given type +# $1: type of the filesystem +run_check_mount_convert_dev() +{ + local fstype + local loop_opt + + setup_root_helper + + fstype="$1" + shift + if [ -z "$fstype" ]; then + _fail "Missing source filesystem type" + fi + if [ "$fstype" = 'btrfs' ]; then + _fail "Incorrect type for converted filesystem: btrfs" + fi + + if [[ -b "$TEST_DEV" ]]; then + loop_opt="" + elif [[ -f "$TEST_DEV" ]]; then + loop_opt="-o loop" + else + _fail "Invalid \$TEST_DEV: $TEST_DEV" + fi + + [[ -d "$TEST_MNT" ]] || { + _fail "Invalid \$TEST_MNT: $TEST_MNT" + } + + run_check $SUDO_HELPER mount $loop_opt -t "$fstype" "$@" "$TEST_DEV" "$TEST_MNT" } populate_fs() { @@ -104,55 +50,74 @@ convert_test_preamble() { msg="$2" shift 3 echo " [TEST/conv] $msg, btrfs" "${features:-defaults}" - echo "creating ext image with: $@" >> $RESULTS + echo "creating test image with: $@" >> "$RESULTS" } # prepare TEST_DEV before conversion, create filesystem and mount it, image # size is 512MB -# $@: free form, command to create the filesystem, with appended -F +# $1: type of the filesystem +# $2+: free form, command to create the filesystem, with appended -F convert_test_prep_fs() { + local fstype + local force + local mountopts + + fstype="$1" + shift # 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 + 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 + run_check truncate -s 512M "$TEST_DEV" + force= + mountopts= + case "$fstype" in + ext[234]) + force=-F ;; + reiserfs) + force=-ff + mountopts="-o acl,user_xattr,attrs" ;; + *) + _fail "unknown filesystem to convert: $fstype" + esac + run_check "$@" $force "$TEST_DEV" # create a file to check btrfs-convert can convert regular file correct - run_check_mount_test_dev + run_check_mount_convert_dev "$fstype" $mountopts # 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 + of="$TEST_MNT/convert_space_holder" } # generate md5 checksums of files on $TEST_MNT # $1: path where the checksums will be stored convert_test_gen_checksums() { - local CHECKSUMTMP - CHECKSUMTMP="$1" + _assert_path "$1" - run_check $SUDO_HELPER dd if=/dev/zero of=$TEST_MNT/test bs=$nodesize \ + 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_stdout $SUDO_HELPER find "$TEST_MNT" -type f ! -name 'image' -exec md5sum {} \+ > "$1" } # list $TEST_MNT data set file permissions. # $1: path where the permissions will be stored convert_test_perm() { local PERMTMP + + _assert_path "$1" PERMTMP="$1" FILES_LIST=$(mktemp --tmpdir btrfs-progs-convert.fileslistXXXXXX) - run_check $SUDO_HELPER dd if=/dev/zero of=$TEST_MNT/test bs=$nodesize \ + 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' -fprint $FILES_LIST + run_check_stdout $SUDO_HELPER find "$TEST_MNT" -type f ! -name 'image' -fprint "$FILES_LIST" # Fix directory entries order - sort $FILES_LIST -o $FILES_LIST - for file in `cat $FILES_LIST` ;do - run_check_stdout $SUDO_HELPER getfacl --absolute-names $file >> "$PERMTMP" + sort "$FILES_LIST" -o "$FILES_LIST" + for file in `cat "$FILES_LIST"` ;do + run_check_stdout $SUDO_HELPER getfacl --absolute-names "$file" >> "$PERMTMP" done - rm -- $FILES_LIST + rm -- "$FILES_LIST" } # list acls of files on $TEST_MNT # $1: path where the acls will be stored @@ -161,22 +126,22 @@ convert_test_acl() { ACLTMP="$1" FILES_LIST=$(mktemp --tmpdir btrfs-progs-convert.fileslistXXXXXX) - run_check_stdout $SUDO_HELPER find $TEST_MNT/acls -type f -fprint $FILES_LIST + run_check_stdout $SUDO_HELPER find "$TEST_MNT/acls" -type f -fprint "$FILES_LIST" # Fix directory entries order - sort $FILES_LIST -o $FILES_LIST - for file in `cat $FILES_LIST`;do - run_check_stdout $SUDO_HELPER getfattr --absolute-names -d $file >> "$ACLTMP" + sort "$FILES_LIST" -o "$FILES_LIST" + for file in `cat "$FILES_LIST"`;do + run_check_stdout $SUDO_HELPER getfattr --absolute-names -d "$file" >> "$ACLTMP" done - rm -- $FILES_LIST + rm -- "$FILES_LIST" } # do conversion with given features and nodesize, fsck afterwards # $1: features, argument of -O, can be empty # $2: nodesize, argument of -N, can be empty convert_test_do_convert() { - run_check $TOP/btrfs-convert ${1:+-O "$1"} ${2:+-N "$2"} $TEST_DEV - run_check $TOP/btrfs check $TEST_DEV - run_check $TOP/btrfs inspect-internal dump-super -Ffa $TEST_DEV + run_check "$TOP/btrfs-convert" ${1:+-O "$1"} ${2:+-N "$2"} "$TEST_DEV" + run_check "$TOP/btrfs" check "$TEST_DEV" + run_check "$TOP/btrfs" inspect-internal dump-super -Ffa "$TEST_DEV" } # post conversion check, verify file permissions. @@ -185,21 +150,22 @@ convert_test_post_check_permissions() { local EXT_PERMTMP local BTRFS_PERMTMP + _assert_path "$1" EXT_PERMTMP="$1" BTRFS_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert.permXXXXXX) convert_test_perm "$BTRFS_PERMTMP" - btrfs_perm=`md5sum $BTRFS_PERMTMP | cut -f1 -d' '` - ext_perm=`md5sum $EXT_PERMTMP | cut -f1 -d' '` + btrfs_perm=`md5sum "$BTRFS_PERMTMP" | cut -f1 -d' '` + ext_perm=`md5sum "$EXT_PERMTMP" | cut -f1 -d' '` if [ "$btrfs_perm" != "$ext_perm" ]; then - btrfs_perm_file=`md5sum $BTRFS_PERMTMP | cut -f2 -d' '` - ext_perm_file=`md5sum $EXT_PERMTMP | cut -f2 -d' '` + btrfs_perm_file=`md5sum "$BTRFS_PERMTMP" | cut -f2 -d' '` + ext_perm_file=`md5sum "$EXT_PERMTMP" | cut -f2 -d' '` _fail "file permission failed. Mismatched BTRFS:$btrfs_perm_file:$btrfs_perm EXT:$ext_perm_file:$ext_perm" fi - rm -- $BTRFS_PERMTMP + rm -- "$BTRFS_PERMTMP" } # post conversion check, compare BTRFS file acls against EXT. # $1: file with ext acls. @@ -207,55 +173,76 @@ convert_test_post_check_acl() { local EXT_ACLTMP local BTRFS_ACLTMP + _assert_path "$1" EXT_ACLTMP="$1" BTRFS_ACLTMP=$(mktemp --tmpdir btrfs-progs-convert.aclsXXXXXXX) convert_test_acl "$BTRFS_ACLTMP" - btrfs_acl=`md5sum $BTRFS_ACLTMP | cut -f1 -d' '` - ext_acl=`md5sum $EXT_ACLTMP | cut -f1 -d' '` + btrfs_acl=`md5sum "$BTRFS_ACLTMP" | cut -f1 -d' '` + ext_acl=`md5sum "$EXT_ACLTMP" | cut -f1 -d' '` if [ "$btrfs_acl" != "$ext_acl" ] then - btrfs_acl_file=`md5sum $BTRFS_ACLTMP | cut -f2 -d' '` - ext_acl_file=`md5sum $EXT_ACLTMP | cut -f2 -d' '` + btrfs_acl_file=`md5sum "$BTRFS_ACLTMP" | cut -f2 -d' '` + ext_acl_file=`md5sum "$EXT_ACLTMP" | cut -f2 -d' '` _fail "file acl failed. Mismatched BTRFS:$btrfs_acl_file:$btrfs_acl EXT:$ext_acl_file:$ext_acl" fi - rm -- $BTRFS_ACLTMP + rm -- "$BTRFS_ACLTMP" } + # post conversion checks, verify md5sums +convert_test_post_check_checksums() { + _assert_path "$1" + run_check_stdout $SUDO_HELPER md5sum -c "$1" | + grep -q 'FAILED' && _fail "file validation failed" +} + +# post conversion checks, all three in one call, on an unmounted image # $1: file with checksums # $2: file with permissions. # $3: file with acl entries. -convert_test_post_check() { - local CHECKSUMTMP - local EXT_PERMTMP - local EXT_ACLTMP - - CHECKSUMTMP="$1" - EXT_PERMTMP="$2" - EXT_ACLTMP="$3" +convert_test_post_checks_all() { + _assert_path "$1" + _assert_path "$2" + _assert_path "$3" run_check_mount_test_dev - run_check_stdout $SUDO_HELPER md5sum -c "$CHECKSUMTMP" | - grep -q 'FAILED' && _fail "file validation failed" - convert_test_post_check_permissions "$EXT_PERMTMP" - convert_test_post_check_acl "$EXT_ACLTMP" + convert_test_post_check_checksums "$1" + convert_test_post_check_permissions "$2" + convert_test_post_check_acl "$3" + + # Create a large file to trigger data chunk allocation + generate_dataset "large" run_check_umount_test_dev } # do rollback and fsck +# $1: filesystem name or alias (ext2 includes ext3 and ext4), convert_test_post_rollback() { - run_check $TOP/btrfs-convert --rollback $TEST_DEV - run_check fsck -n -t ext2,ext3,ext4 $TEST_DEV + local types + + run_check "$TOP/btrfs-convert" --rollback "$TEST_DEV" + if [ -z "$1" ]; then + _fail "missing filesystem type to check" + fi + case "$1" in + ext[234]) types=ext2,ext3,ext4 ;; + reiserfs) types=reiserfs ;; + *) _fail "unknown filesystem type to check: $1" ;; + esac + + run_check fsck -n -t "$types" "$TEST_DEV" } # simple wrapper for a convert test -# $1: btrfs features, argument to -O -# $2: description of the test "ext2 8k nodesize" -# $3: nodesize value -# $4 + rest: command to create the ext2 image +# $1: type of the converted filesystem +# $2: btrfs features, argument to -O +# $3: description of the test "ext2 8k nodesize" +# $4: nodesize value +# $5 + rest: command to create the ext2 image convert_test() { + local fstype local features local nodesize local msg @@ -263,12 +250,13 @@ convert_test() { local EXT_PERMTMP local EXT_ACLTMP - features="$1" - msg="$2" - nodesize="$3" - shift 3 + fstype="$1" + features="$2" + msg="$3" + nodesize="$4" + shift 4 convert_test_preamble "$features" "$msg" "$nodesize" "$@" - convert_test_prep_fs "$@" + convert_test_prep_fs "$fstype" "$@" populate_fs CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert.XXXXXXXXXX) EXT_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert.permXXXXXX) @@ -280,10 +268,24 @@ convert_test() { run_check_umount_test_dev convert_test_do_convert "$features" "$nodesize" - convert_test_post_check "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP" - rm $CHECKSUMTMP - rm $EXT_PERMTMP - rm $EXT_ACLTMP + convert_test_post_checks_all "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP" + rm -- "$CHECKSUMTMP" + rm -- "$EXT_PERMTMP" + rm -- "$EXT_ACLTMP" + + convert_test_post_rollback "$fstype" +} + +load_module_reiserfs() +{ + $SUDO_HELPER modprobe reiserfs +} - convert_test_post_rollback +check_kernel_support_reiserfs() +{ + if ! grep -iq 'reiserfs' /proc/filesystems; then + echo "WARNING: reiserfs filesystem not listed in /proc/filesystems, some tests might be skipped" + return 1 + fi + return 0 }