| #!/bin/bash |
| # helpers for btrfs-convert tests |
| |
| populate_fs() { |
| |
| for dataset_type in 'small' 'hardlink' 'fast_symlink' 'brokenlink' 'perm' 'sparse' 'acls' 'fifo' 'slow_symlink'; do |
| generate_dataset "$dataset_type" |
| done |
| } |
| |
| # verbose message before the test, same arguments as convert_test |
| convert_test_preamble() { |
| local features |
| local msg |
| |
| features="$1" |
| msg="$2" |
| shift 3 |
| echo " [TEST/conv] $msg, btrfs" "${features:-defaults}" |
| echo "creating ext 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 |
| convert_test_prep_fs() { |
| # 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" |
| } |
| |
| # generate md5 checksums of files on $TEST_MNT |
| # $1: path where the checksums will be stored |
| convert_test_gen_checksums() { |
| _assert_path "$1" |
| |
| 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 {} \+ > "$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" \ |
| count=1 >/dev/null 2>&1 |
| 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" |
| done |
| rm -- "$FILES_LIST" |
| } |
| # list acls of files on $TEST_MNT |
| # $1: path where the acls will be stored |
| convert_test_acl() { |
| local ACLSTMP |
| ACLTMP="$1" |
| FILES_LIST=$(mktemp --tmpdir btrfs-progs-convert.fileslistXXXXXX) |
| |
| 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" |
| done |
| 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" |
| } |
| |
| # post conversion check, verify file permissions. |
| # $1: file with ext permissions. |
| 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' '` |
| |
| if [ "$btrfs_perm" != "$ext_perm" ]; |
| then |
| 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" |
| } |
| # post conversion check, compare BTRFS file acls against EXT. |
| # $1: file with ext acls. |
| 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' '` |
| |
| if [ "$btrfs_acl" != "$ext_acl" ] |
| then |
| 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" |
| } |
| |
| # 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_checks_all() { |
| _assert_path "$1" |
| _assert_path "$2" |
| _assert_path "$3" |
| |
| run_check_mount_test_dev |
| 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 |
| convert_test_post_rollback() { |
| run_check "$TOP/btrfs-convert" --rollback "$TEST_DEV" |
| run_check fsck -n -t ext2,ext3,ext4 "$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 |
| convert_test() { |
| local features |
| local nodesize |
| local msg |
| local CHECKSUMTMP |
| local EXT_PERMTMP |
| local EXT_ACLTMP |
| |
| features="$1" |
| msg="$2" |
| nodesize="$3" |
| shift 3 |
| convert_test_preamble "$features" "$msg" "$nodesize" "$@" |
| convert_test_prep_fs "$@" |
| populate_fs |
| CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert.XXXXXXXXXX) |
| EXT_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert.permXXXXXX) |
| EXT_ACLTMP=$(mktemp --tmpdir btrfs-progs-convert.aclsXXXXXXX) |
| convert_test_gen_checksums "$CHECKSUMTMP" |
| convert_test_perm "$EXT_PERMTMP" |
| convert_test_acl "$EXT_ACLTMP" |
| |
| run_check_umount_test_dev |
| |
| convert_test_do_convert "$features" "$nodesize" |
| convert_test_post_checks_all "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP" |
| rm -- "$CHECKSUMTMP" |
| rm -- "$EXT_PERMTMP" |
| rm -- "$EXT_ACLTMP" |
| |
| convert_test_post_rollback |
| } |