1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
|
#!/bin/bash
# helpers for btrfs-convert tests
# 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() {
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 test image with: $@" >> "$RESULTS"
}
# prepare TEST_DEV before conversion, create filesystem and mount it, image
# size is 512MB
# $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
local oldsize
fstype="$1"
shift
# Use device size that was set before, or the default 512M
oldsize=$(stat --format=%s "$TEST_DEV")
if [ -z "$oldsize" ]; then
oldssize=512M
fi
# 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 "$oldsize" "$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_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" status=noxfer
}
# 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 status=noxfer >/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-filelist.XXXXXX)
run_check $SUDO_HELPER dd if=/dev/zero of="$TEST_MNT/test" "bs=$nodesize" \
count=1 status=noxfer >/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-filelist.XXXXXX)
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-perms.XXXXXX)
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-acls.XXXXXXX)
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
# $1: filesystem name or alias (ext2 includes ext3 and ext4),
convert_test_post_rollback() {
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: 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
local CHECKSUMTMP
local EXT_PERMTMP
local EXT_ACLTMP
fstype="$1"
features="$2"
msg="$3"
nodesize="$4"
shift 4
convert_test_preamble "$features" "$msg" "$nodesize" "$@"
convert_test_prep_fs "$fstype" "$@"
populate_fs
CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert-csums.XXXXXX)
EXT_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert-perms.XXXXXX)
EXT_ACLTMP=$(mktemp --tmpdir btrfs-progs-convert-acls.XXXXXX)
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 "$fstype"
}
load_module_reiserfs()
{
$SUDO_HELPER modprobe reiserfs
}
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
}
|