btrfs-progs: convert: add raid-stripe-tree to allowed features

The raid-stripe-tree can be enabled for convert, though it's still
considered incomplete and slightly experimental. Due to that the tests
need to be adjusted to check for support and skip mount eventually.

Possible remaining options to add: quota, squota

Issue: #694
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2024-01-31 09:18:08 +01:00
parent 5b344c3e1a
commit 346a381923
8 changed files with 52 additions and 15 deletions

View file

@ -68,7 +68,8 @@ static const struct btrfs_mkfs_features btrfs_convert_allowed_features = {
BTRFS_FEATURE_INCOMPAT_BIG_METADATA |
BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF |
BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA |
BTRFS_FEATURE_INCOMPAT_NO_HOLES,
BTRFS_FEATURE_INCOMPAT_NO_HOLES |
BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE,
.runtime_flags = BTRFS_FEATURE_RUNTIME_QUOTA,
};

View file

@ -214,19 +214,47 @@ convert_test_post_check_checksums() {
grep -q 'FAILED' && _fail "file validation failed"
}
# Check if convert can mount the image based on features
# $1: name of the feature
convert_can_mount() {
local features="$1"
if [ "$features" = 'block-group-tree' ]; then
if ! [ -f "/sys/fs/btrfs/features/block_group_tree" ]; then
_log "Skip mount checks due to missing support of block-group-tree"
return 1
fi
fi
if [ "$features" = 'raid-stripe-tree' ]; then
if ! [ -f "/sys/fs/btrfs/features/raid_stripe_tree" ]; then
_log "Skip mount checks due to missing support of raid-stripe-tree"
return 1
fi
fi
return 0
}
# 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.
# $1: features for mount compatibility checks
# $2: file with checksums
# $3: file with permissions.
# $4: file with acl entries.
convert_test_post_checks_all() {
_assert_path "$1"
local features="$1"
_assert_path "$2"
_assert_path "$3"
_assert_path "$4"
if ! convert_can_mount "$features"; then
return 0
fi
run_check_mount_test_dev
convert_test_post_check_checksums "$1"
convert_test_post_check_permissions "$2"
convert_test_post_check_acl "$3"
convert_test_post_check_checksums "$2"
convert_test_post_check_permissions "$3"
convert_test_post_check_acl "$4"
# Create a large file to trigger data chunk allocation
generate_dataset "large"
@ -285,7 +313,7 @@ convert_test() {
run_check_umount_test_dev
convert_test_do_convert "$features" "$nodesize" "$fstype"
convert_test_post_checks_all "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP"
convert_test_post_checks_all "$features" "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP"
rm -- "$CHECKSUMTMP"
rm -- "$EXT_PERMTMP"
rm -- "$EXT_ACLTMP"

View file

@ -12,7 +12,7 @@ check_kernel_support_acl
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree'; do
convert_test ext2 "$feature" "ext2 4k nodesize" 4096 mke2fs -b 4096
convert_test ext2 "$feature" "ext2 16k nodesize" 16384 mke2fs -b 4096
convert_test ext2 "$feature" "ext2 64k nodesize" 65536 mke2fs -b 4096

View file

@ -12,7 +12,7 @@ check_kernel_support_acl
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree' ; do
convert_test ext4 "$feature" "ext4 4k nodesize" 4096 mke2fs -t ext4 -b 4096
convert_test ext4 "$feature" "ext4 16k nodesize" 16384 mke2fs -t ext4 -b 4096
convert_test ext4 "$feature" "ext4 64k nodesize" 65536 mke2fs -t ext4 -b 4096

View file

@ -38,6 +38,10 @@ do_test() {
convert_test_do_convert "$features" "$nodesize"
if ! convert_can_mount "$features"; then
return 0
fi
run_check_mount_test_dev
convert_test_post_check_checksums "$CHECKSUMTMP"
@ -64,7 +68,7 @@ do_test() {
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree' ; do
do_test "$feature" "ext4 4k nodesize" 4096 mke2fs -t ext4 -b 4096
do_test "$feature" "ext4 16k nodesize" 16384 mke2fs -t ext4 -b 4096
do_test "$feature" "ext4 64k nodesize" 65536 mke2fs -t ext4 -b 4096

View file

@ -15,7 +15,7 @@ prepare_test_dev
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree'; do
convert_test reiserfs "$feature" "reiserfs 4k nodesize" 4096 mkreiserfs -b 4096
convert_test reiserfs "$feature" "reiserfs 16k nodesize" 16384 mkreiserfs -b 4096
convert_test reiserfs "$feature" "reiserfs 64k nodesize" 65536 mkreiserfs -b 4096

View file

@ -40,6 +40,10 @@ do_test() {
convert_test_do_convert "$features" "$nodesize"
if ! convert_can_mount "$features"; then
return 0
fi
run_check_mount_test_dev
convert_test_post_check_checksums "$CHECKSUMTMP"
@ -66,7 +70,7 @@ do_test() {
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree'; do
do_test "$feature" "reiserfs 4k nodesize" 4096 mkreiserfs -b 4096
do_test "$feature" "reiserfs 16k nodesize" 16384 mkreiserfs -b 4096
do_test "$feature" "reiserfs 64k nodesize" 65536 mkreiserfs -b 4096

View file

@ -17,6 +17,6 @@ prepare_test_dev
# Iterate over defaults and options that are not tied to hardware capabilities
# or number of devices. Test only 4K block size as minimum.
for feature in '' 'block-group-tree' ; do
for feature in '' 'block-group-tree' 'raid-stripe-tree'; do
convert_test ntfs "$feature" "ntfs 4k nodesize" 4096 mkfs.ntfs -s 4096
done